Смена родительского ресурса по расписанию

Здравствуйте. Подскажите пожалуйста, как сделать автоматический перенос ресурса из одного родителя в другой, по расписанию. К примеру есть ресурсы в родителе с id 5, нужно что бы, допустим, по наступлении даты отмены публикации он переносился в родитель под id 7.
Ростислав
03 января 2018, 12:32
modx.pro
2
1 364
0

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

Андрей
04 января 2018, 00:15
+1
Как мне видится решение, создать файл с примерно таким кодом:

require_once '/absolute/path/to/modx/config.core.php';
require_once MODX_CORE_PATH.'model/modx/modx.class.php';
$modx = new modX();
$modx->initialize('web');
$modx->getService('error','error.modError', '', '');

$res = $modx->getIterator('modResource', ['parent' => 5]);

foreach ($res as $r) {
	$pub = $r->get('published');
	if ($pub == 0) {
		$r->set('parent', 7);
           	$r->save();
	}
}

И повесить это дело на cron, либо использовать готовое решение — Scheduler.

p.s. Подключение API во внешнем файле брал из документации — Loading MODX Externally, работоспособность не проверял. Сам код смены родителя возможно не идеальный, но рабочий 100% :)
    Сергей Шлоков
    04 января 2018, 08:45
    0
    Сам код смены родителя возможно не идеальный, но рабочий 100%
    Задача легко решается одним запросом на UPDATE.
      Ростислав
      04 января 2018, 14:58
      0
      Пытаюсь через Scheduler запустить. Но не срабатывает задание уходит в просроченные.
        Андрей
        04 января 2018, 15:12
        +1
        Посмотрите лог ошибок на всякий случай. Scheduler пользуюсь регулярно, должно всё работать. В этой строчке прописали путь к config.core?

        require_once '/absolute/path/to/modx/config.core.php';

        Либо попробуйте просто сделать задание для cron в панели хостинга.
          Ростислав
          04 января 2018, 15:25
          0
          Логи пустые. Адрес поменял. Подскажите как правильно ссылку на файл указать в Scheduler. Нужна полная ссылка или только название файла который лежит в папке пространства имен?
          При попытке запуска через cron (что приоритетнее т.к. там можно задать ежедневный запуск, а в Scheduler я такого не нашел.) он говорит что доступ к файлу запрещен. Еще заметил что у меня нет файла modx.class.php.
            Ростислав
            04 января 2018, 15:37
            0
            С cron разобрался. Просто я дурак забыл права на исполнение файла дать. Вот что выдает cron:
            /var/www/user6056/data/www/mfp.pp.ua/untitled.php: line 1: require_once: command not found
            /var/www/user6056/data/www/mfp.pp.ua/untitled.php: line 2: require_once: command not found
            /var/www/user6056/data/www/mfp.pp.ua/untitled.php: line 3: syntax error near unexpected token `('
            /var/www/user6056/data/www/mfp.pp.ua/untitled.php: line 3: `$modx = new modX();'
              Андрей
              04 января 2018, 15:41
              +1
              Файл modx.class.php должен быть доступен по пути — core/model/modx/modx.class.php.
              Возможно глупый вопрос, но в файле есть открывающий тег php? :)

              <?php
              тут дальше код...
                Ростислав
                04 января 2018, 15:44
                0
                Есть но с ним cron выдает ошибку в первой строке:
                /var/www/user6056/data/www/mfp.pp.ua/untitled.php: line 1: ?php: No such file or directory
                  Андрей
                  04 января 2018, 16:00
                  +1
                  Попробуйте так:

                  <?php
                  define('MODX_API_MODE', true);
                  require 'index.php';
                  
                  $modx->getService('error','error.modError');
                  $modx->setLogLevel(modX::LOG_LEVEL_INFO);
                  $modx->setLogTarget(XPDO_CLI_MODE ? 'ECHO' : 'HTML');
                  
                  $res = $modx->getIterator('modResource', ['parent' => 2]);
                  
                  foreach ($res as $r) {
                  	$pub = $r->get('published');
                  	if ($pub == 0) {
                  		$r->set('parent', 1);
                             	$r->save();
                  	}
                  }

                  Здесь подключил API так как описано здесь — Как работать с MODX Api. Проверил на modhost, всё работает. Parent-ы только свои подставляйте.
                    Ростислав
                    04 января 2018, 16:04
                    0
                    Почему то крону не нравиться <?php
                    /var/www/user6056/data/www/mfp.pp.ua/untitled.php: line 1: ?php: No such file or directory
                    /var/www/user6056/data/www/mfp.pp.ua/untitled.php: line 2: syntax error near unexpected token `'MODX_API_MODE','
                    /var/www/user6056/data/www/mfp.pp.ua/untitled.php: line 2: `define('MODX_API_MODE', true);'
                      Андрей
                      04 января 2018, 16:13
                      +1
                      А покажите строку cron, как вы вызываете скрипт. Возможно надо как то так:

                      php /path/to/script/script.php

                      Или попробуйте написать в техподдержку хостинга.
                        Ростислав
                        04 января 2018, 16:33
                        0
                        В таком виде cron не присылает отчет о выполнении скрипта. И ресурсы не переносятся в другого родителя.
                          Ростислав
                          04 января 2018, 16:43
                          0
                          Вот тут есть скрипт который выполняется при наступлении даты отмены публикации. Я пробовал его использовать, но он не работает
                            Андрей
                            04 января 2018, 16:56
                            +1
                            Там для Evo скрипт, можно переписать под Revo.

                            В таком виде cron не присылает отчет о выполнении скрипта. И ресурсы не переносятся в другого родителя.

                            Так дело в том, что у вас cron получается не выполняет php, напишите в поддержку хостинга. Попробую протестировать у себя сразу с cron, напишу позже о результатах.
                            Ростислав
                            04 января 2018, 17:36
                            0
                            А Scheduler через cron работает? Потому что он у меня не хочет работать. Все уходит в просроченные.
                            Ростислав
                            04 января 2018, 19:06
                            0
                            Вот что в поддержке сказали:
                            «уведомление приходит только в случае, если команда что-то возвращает
                            если скрипт молча отработал, уведомление не высылается»
                            По при этом родитель не меняется у ресурсов.
                            Ростислав
                            04 января 2018, 19:33
                            +1
                            Все работает. Не работало из за моей невнимательности. Я не обратил внимание на то что в скрипте прописано что переносятся только снятые с публикации ресурсы. И с Scheduler разобрался, он не работал из за того что я не прописал cron для файла run.php. Спасибо огромное за помощь.
        Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
        17