Удаление криво загруженных фоток в ms2Gallery

Не нашел готового решения (может плохо искал) и быстро набросал скрипт для Console.

При импорте фоток всё пошло наперекосяк, и я понял свою ошибку только после кривой заливки всех фоток. Пришлось аккуратно откатывать всё назад чтобы не повредить ранее правильно залитые файлы.

Вылаживаю скрипт для себя и для других, кто так же столкнётся с такой проблемой.

Не претендую на единственно правильное решение — был бы очень рад более быстрому и удобному способу, если вы поделитесь им в комментариях!

Скрипт:
<?php
// Выборка всех дочерних ресурсов для parent
$q = $modx->prepare("SELECT * FROM modx_site_content WHERE parent = 19");
$q->execute();
$r = $q->fetchAll(PDO::FETCH_ASSOC);
print "<b>Всего: ".count($r)."</b>
";

// Перебор ресурсов в цикле
foreach($r as $row){
    $id = $row['id'];
    $status = '';
    
    // Удаление записей о файлах ресурса из базы данных
    $q_del = $modx->prepare("DELETE FROM modx_ms2_resource_files WHERE resource_id='$id'");
    $q_del->execute();
    
    // Проверка если они действительно удалились
    $q2 = $modx->prepare("SELECT * FROM modx_ms2_resource_files WHERE resource_id='$id'");
    $q2->execute();
    
    if(count($q2->fetchAll(PDO::FETCH_ASSOC)) > 0) {
        $status = "- <span style='color:red'>Не удалено</span>";
    } else {
        $status = "- <span style='color:green'>Удалено</span>";
    }

    // Физическое удаление файлов на сервере
    $path = $_SERVER['DOCUMENT_ROOT'].'/assets/images/resources/'.$id;
    removeDirectory($path);

    // Вывод информации на экран
    print $row['pagetitle']." ($id) $status
";
}

// Функция рекурсивного удаления папок и файлов
function removeDirectory($dir) {if ($objs = glob($dir."/*")) {foreach($objs as $obj) {is_dir($obj) ? removeDirectory($obj) : unlink($obj);}}rmdir($dir);}
Василий Столейков
14 июня 2016, 09:39
modx.pro
6
2 002
+2
Поблагодарить автора Отправить деньги

Комментарии: 2

man
man
16 октября 2017, 17:17
+1
$resourceses = $modx->getCollection('modResource', array('parent' => 19));
echo count($resourceses);
foreach ($resourceses as $req) {
	$id = $req->get('id');
        $c = $modx->newQuery('msProductFile');
        $c->command('delete');
        $c->where(array(
		'product_id' => $id, 
	));
	$c->prepare();
	$c->stmt->execute()
	removeDirectory($_SERVER['DOCUMENT_ROOT'].'/assets/images/products/'.$id);
};
// Функция рекурсивного удаления папок и файлов
function removeDirectory($dir) {if ($objs = glob($dir."/*")) {foreach($objs as $obj) {is_dir($obj) ? removeDirectory($obj) : unlink($obj);}}rmdir($dir);}
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
2