К содержанию

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

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

Комментарии: 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
    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
        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'
          Павел Романов
          Павел Романов Проверенный
          05 июня 2018, 17:16
          Сделайте без now:
          time();
            Dolce
            Dolce Проверенный
            05 июня 2018, 17:27
            Все работает, спасибо
      g0dzilla
      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
        Dolce Проверенный
        06 июня 2018, 13:18
        Благодарю! Воспользовался Вашим вариантом
      Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
      8