Лучше поздно, чем никогда 😊 Продолжаю тему Изменяем автора материала в форме редактирования. В том варианте возникали две нестыковки в данных на сайте. Попробуем их решить.
Итак, способ из предыдущего поста работал нормально, но имел два недостатка:
1. При подстановке другого пользователя (не себя) не меняется время последнего визита для этого пользователя. Поэтому может получиться, что новый "автор" был месяц назад, а статью разместил только что.
2. В ленте активности автор материала не изменялся, оставался прежним.
Обе эти задачи решаются двумя одинаковыми хуками на добавление и изменение записи контента 'content_after_add_approve' и 'content_after_update_approve'. Поэтому расширим предыдущий способ, добавив в него небольшие правки.
Сначала добавляем перехват нужных событий в уже созданный ранее манифест \system\controllers\вашконтроллер\manifest.php. Он должен получиться таким:
Далее в папке \system\controllers\вашконтроллер\hooks\ создаём два файла хуков. Они одинаковые по коду, отличаются лишь названием класса.
Файл \system\controllers\вашконтроллер\hooks\content_after_add_approve.php:
Файл \system\controllers\вашконтроллер\hooks\content_after_update_approve.php:
Обязательно измените в этих файлах "Вашконтроллер" на имя вашего контроллера в названиях классов onВашконтроллерContentAfterAddApprove и onВашконтроллерContentAfterUpdateApprove.
После этого заходим в "Админка — Компоненты — Управление событиями", видим там наши хуки в списке новых и добавляем их в базу данных.
Теперь при изменении автора в форме создания/редактирования контента будет изменяться также и автор в ленте активности, и, при необходимости, актуализироваться дата последнего посещения нового "автора".
P.S. Не претендую на иделаьность кода, но у меня он работает. 😊
P.P.S. Конечно, делать хуки в своём компоненте — это не единственный и, возможно, не лучший способ для решения данной задачи. Он подходит тем, кто умеет программировать и хочет добавить такой функционал на свой сайт самостоятельно. Или не хочет ставить на сайт сторонние компоненты ради одной функции. Остальным вебмастерам в качестве альтернативы может подойти решение от Kreator — поле "Выбрать автора записи" в составе компонента "SiteKreator", работающего совместно с шаблоном "SiteStroi".
Итак, способ из предыдущего поста работал нормально, но имел два недостатка:
1. При подстановке другого пользователя (не себя) не меняется время последнего визита для этого пользователя. Поэтому может получиться, что новый "автор" был месяц назад, а статью разместил только что.
2. В ленте активности автор материала не изменялся, оставался прежним.
Обе эти задачи решаются двумя одинаковыми хуками на добавление и изменение записи контента 'content_after_add_approve' и 'content_after_update_approve'. Поэтому расширим предыдущий способ, добавив в него небольшие правки.
Сначала добавляем перехват нужных событий в уже созданный ранее манифест \system\controllers\вашконтроллер\manifest.php. Он должен получиться таким:
Далее в папке \system\controllers\вашконтроллер\hooks\ создаём два файла хуков. Они одинаковые по коду, отличаются лишь названием класса.
Файл \system\controllers\вашконтроллер\hooks\content_after_add_approve.php:
<?php class onВашконтроллерContentAfterAddApprove extends cmsAction { public function run($data){ $ctype_name = $data['ctype_name']; $item = $data['item']; // Обновляем пользователя в ленте активности cmsCore::getController('activity')->updateEntry( 'content', "add.{$ctype_name}", $item['id'], 'user_id' => $item['user_id'] ) ); $user_model = cmsCore::getModel('users'); $user = $user_model->getUser($item['user_id']); // Если дата публикации новее, чем дата последнего посещения пользователя, ... if ($item['date_pub'] > $user['date_log']) { // ... то обновляем дату пользователя $user_model->updateUser( $item['user_id'], ); } return $data; } }
<?php class onВашконтроллерContentAfterUpdateApprove extends cmsAction { public function run($data){ $ctype_name = $data['ctype_name']; $item = $data['item']; // Обновляем пользователя в ленте активности cmsCore::getController('activity')->updateEntry( 'content', "add.{$ctype_name}", $item['id'], 'user_id' => $item['user_id'] ) ); $user_model = cmsCore::getModel('users'); $user = $user_model->getUser($item['user_id']); // Если дата публикации новее, чем дата последнего посещения пользователя, ... if ($item['date_pub'] > $user['date_log']) { // ... то обновляем дату пользователя $user_model->updateUser( $item['user_id'], ); } return $data; } }
После этого заходим в "Админка — Компоненты — Управление событиями", видим там наши хуки в списке новых и добавляем их в базу данных.
Теперь при изменении автора в форме создания/редактирования контента будет изменяться также и автор в ленте активности, и, при необходимости, актуализироваться дата последнего посещения нового "автора".
P.S. Не претендую на иделаьность кода, но у меня он работает. 😊
P.P.S. Конечно, делать хуки в своём компоненте — это не единственный и, возможно, не лучший способ для решения данной задачи. Он подходит тем, кто умеет программировать и хочет добавить такой функционал на свой сайт самостоятельно. Или не хочет ставить на сайт сторонние компоненты ради одной функции. Остальным вебмастерам в качестве альтернативы может подойти решение от Kreator — поле "Выбрать автора записи" в составе компонента "SiteKreator", работающего совместно с шаблоном "SiteStroi".