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

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

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

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