yandex icon indicating copy to clipboard operation
yandex copied to clipboard

Несколько последовательных операций

Open plyaskin opened this issue 5 years ago • 3 comments

	$projectNumber = '1546';
	$projectPO = '5668884';
	$projectOldCategory = '1';
	$projectCategory = '2';

	$projectOldFolder = $disk->getResource($projectNumber.' - '.$projectPO.' - '.$projectOldCategory);
	$projectFolder = $disk->getResource($projectNumber.' - '.$projectPO.' - '.$projectCategory);
	$templateProject = $disk->getResource('!Templates/'.$projectCategory);


	foreach ($projectOldFolder->items as $item) { //remove all files in the folder with Category name
		if ($item['type'] == 'file' && str_contains($item['file'],$projectOldCategory))
	  		$item->delete();
	}
	$projectOldFolder->move($projectFolder,true);
	$templateProject->copy($projectFolder,true);

При переименовании/перемещении (move) скрипт перестаёт удалять/копировать, как бы не менял последовательности. Видимо, потому, что процедуры занимают больше времени, чем отработка скрипта и он уходит к следующей функции, как только получил ответ "true".

Возвращаемые значения TRUE или FALSE, а также Arhitector\Yandex\Disk\Operation в случае длительного копирования.

Возможно, решение в последнем, но как его использовать, ума не приложу, есть мысли?

plyaskin avatar Jan 31 '21 10:01 plyaskin

Стоит обратиться к документации api, https://yandex.ru/dev/disk/api/reference/move.html

Непустая папка может перемещаться в течение произвольного времени

Приложения должны самостоятельно следить за статусами запрошенных операций

Проверяйте статус, как сказано в документации о произвольном времени выполнения

if ($operation->getStatus() == Operation::SUCCESS) { ... }

или поменяйте логику приложения

jack-theripper avatar Feb 01 '21 06:02 jack-theripper

Добавил в код echo $deleteFiles->getStatus();

	foreach ($projectOldFolder->items as $item) { //remove all files in the folder with Category name
		if ($item['type'] == 'file' && str_contains($item['file'],$projectOldCategory)) {
	  		$deleteFiles = $item->delete();
	  		echo $deleteFiles->getStatus();
	  	}
	}

Вообще ничего не возращает и каждый раз выпадает с ошибкой 500, либо, если удалять нечего, то просто пустой экран без ошибки. echo $deleteFiles->getStatus(); ставил везде, где только можно, и в цикле, и после. Это уже финальный вариант, пробовал как вы предложили с if, там так же безрезультатно (с getStatusCode тоже самое). Что не так?

plyaskin avatar Feb 01 '21 07:02 plyaskin

Ошибка 500? так включите вывод ошибок и используйте отладку.

Метод delete может возвращать как boolean, так и объект Operation. Если над ресурсом выполняется операция, то он "заблокирован" и api не сможет его переместить, например. Это не ошибка библиотеки, изучайте документацию. В документации описано, время выполнения может быть произвольным. И кстати, библиотека выбрасывает исключения когда яндекс диск возвращает ошибку, вам стоит их обрабатывать в try/catch

jack-theripper avatar Feb 01 '21 07:02 jack-theripper