Массовое редактирование tv

Возникла необходимость отредактировать 4 tv у 50 000 ресурсов.
Пытаюсь через console сделать так:
<?php
$pages = $modx->getIterator('modResource', ['parent:IN' => [8888]]);

foreach ($pages as $p) {
  $alias = $p->getTVValue('tv_name_1');	
  $alias = str_replace('value_1','value_2',$alias);
  $p->setTVValue('tv_name_1', $alias);
  $p->save();
}
Всего у каждого ресурса по 4 таких tv. То есть для каждой родительской категории такой код через console приходится запускать по 4 раза, что является далеко не лучшим решением.
Пробовал вместо
['parent:IN' => [8888]]
использовать
['template:IN' => [8]]
, но ресурсов 50 000 и все зависает.

Может кто-нибудь знает лучший способ редактирования?
Сергей
13 ноября 2019, 18:00
modx.pro
515
0

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

Александр
13 ноября 2019, 18:18
0
Ну во первых, можно сделать скрипт который будет работать в ssh сессии и там нет ограничений на время выполнения.
Во вторых, console умеет выполнять код много раз. Как здесь ilyaut.ru/cheats/to-rebuild-all-previews-of-products/
В смысле, ставите limit и offset в запрос. offset пишете в сессию и читаете его из нее.
$_SESSION['Console']['completed'] = false;
показывает console, что код нужно повторить.
    Алексей Ерохин
    13 ноября 2019, 18:24
    +1
    Попробуйте просто sql
    $q= "UPDATE `site_tmplvar_contentvalues` SET `value` = REPLACE(`value`, 'value_1', 'value_2') WHERE `tmplvarid` = ID_TV AND `contentid` IN (SELECT `id` FROM site_content WHERE parent = 8888)";
        $q = $modx->prepare($q);
        $q->execute();
    Либо это запрос напрямую в каком-нибудь phpmyadmin
    Префикс к таблицам добавьте и id tv
    Ну и протестируйте не на боевом сервере
      Сергей
      13 ноября 2019, 18:51
      0
      Спасибо! Но там внутри
      parent = 8888
      еще 3 уровня родителей.
        Александр
        13 ноября 2019, 19:00
        0
        $q= «UPDATE `site_tmplvar_contentvalues` SET `value` = REPLACE(`value`, 'value_1', 'value_2') WHERE `tmplvarid` = ID_TV AND `contentid` IN (SELECT `id` FROM site_content WHERE template= 8)»;
      Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
      4