К содержанию

как пересохранить 2000 ресурсов ?

Доброго дня, суть вопроса в том как я могу программно пересохранить 2000 ресурсов, понадобилось добавить еще одно поле в которое должно подтягиваться значение ответа от сервера яндекса, но плагин записывает значение при сохранении ресурса, заранее спасибо
Сергей Скат
Сергей Скат
22 января 2015, 10:12
modx.pro
4 176
Реклама

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

Fi1osof
Fi1osof Эксперт
22 января 2015, 15:42
Ставите Console.
Выполняете код:
ini_set('max_execution_time', 0);
ignore_user_abort(true);
$c = 'modResource';
$q = $modx->newQuery($c);
$q->sortby('id');
$q->select(array(
	"{$c}.*",
));
$s = $q->prepare();
$s->execute();
while($row = $s->fetch(2))
	$response = $modx->runProcessor('resource/update', $row);
	if($response->isError()){
		print_r($response->getResponse());
		return;
	}
	$modx->error->reset();
}
Так как у вас документов много, советую сначала прогнать только корневые документы (добавить в запрос $q->where(array('parent' => 0));), а потом по каждому разделу в отдельности, указывая соответствующий parent.
    Сергей Скат
    Сергей Скат Проверенный
    22 января 2015, 16:16
    а нет разделов, спасибо большое !)
      Fi1osof
      Fi1osof Эксперт
      22 января 2015, 16:17
      Ну ОК.
      Пожалуйста.
        Fi1osof
        Fi1osof Эксперт
        22 января 2015, 16:18
        И не забываем про бэкапы:)
          Сергей Скат
          Сергей Скат Проверенный
          22 января 2015, 16:52
          само собой )
        Игорь
        Игорь Старожил
        30 ноября 2017, 09:19
        А если вложенность 5 уровней и больше, и по каждому «пробежаться» — очень долго получается. Как указать один корневой раздел и условие по id шаблона (независимо от уровня вложенности). Не подскажете?
        ====
        То есть раздел, у которого id=2 и внутри него пересохранить все ресурсы, у которых template=4
        ====
        Заранее большое спасибо.
          g0dzilla
          g0dzilla Старожил
          30 ноября 2017, 10:04
          docs.modx.com/xpdo/2.x/class-reference/xpdoquery/xpdoquery.where

          Вообще заметил тендецию, в последнее время, что старые посты некрофилируют. Все давно уже в доках
            Игорь
            Игорь Старожил
            30 ноября 2017, 10:11
            Спасибо. А на конкретном примере как будет выглядеть код? Спасибо
              Игорь
              Игорь Старожил
              30 ноября 2017, 10:28
              Если я правильно понял. Но что-то не работает.
              <?php
              ini_set('max_execution_time', 0);
              ignore_user_abort(true);
              $c = 'modResource';
              $q = $modx->newQuery($c);
              $q->where(array('parent' => 2));
              $q->where(array('template' => 4));
              $q->sortby('id');
              $q->select(array(
              	"{$c}.*",
              ));
              $s = $q->prepare();
              $s->execute();
              while($row = $s->fetch(0))
              	$response = $modx->runProcessor('resource/update', $row);
              	if($response->isError()){
              		print_r($response->getResponse());
              		return;
              	}
              	$modx->error->reset();
                Алексей Ерохин
                Алексей Ерохин Старожил
                30 ноября 2017, 10:40
                $resources = $modx->getChildIds(2, 10, array('context'=>'web'));
                ....
                $q->where(array('id:IN' =>$resources));
                $q->where(array('template' => 4));
                  Игорь
                  Игорь Старожил
                  30 ноября 2017, 10:43
                  Покажусь нубом, но тем не менее… В Console не выполняет
                  <?php
                  ini_set('max_execution_time', 0);
                  ignore_user_abort(true);
                  $c = 'modResource';
                  $q = $modx->newQuery($c);
                  $resources = $modx->getChildIds(2, 10, array('context'=>'web'));
                  $q->where(array('id:IN' =>$resources));
                  $q->where(array('template' => 4));
                  $q->sortby('id');
                  $q->select(array(
                  	"{$c}.*",
                  ));
                  $s = $q->prepare();
                  $s->execute();
                  while($row = $s->fetch(0))
                  	$response = $modx->runProcessor('resource/update', $row);
                  	if($response->isError()){
                  		print_r($response->getResponse());
                  		return;
                  	}
                  	$modx->error->reset();
                  Огромное спасибо за отклик. Но как будет полный вариант выглядеть?
                    Алексей Ерохин
                    Алексей Ерохин Старожил
                    30 ноября 2017, 10:54
                    while($row = $s->fetch(2)) {
                    	$response = $modx->runProcessor('resource/update', $row);
                    	if($response->isError()){
                    		print_r($response->getResponse());
                    		return;
                    	}
                    	$modx->error->reset();
                    }
                    Скобочки фигурные потеряли, и в fetch нужно 2 (PDO::FETCH_ASSOC) указывать, чтобы ассоциативный массив получить
                      Игорь
                      Игорь Старожил
                      30 ноября 2017, 10:58
                      При
                      <?php
                      ini_set('max_execution_time', 0);
                      ignore_user_abort(true);
                      $c = 'modResource';
                      $q = $modx->newQuery($c);
                      $resources = $modx->getChildIds(2, 10, array('context'=>'web'));
                      $q->where(array('id:IN' =>$resources));
                      $q->where(array('template' => 4));
                      $q->sortby('id');
                      $q->select(array(
                      	"{$c}.*",
                      ));
                      $s = $q->prepare();
                      $s->execute();
                      while($row = $s->fetch(0))
                      	$response = $modx->runProcessor('resource/update', $row);
                      	if($response->isError()){
                      		print_r($response->getResponse());
                      		return;
                      	}
                      	$modx->error->reset();
                      }
                      Ругается на синтаксис: Parse error: syntax error, unexpected '}' in .../core/components/console/processors/exec.class.php(24): eval()'d code
                        Алексей Ерохин
                        Алексей Ерохин Старожил
                        30 ноября 2017, 11:00
                        Скобочка фигурная }
                        while($row = $s->fetch(0)) {
                        Посмотрите внимательнее, пожалуйста.
                          Игорь
                          Игорь Старожил
                          30 ноября 2017, 11:08
                          Алексей, благодарю за помощь.
                          Висит и не завершает в Console
                          <?php
                          ini_set('max_execution_time', 0);
                          ignore_user_abort(true);
                          $c = 'modResource';
                          $q = $modx->newQuery($c);
                          $resources = $modx->getChildIds(2, 10, array('context'=>'web'));
                          $q->where(array('id:IN' =>$resources));
                          $q->where(array('template' => 4));
                          $q->sortby('id');
                          $q->select(array(
                          	"{$c}.*",
                          ));
                          $s = $q->prepare();
                          $s->execute();
                          while($row = $s->fetch(0)) {
                          	$response = $modx->runProcessor('resource/update', $row);
                          	if($response->isError()){
                          		print_r($response->getResponse());
                          		return;
                          	}
                          	$modx->error->reset();
                          }
                            Игорь
                            Игорь Старожил
                            30 ноября 2017, 15:03
                            Так и не пойму, в чем проблема. Поправил то, о чем Вы написали, но не работает.
                            <?php
                            ini_set('max_execution_time', 0);
                            ignore_user_abort(true);
                            $c = 'modResource';
                            $q = $modx->newQuery($c);
                            $resources = $modx->getChildIds(2, 10, array('context'=>'web'));
                            $q->where(array('id:IN' =>$resources));
                            $q->where(array('template' => 4));
                            $q->sortby('id');
                            $q->select(array(
                            	"{$c}.*",
                            ));
                            $s = $q->prepare();
                            $s->execute();
                            while($row = $s->fetch(2)) {
                            	$response = $modx->runProcessor('resource/update', $row);
                            	if($response->isError()){
                            		print_r($response->getResponse());
                            		return;
                            	}
                            	$modx->error->reset();
                            }
            Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
            16