'resource/delete' без удаления дочерних ресурсов
В продолжение этой темы:
Удаление ресурсов в MODX Revolution
Вопрос: как «сказать» процессору 'resource/delete', что удалять дочерние ресурсы не нужно ?
Создаю, обновляю, удаляю ресурсы программно (через modx API). В процессе такого импорта некоторые ресурсы, которые не должны быть удалены, в определённые моменты времени могут оказаться в подчинении у удаляемого ресурса. В ходе выполнения процессора 'recource/delete' в отношении удаляемого ресурса все его потомки тоже удаляются.
В качестве одного из вариантов вижу написание собственного процессора удаления путём наследования стандартного 'resource/delete'. Можно ли реализовать задачу более простым способом?
Удаление ресурсов в MODX Revolution
Вопрос: как «сказать» процессору 'resource/delete', что удалять дочерние ресурсы не нужно ?
Создаю, обновляю, удаляю ресурсы программно (через modx API). В процессе такого импорта некоторые ресурсы, которые не должны быть удалены, в определённые моменты времени могут оказаться в подчинении у удаляемого ресурса. В ходе выполнения процессора 'recource/delete' в отношении удаляемого ресурса все его потомки тоже удаляются.
В качестве одного из вариантов вижу написание собственного процессора удаления путём наследования стандартного 'resource/delete'. Можно ли реализовать задачу более простым способом?
Комментарии: 5
В качестве одного из вариантов вижу написание собственного процессора удаления путём наследования стандартного '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';
Вот исходный процессор.
Вот текст собственного процессора удаления ресурса:
Если файл с этим процессором имеет имя «sdelete.class.php» и лежит там же, где и все прочие стандартные процессоры modx, то вызов будет выглядеть так:
Если файл с процессором лежит в собственной папке PROC_PATH и имеет имя «sResourceDeleteProcessor.class.php», то вызов будет таким:
=============================================================================================
1.В данном примере реализовано опциональное отключение удаления дочерних ресурсов и очистки кэша. И реализовано это на базе те же самых свойств, которые передаются вторым параметром в метод modX::runProcessor().
2. Отключать очистку кэширования может быть полезно при пакетной обработке ресурсов для сокращения времени обработки. Аналогично можно отключить и логирование (перегрузкой метода modResourceDeleteProcessor::logManagerAction())
3.В процессорах «resource/create» и «resource/update» параметр «syncsite» уже обрабатывается (по умолчанию syncsite = true), тогда как стандартный процессор «resource/delete» кэш очищает всегда
4.При обработке ресурсов кэш очищается только в следующих разделах: 'db', 'auto_publish', 'context_settings' и 'resource'
<?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'
Чтобы ресурсы не затерялись в дереве, надо бы еще им родителя сменить на родителя удаляемого ресурса.
Это уже от предметной области зависит. Если удалённый ресурс в дальнейшем восстанавливается, то его бывшие дочерние ресурсы так и останутся у другого «родителя» (и никак их не выследишь, чтобы снова привязать к восстанавливаемому «родителю»).
А с помощью запроса (например, в myAdmin), всегда можно найти и перепривязать все «подвешенные» ресурсы после очистки корзины. Этот же запрос можно и на xPDO составить, а перепривязывать через процессор 'resource/update'.
Можно перегрузить процессор очистки корзины, чтобы все подчинённые ресурсы окончательно удаляемых ресурсов перемещались в определённое место (или к родителю окончательно удаляемого ресурса). Только для этого нужно будет где-то хитро подменить процессор.
А с помощью запроса (например, в myAdmin), всегда можно найти и перепривязать все «подвешенные» ресурсы после очистки корзины. Этот же запрос можно и на xPDO составить, а перепривязывать через процессор 'resource/update'.
Можно перегрузить процессор очистки корзины, чтобы все подчинённые ресурсы окончательно удаляемых ресурсов перемещались в определённое место (или к родителю окончательно удаляемого ресурса). Только для этого нужно будет где-то хитро подменить процессор.
Улучшенный вариант процессора:
В результате в плагинах на OnDocFormDelete и OnResourceDelete можно использовать свойства «syncsite» (как в OnDocFormSave) и «deleteChildren»:
Свойство «syncsite» в плагинах может понадобиться, например, для очистки собственных разделов кэша, связанных с удаляемым ресурсом.
<?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» в плагинах может понадобиться, например, для очистки собственных разделов кэша, связанных с удаляемым ресурсом.
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.