Как получить id удаляемого ресурса?

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

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

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

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

— пусто

Comments

Смотрите лог ошибок веб-сервера. Возможно, у Вас синтаксическая ошибка выше этой строки (сама приведённая строка ошибок не содержит). Либо у вас событие OnResourceDelete не генерируется. Проверьте наличие галки напротив OnResourceDelete на вкладке «Системные события» плагина.

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

Для справки: в обработчик OnResourceDelete передаются следующие переменные:

  • $id — идентификатор удаляемого ресурса
  • $children — массив идентификаторов дочерних ресурсов
  • $resource — ссылка на объект modResource, представляющий собой удаляемый ресурс

$resource — ссылка на объект modResource, представляющий собой удаляемый ресурс

Все верно. $modx->resource — это только во фронте, когда документ уже получен.

По поводу события — оно генерируется, галка стоит и вручную выводу сообщение в лог ошибок modx что бы проверить попал ли в это событие. По поводу $id сейчас попробую вывести его

Да, действительно. Тогда у него ошибка на этой строке и генерируется: при удалении ресурса из админки modx->resource не существует (не проинициализирован)

Вы правы, $id передается по умолчанию. Теперь осталось понять как остановить работу не самого плагина а самого события (прервать удаление) т.к. return и break останавливают именно плагин. Задача стоит так что определенные ресурсы нельзя удалить…

Событие OnResourceDelete генерируется после фактического удаления (так же, как и OnDocFormDelete). Запрет удаления ресурсов нужно реализовывать на уровне прав. А именно, присвоить неудаляемым ресурсам определённую группу, и запретить определённым (или всем) пользователям удалять ресурсы этой группы.

Не хочется вас расстраивать, но никак. В процессоре удаления документа (именно отметки документа как удаленный) modResourceDeleteProcessor нет проверки результата выполнения процессора. Раз и два. Поэтому, максимум что вы можете, это не перед удалением, а уже после удаления (сабжевое событие OnResourceDelete) восстановить документ ($resource->deleted = 0; $resource->save()).

К слову, если вы планировали отловить событие и прервать выполнение процессора, чтобы документ не был удален, то вы не то событие дергаете. OnResourceDelete срабатывает на fireAfterDelete, то есть в тот момент, когда запись уже сделана. Что-то там прерывать бессмысленно уже. Для этого надо было юзать OnBeforeDocFormDelete, которое вызывается в fireBeforeDelete.

Кстати, тут еще одна засада: при удалении документа «удаляются» и его дочерние документы. Поэтому здесь без останова плагина просто не обойтись. Иначе, перебирать все дочерние, смотреть когда были удалены и отменять удаление тем, которые были удалены секунду назад — это мегакостыль.

В общем, надо писать и слать пуллреквест в ядро.

P.S. читайте код. Как можно писать плагин для процессора, не читая код самого процессора? Угадайка?