Всем привет. Разрабатываю небольшой плагинчик для отлавливания удаляемых ресурсов (OnResourceDelete) и проблема в том что не могу поймать id удаляемого ресурса
Делаю так
$id = $modx->resource->get('id');
но в итоге все что после этой строки не выполняется, по всей видимости ошибочная строка.
Пробовал выводить в лог ошибок
$modx->resource->get('id');
— пусто
Смотрите лог ошибок веб-сервера. Возможно, у Вас синтаксическая ошибка выше этой строки (сама приведённая строка ошибок не содержит). Либо у вас событие (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. читайте код. Как можно писать плагин для процессора, не читая код самого процессора? Угадайка?