Как удалить из корзины ~90 000 ресурсов?
Здравствуйте. Через batcher отметил на удаление примерно 90 000 ресурсов, но теперь кнопочка удаления из корзины не срабатывает.
Подскажите пожалуйста, как составить правильно SQL что бы удаляя он не порушил связи в MODx или может быть плагин существует для этого какой нибудь?
Подскажите пожалуйста, как составить правильно SQL что бы удаляя он не порушил связи в MODx или может быть плагин существует для этого какой нибудь?
Комментарии: 8
Насчет плагина не знаю.
Сам подчищал таблицы следующим образом:
Советую проверить на тестовой таблице
Для ознакомления процессор очистки корзины:
github.com/modxcms/revolution/blob/2.x/core/model/modx/processors/resource/emptyrecyclebin.class.php
Сам подчищал таблицы следующим образом:
DELETE FROM `modx_site_content` WHERE `deleted`=1
//очищаем TV
DELETE FROM `modx_site_tmplvar_contentvalues` WHERE `contentid` NOT IN (SELECT `id` FROM `modx_site_content`)
//очищаем группы ресурсов, если необходимо
DELETE FROM `modx_document_groups`WHERE `document` NOT IN (SELECT `id` FROM `modx_site_content`)
Соответствующим образом стоит подчистить таблицы которые связаны foreign ключами с modx_site_content от других компонентов (minishop, например)Советую проверить на тестовой таблице
Для ознакомления процессор очистки корзины:
github.com/modxcms/revolution/blob/2.x/core/model/modx/processors/resource/emptyrecyclebin.class.php
Один из наиболее простых способов точно не порушить связи — сделать консольный скрипт удаления из корзины, используя $modx->getIterator().
Набросок кода для примера:
Набросок кода для примера:
$resources = $modx->getIterator('modResource', array('deleted' => 1));
foreach($resources as $res) {
$res->remove();
}
Из консоли лучше воспользоваться процессором для этого дела. Там и 2 события плагина сработают: OnBeforeEmptyTrash и OnEmptyTrash.
$modx->runProcessor('resource/emptyrecyclebin');
Павел, на недавней задаче на 19 000 ресурсов процессор ты решил не использовать :) Здесь, на 90 000 аналогично имеет смысл сделать. Можно и полностью скрипт выложить, облегчить жизнь.
define('MODX_API_MODE', true);
do {
$dir = dirname(!empty($file) ? dirname($file) : __FILE__);
$file = $dir . '/index.php';
$i = isset($i) ? --$i : 10;
} while ($i && !file_exists($file));
if (file_exists($file)) {
require_once $file;
}
$modx->getService('error', 'error.modError');
$modx->getRequest();
$modx->setLogLevel(modX::LOG_LEVEL_ERROR);
$modx->setLogTarget('FILE');
$modx->error->message = null;
$modx->lexicon->load('default');
$output = $modx->lexicon('failure');
$response = $modx->runProcessor('resource/emptyrecyclebin');
if (!empty($response->response) && $response->response['success']) {
$output = $modx->lexicon('success');
}
exit($output);
:) Нет же, я проверил — с процессором работает, поэтому решил реализовать через процессор.
Странно, ибо перед своим комментом я проверил указанный тобой ранее скрипт — там использовался getIterator )
Этот процессор используется getCollection. В большинстве случаев это не позволит за раз сделать выборку 90к ресурсов (только если там не куча памяти).
Я пользуюсь подобным: modx.pro/help/10524/#comment-71823
Я пользуюсь подобным: modx.pro/help/10524/#comment-71823
Большое спасибо, буду пробовать.
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.