При обновлении дополнений MODX всегда оставляет предыдущую версию пакета на случай, если вам придется вернуться к ней по тем или иным причинам. Новый пакет также загружается в папку /core/packages/. Кроме того, в таблицу «modx_transport_packages» добавляется новая запись.
Многие дополнения обновляются достаточно часто, и в указанной папке со временем накапливается значительное количество версий компонентов. Вручную удалять их не следует, записи в таблице останутся по-любому. Но MODX имеет встроенный функционал для корректного удаления устаревших версий.
Избавиться от них несложно. Делается это таким образом: идем в «Приложения – Установщик». У нужного нам дополнения нажимаем на кнопку «Посмотреть детали». В открывшемся окне переходим на вкладку «Загруженная версия». На вкладке отобразится список всех загруженных версий пакета.
Более старые версии показываются внизу, более новые – выше. Для удаления пакета нажимаем правой кнопкой мыши на нужной строке и выбираем «Удалить версию пакета». Удаляем так все устаревшие версии, причем по порядку, но снизу вверх, начиная с самых старых.
При большом количестве версий дополнений, особенно если самих дополнений много, процесс может показаться затратным по времени. Но выход есть.
Скрипт следует загрузить в корневую директорию сайта и запустить. Он выберет все установленные версии, кроме последней, и корректно удалит их через родной процессор.
<?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 ''; } $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 ''; }
Если вы ранее уже удаляли файлы в core/packages/ вручную, скрипт сгенерирует ошибки. Внимания на это можно не обращать внимание, скрипт все равно в любом случае произведет очистку записей в таблице пакетов.
Удаление пакетов указанными способами производится максимально корректно. Удаляются как сами пакеты, так и записи базы данных.