Пример функции, которая извлекает файлы из архива, при этом переименовывая их, если в папке назначения уже есть файлы с таким именем. 

function extractZip($zipFilePath, $folderToExtract) 
{
$zipArchive = new ZipArchive();
$result = $zipArchive->open($zipFilePath);
if ($result === TRUE) {
for ($i = 0; $i < $zipArchive->numFiles; $i++) {
$filename = $zipArchive->getNameIndex($i);
$filePath = $folderToExtract. '/' . $filename;
if (file_exists($filePath)) {
$fileInfo = pathinfo($filename);
$newFileName = $fileInfo['filename'] . '_(copy).' . $fileInfo['extension'];
copy("zip://" . $zipFilePath . "#" . $filename, $folderToExtract . '/' . $newFileName);
} else {
copy("zip://" . $zipFilePath. "#" . $filename, $filePath);
}
}
$zipArchive->close();
}
}

Параметры функции: 

$zipFilePath - путь до zip файла

$folderToExtract - путь до папки, куда нужно распаковать архив. 

 

Стоит учитывать, что функция не проверена на вложенных архивах и на вложенных папках. 

Функция, позволяющая извлечь файлы из zip архива в указанную папку:


function extractZip($filePath, $extractTo){
$zip = new ZipArchive();
$result = $zip->open($filePath);
if ($result === TRUE) {
$zip->extractTo($extractTo);
$zip->close();
}
return $result;
}

$file = 'myfile.zip'; // поменять на путь до вашего файла
$folder = 'myfolder'; // поменять на путь до папки, куда нужно извлечь файлы

extractZip($file, $folder);

Примечание: нужна библиотека zlib

 

Чтобы удалить директорию с помощью PHP, сначала необходимо удалить внутри нее все имеющиеся файлы. 

Для этих целей можно использовать данную функцию:

public function removeDirectory($dir): bool
{
$files = array_diff(scandir($dir), array('.', '..'));
foreach ($files as $file) {
(is_dir("$dir/$file")) ? $this->removeDirectory("$dir/$file") : unlink("$dir/$file");
}
return rmdir($dir);
}

Если вы столкнулись с ошибкой "Refused to execute script, strict MIME type checking is enabled", то как правило дело в том, что у вас не правильный URL. 

В первую очередь перепроверьте путь, пот которому пытаетесь подключить скрипт. Возможно у вас задан относительный путь или что-то еще. Попробуйте напрямую из консоли открыть скрипт - и если он открывается - тогда возможно стоит искать ошибку где-то еще, но в большинстве случаев ошибка как раз в не правильном URL. 

Чтобы поменять размер popup с помощью JavaScript, достаточно 1 строки кода:

window.resizeTo(width,height);

где width - новая ширина окна, height - новая высота окна

Пример, где окно становится размером 800*600:

window.resizeTo(800,600);

Рассмотрим пример, как можно получить размеры картинки, зная ее URL. 

Идея такая - создаем объект Image, которому присваиваем ссылку и потом после загрузки узнаем ширину и высоту. 

Пример:

const img = new Image();
img.src = 'http://mysite.com/myimage.gif'; // url замените на свой
img.onload = function() {
console.log(this.width);
console.log(this.height);
}

Данный пример должен вывести в консоль ширину и высоту картинки, которую вы укажите в URL. 

Рассмотрим на примере. Данный код кликнет на текст, содержащий слово "тест". Единственное уточнение - элемент должен быть кликабельный. 

$client = Client::createChromeClient();
$client->request('GET', 'https://testsite.ru/'); //заходим на сайт
$client->findElement(WebDriverBy::xpath("//*[contains(text(),'тест')]"))->click();
$client->close();

Чтобы сделать скриншот страницы в Symfony Panther, достаточно всего нескольких строк кода.

$client = Client::createChromeClient();
$client->request('GET', 'https://podelitsa.ru/'); //заходим на сайт
$client->takeScreenshot('screen1.png'); //делаем скриншот
$client->close();

Допустим, есть список и  с помощью filterXPath необходимо выбрать определенный пункт из этого списка для последующего на нем клика.

Рассмотрим как это сделать.

Список: 

<select id="mylist">
<option value="1">111</option>
<option value="2">222</option>
<option value="3">333</option>
</select>

Код для получения нужного элемента (в данном примере выбирается элемени списка где option value="2"): 

$input = $crawler->filterXPath(".//select[@id='mylist']//option[@value='2']"); // выбираем список на странице по id, а затем нужный option по значению value
$input ->click();

Пример, как можно получить HTML код загруженной страницы при использовании PantherCrawler:

$client = Client::createChromeClient();
$client->request('GET', $url);
print_r($client->getCrawler()->html()); // html код загруженной страницы

При выполнении запроса INSERT, взятого из какой-либо другой базы, вполне реально столкнуться с ошибкой “Дублирующаяся запись 'ххх' по ключу 'PRIMARY' при INSERT”. Это значит, что запись с таким первичным ключом уже есть в вашей базе, поэтому вставить в таблицу такую запись нельзя. Можно конечно удалить вручную такой запрос, чтобы скрипт продолжил свое выполнение без него, но что делать, если запросов тысячи? Перебирать все вручную, удаляя дубликаты - не лучшая идея. 

Есть несколько решений данной проблемы. 

  1. INSERT  автоматически заменить у всех запросов  на INSERT IGNORE. В таком случае такие дубликаты будут просто игнорироваться. 
  2. В конце запроса добавить приписку ON DUPLICATE KEY UPDATE. Если будет найден дубликат - то существующая запись будет обновлена новой информацией. 

 

Если вам нужно сделать так, чтобы пользователь не мог в Datepicker  выбрать дату, которая еще не наступила, то есть 2 простых способа это сделать. 

При инициализации Datepicker необходимо добавить параметр maxDate со значением 0 или текущей даты new Date()

Примеры: 

 $(function() {
$( "#mydate" ).datepicker({ maxDate: new Date() });
});

Альтернатива: 

$(function() {
$( "#mydate" ).datepicker({ maxDate: 0 });
});

Ошибка "java.lang.IllegalStateException: Cannot access database on the main thread since it may potentially lock the UI for a long period of time" встречается потому, что если делать запросы в базу в основном потоке, можно “повесить” основной интерфейс.

Запросы в базу лучше делать асинхронно, к примеру используя lifecycleScope. 

В build.gradle добавить androidx.lifecycle:lifecycle-runtime:

implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.5.1"

В классе, где нужно делать запросы в базу, обернуть запрос  в “lifecycleScope.launch(Dispatchers.IO) {}”:

lifecycleScope.launch(Dispatchers.IO) {
// запросы в базу, к примеру:
myclassDao.getAll()
}

  1. Запустите приложение на телефоне (версия API - 26 или выше)
  2. В Android Studio в меню выберите View > Tool Windows > App Inspection
  3. Внизу появился App Inspector. Активируйте там вкладку Database Inspector
  4. Выберите устройство и приложение