Последние добавленные ресурсы – при копировании ресурса

Здравствуйте. На сайте есть выборка ресурсов по дате их создание – то есть на выходе мы получаем последние добавленные товары.
Это работает если каждый раз создавать новый ресурс. Но, наполнять сайт куда удобнее копированием ресурса, потому что многие поля практически не приходится редактировать, в моем случае, это быстрее в несколько раз. Но в таком случае, у ресурса копируется и дата его создания, и ресурс не выводится как новый. В таблице site_content нет поля, которое бы фиксировала временную метку, когда ресурс был скопирован. Есть метка, когда ресурс редактировался, но она не подходит, потому что ресурсы редактируются часто, но при этом новыми они не становятся. Подскажите пожалуйста, как быть? Может кто-то уже решал подобную задачу?
Dolce
Dolce
05 июня 2018, 10:39
modx.pro
2 148

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

Павел Романов
05 июня 2018, 15:16
Как вариант можно попробовать сделать плагин на событие onDocFormPrerender:
<?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 в соответствии с текущим моментом.
При копировании через ПКМ в дереве не сработает, но по кнопке должен.
    Dolce
    05 июня 2018, 16:36
    Спасибо за ответ. Но не работает. Возможно просто у копированного ресурса, его pagetitle еще не в базе, пока его не сохранишь?
      Павел Романов
      05 июня 2018, 16:53
      Уже есть. Там сразу запись в базе создается и объект $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')); // проверка
      }
        Dolce
        05 июня 2018, 17:02
        Я попробовал через консоль, на конкретном ресурсе
        $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'
    g0dzilla
    06 июня 2018, 10:55
    Привязывать по тайтлу не есть корректно, да и зачем, если есть: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;
      Dolce
      06 июня 2018, 13:18
      Благодарю! Воспользовался Вашим вариантом
    Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
    8