В компоненте необходимо обработать событие удаления пользователя из системы, следовательно использую хук user_delete.
Мне требуется почистить за пользователем данные которые ссылаются на созданные им записи в различных типах контента. Чтобы получить список записей хотел использовать функцию из модели контроллера "content" — getContentItems($ctype['name']);. Но проблема в том, что эта функция, в моем случае, вызывается уже после зачистки всех записей удаляемого пользователя в хуке user_delete, самим компонентом "content". Т.е. в БД нужных мне записей уже нет на момент поиска их в хуке моего компонента, т.к. он срабатывает позже хука компонента "content". Это связано с названием компонентов — очерёдность вызова всех хуков в InstantCMS 2 устанавливается в алфавитном порядке (см. ..\system\core\eventsmanager.php — getAllListeners() ) и т.к. название моего компонента следует за content'ом то обрабатывать уже нечего =(.
Решение проблемы вижу несколькими способами, но все они мне не нравятся:
1. хак — немного переписать функцию getAllListeners(), чтобы переместить в конец массива вызов хуков контроллера "content". Вроде бы самый логичный вариант, при том, что в iCMS 2 все крутится вокруг контента, и следовательно необходимо "пропустить вперед "чужие" контроллеры" в очереди хуков, мало-ли кому что понадобиться взять из записей, до момента их изменения/удаления. Но хак — это плохо.
2. хак — добавить в модель компонента "content" (deleteUserContent($user_id);) вызов хуков на удаление контента, как это сделано в теле экшена item_delete. Совсем плохая идея — из модели вызывать хуки. Или добавить в хук user_delete (компонента "content") вызов новых хуков, например 'content_user_delete':
class onContentUserDelete extends cmsAction { public function run($user){ cmsEventsManager::hook("content_user_delete", $user); $this->model->deleteUserContent($user['id']); return $user; } }
3. Обрабатывать все "ссылки" записей в БД моего компонента путем проверки на существование оригинала самой записи. Но тут встает вопрос производительности. Нужно перебрать все записи в БД компонента и сравнить их со всеми записями контента — очень не эффективное решение.
Через различные хаки (указанные в 1, 2 и другие) проблема легко решается, но возникают проблемы с поддержкой и продвижением компонента в последующих версиях InstantCMS 2. Поэтому, подытоживая выше-написанное, вопрос следующий: как узнать какие записи принадлежали удаляемому пользователю, если этих записей уже нет в БД, и затем удалить ссылки на эти записи в таблицах БД моего компонента?
P.S. Надеюсь получилось не слишком запутанно.