Удаление старых версий пакетов
        Многие пользователи знают, что MODX хранит кучу старых версий дополнений, чтобы вы могли откатиться на них в любое время.
Но, это требуется крайне редко, а место пакеты занимают. Их можно удалять вручную, но это довольно утомительно, поэтому я набросал несложный консольный скрипт для автоматического удаления.
Скрипт нужно положить в корневую директорию и запустить. Он выберет все установленные версии, кроме самой последней, и корректно удалит их через родной процессор.
Судя по коду этого процессора, никак повредить системе он не может, потому что деинсталляцию самого пакета не делает, а только удаляет файлы версии. Но, в любом случае, использовать на свой страх и риск!
Если вы уже вручную удаляли файлы в core/packages, то скрипт будет генерировать ошибки об этом — на них можно не обращать внимание, он в любом случае почистит записи в таблице пакетов.
    
    
                                                                                
            Но, это требуется крайне редко, а место пакеты занимают. Их можно удалять вручную, но это довольно утомительно, поэтому я набросал несложный консольный скрипт для автоматического удаления.
Скрипт нужно положить в корневую директорию и запустить. Он выберет все установленные версии, кроме самой последней, и корректно удалит их через родной процессор.
Судя по коду этого процессора, никак повредить системе он не может, потому что деинсталляцию самого пакета не делает, а только удаляет файлы версии. Но, в любом случае, использовать на свой страх и риск!
<?php
define('MODX_API_MODE', true);
require 'index.php';
$modx->getService('error', 'error.modError');
$modx->setLogLevel(modX::LOG_LEVEL_ERROR);
$modx->setLogTarget('ECHO');
if (!XPDO_CLI_MODE) {
    echo '<pre>';
}
$c = $modx->newQuery('transport.modTransportPackage');
$c->select('package_name');
$c->groupby('package_name');
if ($c->prepare() && $c->stmt->execute()) {
    while ($package = $c->stmt->fetchColumn()) {
        $c2 = $modx->newQuery('transport.modTransportPackage', ['package_name' => $package]);
        $c2->where(['installed:!=' => '0000-00-00 00:00:00']);
        $c2->sortby('installed', 'desc');
        $c2->limit(1000, 1);
        $c2->select('signature');
        if ($c2->prepare() && $c2->stmt->execute()) {
            while ($signature = $c2->stmt->fetchColumn()) {
                $res = $modx->runProcessor('workspace/packages/version/remove', ['signature' => $signature]);
                if (!$res->isError()) {
                    echo $signature . " removed!\n";
                    ob_flush();
                } else {
                    $modx->log(modX::LOG_LEVEL_ERROR, "Could not remove {$signature}:" . $res->getMessage());
                }
            }
        }
    }
}
if (!XPDO_CLI_MODE) {
    echo '</pre>';
}Если вы уже вручную удаляли файлы в core/packages, то скрипт будет генерировать ошибки об этом — на них можно не обращать внимание, он в любом случае почистит записи в таблице пакетов.
Комментарии: 9
                Круто, спасибо, очень нужная вещь!
А то каждый раз приходилось удалять все старые пакеты, а при возвращении в менеджер пакетов не запоминалась пагинация и снова нужно было листать до следующего компонента…
А этот скрипт можно повесить на крон.
                    А то каждый раз приходилось удалять все старые пакеты, а при возвращении в менеджер пакетов не запоминалась пагинация и снова нужно было листать до следующего компонента…
А этот скрипт можно повесить на крон.
                Почему нет?            
                    
                )))) ага, я знаю, вообще-то это было утверждение, а не вопрос. Не заметил этой мысли в статье и решил дополнить. )))            
                    
                Сорри, не с той интонацией прочитал.            
                    
                Супер, спасибо!            
                    
                Хорошо бы в установщик пакетов кнопку добавить — удалить все старые пакеты.
На крон вешать не стоит — прежде чем удалять старое нужно убедиться, что новое корректно работает, а это можно сделать только осмысленно, а не автоматом.
                    На крон вешать не стоит — прежде чем удалять старое нужно убедиться, что новое корректно работает, а это можно сделать только осмысленно, а не автоматом.
                Чего-то я с утра туплю
Я так понял, что скрипт можно запустить из Консоли. Но вот не понял, в виде чего его положить в корень и как запускать (если не копированием кода в консоль)? Как плагин? Или как Сниппет, а потом на тестовой страничке его вызвать?
                    Я так понял, что скрипт можно запустить из Консоли. Но вот не понял, в виде чего его положить в корень и как запускать (если не копированием кода в консоль)? Как плагин? Или как Сниппет, а потом на тестовой страничке его вызвать?
                Если в таком виде как в посте, то можно в виде файла и его запустить напрямую.
В версиях 2.7.* это уже не актуально — есть кнопка:
            
                    В версиях 2.7.* это уже не актуально — есть кнопка:
            
                Спасибо! Только-только переехал на 2.7.2, поэтому не знаю еще много            
                    
                            Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.