Последние добавленные ресурсы – при копировании ресурса
Здравствуйте. На сайте есть выборка ресурсов по дате их создание – то есть на выходе мы получаем последние добавленные товары.
Это работает если каждый раз создавать новый ресурс. Но, наполнять сайт куда удобнее копированием ресурса, потому что многие поля практически не приходится редактировать, в моем случае, это быстрее в несколько раз. Но в таком случае, у ресурса копируется и дата его создания, и ресурс не выводится как новый. В таблице site_content нет поля, которое бы фиксировала временную метку, когда ресурс был скопирован. Есть метка, когда ресурс редактировался, но она не подходит, потому что ресурсы редактируются часто, но при этом новыми они не становятся. Подскажите пожалуйста, как быть? Может кто-то уже решал подобную задачу?
Это работает если каждый раз создавать новый ресурс. Но, наполнять сайт куда удобнее копированием ресурса, потому что многие поля практически не приходится редактировать, в моем случае, это быстрее в несколько раз. Но в таком случае, у ресурса копируется и дата его создания, и ресурс не выводится как новый. В таблице site_content нет поля, которое бы фиксировала временную метку, когда ресурс был скопирован. Есть метка, когда ресурс редактировался, но она не подходит, потому что ресурсы редактируются часто, но при этом новыми они не становятся. Подскажите пожалуйста, как быть? Может кто-то уже решал подобную задачу?
Комментарии: 8
Как вариант можно попробовать сделать плагин на событие onDocFormPrerender:
Тут при загрузке формы редактора проверяется сколько у родителя данного ресурса дочек с таким же pagetitle (при копировании кнопкой «Копировать» он такой же как у исходника). Если больше одного, то переписывает createdon в соответствии с текущим моментом.
При копировании через ПКМ в дереве не сработает, но по кнопке должен.
<?php
$co = $modx->getCount('modResource', array('pagetitle' => $resource->get('pagetitle'), 'parent' => $resource->get('parent')));
if($co > 1){
$resource->set('createdon', time(now));
$resource->save();
}
Тут при загрузке формы редактора проверяется сколько у родителя данного ресурса дочек с таким же pagetitle (при копировании кнопкой «Копировать» он такой же как у исходника). Если больше одного, то переписывает createdon в соответствии с текущим моментом.
При копировании через ПКМ в дереве не сработает, но по кнопке должен.
Спасибо за ответ. Но не работает. Возможно просто у копированного ресурса, его pagetitle еще не в базе, пока его не сохранишь?
Уже есть. Там сразу запись в базе создается и объект $resource присутствует со всеми полями. Можете в phpMyAdmin посмотреть или через лог проверить:
$co = $modx->getCount('modResource', array('pagetitle' => $resource->get('pagetitle'), 'parent' => $resource->get('parent')));
if($co > 1){
$resource->set('createdon', time(now));
$resource->save();
$modx->log(modX::LOG_LEVEL_ERROR, $resource->get('pagetitle')); // проверка
}
Я попробовал через консоль, на конкретном ресурсе
В $co лежит 2, то есть условие срабатывает
Ругается на time(now)
$resource = $modx->getObject('modResource',array(
'id' => 1699
));
$co = $modx->getCount('modResource', array('pagetitle' => $resource->get('pagetitle'), 'parent' => $resource->get('parent')));
echo $co;
if($co > 1){
$resource->set('createdon', time(now));
$resource->save();
}
1699 — это ID копии;В $co лежит 2, то есть условие срабатывает
Ругается на time(now)
[2018-06-05 17:01:58] (WARN @ /home/s6828/www/core/components/console/processors/exec.class.php(24): eval()'d code: 12)
PHP notice: Use of undefined constant now — assumed 'now'
Сделайте без now:
time();
Все работает, спасибо
Привязывать по тайтлу не есть корректно, да и зачем, если есть:OnResourceDuplicate
События нет в офф документации, но оно отлично отрабатывает.
События нет в офф документации, но оно отлично отрабатывает.
<?php
switch ($modx->event->name) {
case 'OnResourceDuplicate':
$resource = & $modx->event->params['newResource'];
$old = & $modx->event->params['oldResource'];
/* А тут можем делать что угодно уже с объектами класса modResource */
$resource->set('createdon', time());
$resource->save();
break;
default:
break;
}
return;
Благодарю! Воспользовался Вашим вариантом
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.