miec-pavel 07 августа 2015 1 7
Всем привет. Разрабатываю небольшой плагинчик для отлавливания удаляемых ресурсов (OnResourceDelete) и проблема в том что не могу поймать id удаляемого ресурса

Делаю так

$id = $modx->resource->get('id');

но в итоге все что после этой строки не выполняется, по всей видимости ошибочная строка.

Пробовал выводить в лог ошибок
$modx->resource->get('id');
— пусто
7 комментариев
c
cyrax_02 08 августа 2015г в 14:10 #
Смотрите лог ошибок веб-сервера. Возможно, у Вас синтаксическая ошибка выше этой строки (сама приведённая строка ошибок не содержит). Либо у вас событие (OnResourceDelete) не генерируется. Проверьте наличие галки напротив (OnResourceDelete) на вкладке «Системные события» плагина.

А вообще, в обработчик (OnResourceDelete) уже передаётся переменная $id. Т.е. в плагине её получать не нужно — сразу её можно использовать.

Для справки: в обработчик (OnResourceDelete) передаются следующие переменные:
$id — идентификатор удаляемого ресурса
$children — массив идентификаторов дочерних ресурсов
$resource — ссылка на объект modResource, представляющий собой удаляемый ресурс
Fi1osof1
Fi1osof 08 августа 2015г в 14:12 #
$resource — ссылка на объект modResource, представляющий собой удаляемый ресурс
Все верно. $modx->resource — это только во фронте, когда документ уже получен.
c
cyrax_02 08 августа 2015г в 14:23 #
Да, действительно. Тогда у него ошибка на этой строке и генерируется: при удалении ресурса из админки modx->resource не существует (не проинициализирован)
m
miec-pavel 08 августа 2015г в 14:28 #
Вы правы, $id передается по умолчанию. Теперь осталось понять как остановить работу не самого плагина а самого события(прервать удаление) т.к. return и break останавливают именно плагин. Задача стоит так что определенные ресурсы нельзя удалить…
c
cyrax_02 08 августа 2015г в 14:46 #
Событие OnResourceDelete генерируется после фактического удаления (так же, как и OnDocFormDelete). Запрет удаления ресурсов нужно реализовывать на уровне прав. А именно, присвоить неудаляемым ресурсам определённую группу, и запретить определённым (или всем) пользователям удалять ресурсы этой группы.
Fi1osof1
Fi1osof 08 августа 2015г в 14:46 #
Не хочется вас расстраивать, но никак. В процессоре удаления документа (именно отметки документа как удаленный) modResourceDeleteProcessor нет проверки результата выполнения процессора. Раз и два. Поэтому, максимум что вы можете, это не перед удалением, а уже после удаления (сабжевое событие OnResourceDelete) восстановить документ ($resource->deleted = 0; $resource->save()).
К слову, если вы планировали отловить событие и прервать выполнение процессора, чтобы документ не был удален, то вы не то событие дергаете. OnResourceDelete срабатывает на fireAfterDelete, то есть в тот момент, когда запись уже сделана. Что-то там прерывать бессмысленно уже. Для этого надо было юзать OnBeforeDocFormDelete, которое вызывается в fireBeforeDelete.
Кстати, тут еще одна засада: при удалении документа «удаляются» и его дочерние документы. Поэтому здесь без останова плагина просто не обойтись. Иначе, перебирать все дочерние, смотреть когда были удалены и отменять удаление тем, которые были удалены секунду назад — это мегакостыль.
В общем, надо писать и слать пуллреквест в ядро.

P.S. читайте код. Как можно писать плагин для процессора, не читая код самого процессора? Угадайка?
m
miec-pavel 08 августа 2015г в 14:14 #
По поводу события — оно генерируется, галка стоит и вручную выводу сообщение в лог ошибок modx что бы проверить попал ли в это событие. По поводу $id сейчас попробую вывести его
Авторизуйтесь или зарегистрируйтесь (можно через соцсети ), чтобы оставлять комментарии.