Как удалить из корзины ~90 000 ресурсов?

Здравствуйте. Через batcher отметил на удаление примерно 90 000 ресурсов, но теперь кнопочка удаления из корзины не срабатывает.
Подскажите пожалуйста, как составить правильно SQL что бы удаляя он не порушил связи в MODx или может быть плагин существует для этого какой нибудь?
Михаил
08 декабря 2016, 12:15
modx.pro
1
3 378
0

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

Алексей Ерохин
08 декабря 2016, 17:19
0
Насчет плагина не знаю.
Сам подчищал таблицы следующим образом:
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
    Воеводский Михаил
    08 декабря 2016, 19:23
    +2
    Один из наиболее простых способов точно не порушить связи — сделать консольный скрипт удаления из корзины, используя $modx->getIterator().

    Набросок кода для примера:

    $resources = $modx->getIterator('modResource', array('deleted' => 1));
    foreach($resources as $res) {
    	$res->remove();
    }
      Павел Гвоздь
      08 декабря 2016, 20:36
      1
      0
      Из консоли лучше воспользоваться процессором для этого дела. Там и 2 события плагина сработают: OnBeforeEmptyTrash и OnEmptyTrash.

      $modx->runProcessor('resource/emptyrecyclebin');
        Воеводский Михаил
        08 декабря 2016, 20:47
        0
        Павел, на недавней задаче на 19 000 ресурсов процессор ты решил не использовать :) Здесь, на 90 000 аналогично имеет смысл сделать. Можно и полностью скрипт выложить, облегчить жизнь.
          Павел Гвоздь
          08 декабря 2016, 21:12
          2
          +2
          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);

          :) Нет же, я проверил — с процессором работает, поэтому решил реализовать через процессор.
            Воеводский Михаил
            08 декабря 2016, 22:26
            0
            Странно, ибо перед своим комментом я проверил указанный тобой ранее скрипт — там использовался getIterator )
              Fi1osof
              09 декабря 2016, 06:16
              0
              Этот процессор используется getCollection. В большинстве случаев это не позволит за раз сделать выборку 90к ресурсов (только если там не куча памяти).
              Я пользуюсь подобным: modx.pro/help/10524/#comment-71823
        Михаил
        09 декабря 2016, 08:26
        0
        Большое спасибо, буду пробовать.
          Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
          8