'resource/delete' без удаления дочерних ресурсов

В продолжение этой темы:
Удаление ресурсов в MODX Revolution

Вопрос: как «сказать» процессору 'resource/delete', что удалять дочерние ресурсы не нужно ?
Создаю, обновляю, удаляю ресурсы программно (через modx API). В процессе такого импорта некоторые ресурсы, которые не должны быть удалены, в определённые моменты времени могут оказаться в подчинении у удаляемого ресурса. В ходе выполнения процессора 'recource/delete' в отношении удаляемого ресурса все его потомки тоже удаляются.

В качестве одного из вариантов вижу написание собственного процессора удаления путём наследования стандартного 'resource/delete'. Можно ли реализовать задачу более простым способом?
Cyrax_02
18 марта 2014, 11:51
modx.pro
2 754
0

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

Василий Наумкин
18 марта 2014, 16:15
+1
В качестве одного из вариантов вижу написание собственного процессора удаления путём наследования стандартного 'resource/delete'. Можно ли реализовать задачу более простым способом?
А что здесь непростого? Наследуешь стандартный процессор и переопределяешь нужный метод.
require MODX_CORE_PATH . 'model/modx/processors/resource/delete.class.php';
class class myResourceDeleteProcessor extends modResourceDeleteProcessor {

	public function deleteChildren() {
		return array();
	}

}
return 'myResourceDeleteProcessor';

Вот исходный процессор.
    Cyrax_02
    10 декабря 2014, 00:29
    0
    Вот текст собственного процессора удаления ресурса:
    <?php
    if(!class_exists('modResourceDeleteProcessor')) {
        global $modx; include $modx->config['processors_path'].'resource/delete.class.php';
    }
    class sResourceDeleteProcessor extends modResourceDeleteProcessor {
        
        public function deleteChildren() {
            if($this->getProperty('deleteChildren', true)) {  // в modResourceDeleteProcessor дочерние ресурсы удаляются всегда
                return parent::deleteChildren();
            } else {
    	    return array();
    	}
        }
        public function clearCache() {
            if($this->getProperty('syncsite', true)) {  // в modResourceDeleteProcessor кэш очищается всегда
                parent::clearCache();
            }
        }
    }
    return 'sResourceDeleteProcessor';

    Если файл с этим процессором имеет имя «sdelete.class.php» и лежит там же, где и все прочие стандартные процессоры modx, то вызов будет выглядеть так:

    $properties = array('id' => $resourceId, 'deleteChildren' => false, 'syncsite' => false);
    $response = $modx->runProcessor('resource/sdelete', $properties);

    Если файл с процессором лежит в собственной папке PROC_PATH и имеет имя «sResourceDeleteProcessor.class.php», то вызов будет таким:

    $properties = array('id' => $resourceId, 'deleteChildren' => false, 'syncsite' => false);
    $options = array('processors_path' => PROC_PATH);
    $response = $modx->runProcessor('sResourceDeleteProcessor', $properties, $options);

    =============================================================================================
    1.В данном примере реализовано опциональное отключение удаления дочерних ресурсов и очистки кэша. И реализовано это на базе те же самых свойств, которые передаются вторым параметром в метод modX::runProcessor().
    2. Отключать очистку кэширования может быть полезно при пакетной обработке ресурсов для сокращения времени обработки. Аналогично можно отключить и логирование (перегрузкой метода modResourceDeleteProcessor::logManagerAction())

    3.В процессорах «resource/create» и «resource/update» параметр «syncsite» уже обрабатывается (по умолчанию syncsite = true), тогда как стандартный процессор «resource/delete» кэш очищает всегда
    4.При обработке ресурсов кэш очищается только в следующих разделах: 'db', 'auto_publish', 'context_settings' и 'resource'
      Виталий Киреев
      10 декабря 2014, 08:11
      0
      Чтобы ресурсы не затерялись в дереве, надо бы еще им родителя сменить на родителя удаляемого ресурса.
        Cyrax_02
        10 декабря 2014, 12:00
        0
        Это уже от предметной области зависит. Если удалённый ресурс в дальнейшем восстанавливается, то его бывшие дочерние ресурсы так и останутся у другого «родителя» (и никак их не выследишь, чтобы снова привязать к восстанавливаемому «родителю»).
        А с помощью запроса (например, в myAdmin), всегда можно найти и перепривязать все «подвешенные» ресурсы после очистки корзины. Этот же запрос можно и на xPDO составить, а перепривязывать через процессор 'resource/update'.

        Можно перегрузить процессор очистки корзины, чтобы все подчинённые ресурсы окончательно удаляемых ресурсов перемещались в определённое место (или к родителю окончательно удаляемого ресурса). Только для этого нужно будет где-то хитро подменить процессор.
      Cyrax_02
      06 января 2015, 05:04
      0
      Улучшенный вариант процессора:
      <?php
      if(!class_exists('modResourceDeleteProcessor')) {
          global $modx; include $modx->config['processors_path'].'resource/delete.class.php';
      }
      class sResourceDeleteProcessor extends modResourceDeleteProcessor {
      
          public function initialize() {
              $output = parent::initialize();        
              $this->resource->set('syncsite', $this->getProperty('syncsite', true));              // в [modResourceDeleteProcessor] кэш очищается всегда
              $this->resource->set('deleteChildren', $this->getProperty('deleteChildren', true));  // в [modResourceDeleteProcessor] удаляются всегда
              return $output;
          }
          public function deleteChildren() {
              if($this->getProperty('deleteChildren', true)) {  // в modResourceDeleteProcessor дочерние ресурсы удаляются всегда
                  return parent::deleteChildren();
              } else {
      	    return array();
      	}
          }
          public function clearCache() {
              if($this->getProperty('syncsite', true)) {  // в modResourceDeleteProcessor кэш очищается всегда
                  parent::clearCache();
              }
          }
      }
      return 'sResourceDeleteProcessor';

      В результате в плагинах на OnDocFormDelete и OnResourceDelete можно использовать свойства «syncsite» (как в OnDocFormSave) и «deleteChildren»:
      $resource->get('syncsite')
      $resource->get('deleteChildren')

      Свойство «syncsite» в плагинах может понадобиться, например, для очистки собственных разделов кэша, связанных с удаляемым ресурсом.
        Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
        5