Смена родительского ресурса по расписанию
Здравствуйте. Подскажите пожалуйста, как сделать автоматический перенос ресурса из одного родителя в другой, по расписанию. К примеру есть ресурсы в родителе с id 5, нужно что бы, допустим, по наступлении даты отмены публикации он переносился в родитель под id 7.
Комментарии: 17
Как мне видится решение, создать файл с примерно таким кодом:
И повесить это дело на cron, либо использовать готовое решение — Scheduler.
p.s. Подключение API во внешнем файле брал из документации — Loading MODX Externally, работоспособность не проверял. Сам код смены родителя возможно не идеальный, но рабочий 100% :)
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% :)
Сам код смены родителя возможно не идеальный, но рабочий 100%Задача легко решается одним запросом на UPDATE.
Пытаюсь через Scheduler запустить. Но не срабатывает задание уходит в просроченные.
Посмотрите лог ошибок на всякий случай. Scheduler пользуюсь регулярно, должно всё работать. В этой строчке прописали путь к config.core?
Либо попробуйте просто сделать задание для cron в панели хостинга.
require_once '/absolute/path/to/modx/config.core.php';
Либо попробуйте просто сделать задание для cron в панели хостинга.
Логи пустые. Адрес поменял. Подскажите как правильно ссылку на файл указать в Scheduler. Нужна полная ссылка или только название файла который лежит в папке пространства имен?
При попытке запуска через cron (что приоритетнее т.к. там можно задать ежедневный запуск, а в Scheduler я такого не нашел.) он говорит что доступ к файлу запрещен. Еще заметил что у меня нет файла modx.class.php.
При попытке запуска через cron (что приоритетнее т.к. там можно задать ежедневный запуск, а в Scheduler я такого не нашел.) он говорит что доступ к файлу запрещен. Еще заметил что у меня нет файла modx.class.php.
С 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();'
Файл modx.class.php должен быть доступен по пути — core/model/modx/modx.class.php.
Возможно глупый вопрос, но в файле есть открывающий тег php? :)
Возможно глупый вопрос, но в файле есть открывающий тег php? :)
<?php
тут дальше код...
Есть но с ним cron выдает ошибку в первой строке:
/var/www/user6056/data/www/mfp.pp.ua/untitled.php: line 1: ?php: No such file or directory
Попробуйте так:
Здесь подключил API так как описано здесь — Как работать с MODX Api. Проверил на modhost, всё работает. Parent-ы только свои подставляйте.
<?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-ы только свои подставляйте.
Почему то крону не нравиться <?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);'
А покажите строку cron, как вы вызываете скрипт. Возможно надо как то так:
Или попробуйте написать в техподдержку хостинга.
php /path/to/script/script.php
Или попробуйте написать в техподдержку хостинга.
В таком виде cron не присылает отчет о выполнении скрипта. И ресурсы не переносятся в другого родителя.
Вот тут есть скрипт который выполняется при наступлении даты отмены публикации. Я пробовал его использовать, но он не работает
Там для Evo скрипт, можно переписать под Revo.
Так дело в том, что у вас cron получается не выполняет php, напишите в поддержку хостинга. Попробую протестировать у себя сразу с cron, напишу позже о результатах.
В таком виде cron не присылает отчет о выполнении скрипта. И ресурсы не переносятся в другого родителя.
Так дело в том, что у вас cron получается не выполняет php, напишите в поддержку хостинга. Попробую протестировать у себя сразу с cron, напишу позже о результатах.
А Scheduler через cron работает? Потому что он у меня не хочет работать. Все уходит в просроченные.
Вот что в поддержке сказали:
«уведомление приходит только в случае, если команда что-то возвращает
если скрипт молча отработал, уведомление не высылается»
По при этом родитель не меняется у ресурсов.
«уведомление приходит только в случае, если команда что-то возвращает
если скрипт молча отработал, уведомление не высылается»
По при этом родитель не меняется у ресурсов.
Все работает. Не работало из за моей невнимательности. Я не обратил внимание на то что в скрипте прописано что переносятся только снятые с публикации ресурсы. И с Scheduler разобрался, он не работал из за того что я не прописал cron для файла run.php. Спасибо огромное за помощь.
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.