Изменяем автора материала в ленте активности

+15
2.24K
Лучше поздно, чем никогда 😊 Продолжаю тему Изменяем автора материала в форме редактирования. В том варианте возникали две нестыковки в данных на сайте. Попробуем их решить.

Итак, способ из предыдущего поста работал нормально, но имел два недостатка:
1. При подстановке другого пользователя (не себя) не меняется время последнего визита для этого пользователя. Поэтому может получиться, что новый "автор" был месяц назад, а статью разместил только что.
2. В ленте активности автор материала не изменялся, оставался прежним.

Обе эти задачи решаются двумя одинаковыми хуками на добавление и изменение записи контента 'content_after_add_approve' и 'content_after_update_approve'. Поэтому расширим предыдущий способ, добавив в него небольшие правки.

Сначала добавляем перехват нужных событий в уже созданный ранее манифест \system\controllers\вашконтроллер\manifest.php. Он должен получиться таким:
  1. <?php
  2.  
  3. return array(
  4. 'hooks' => array(
  5.  
  6. 'content_after_add_approve',
  7.  
  8. 'content_after_update_approve',
  9.  
  10. 'content_item_form',
  11. )
  12. );
  13.  

Далее в папке \system\controllers\вашконтроллер\hooks\ создаём два файла хуков. Они одинаковые по коду, отличаются лишь названием класса.
Файл \system\controllers\вашконтроллер\hooks\content_after_add_approve.php:
  1. <?php
  2.  
  3. class onВашконтроллерContentAfterAddApprove extends cmsAction {
  4.  
  5. public function run($data){
  6.  
  7. $ctype_name = $data['ctype_name'];
  8. $item = $data['item'];
  9.  
  10. // Обновляем пользователя в ленте активности
  11. cmsCore::getController('activity')->updateEntry(
  12. 'content',
  13. "add.{$ctype_name}",
  14. $item['id'],
  15. 'user_id' => $item['user_id']
  16. )
  17. );
  18.  
  19. $user_model = cmsCore::getModel('users');
  20. $user = $user_model->getUser($item['user_id']);
  21.  
  22. // Если дата публикации новее, чем дата последнего посещения пользователя, ...
  23. if ($item['date_pub'] > $user['date_log']) {
  24.  
  25. // ... то обновляем дату пользователя
  26. $user_model->updateUser(
  27. $item['user_id'],
  28. array('date_log' => $item['date_pub'])
  29. );
  30.  
  31. }
  32.  
  33. return $data;
  34.  
  35. }
  36.  
  37. }
Файл \system\controllers\вашконтроллер\hooks\content_after_update_approve.php:
  1. <?php
  2.  
  3. class onВашконтроллерContentAfterUpdateApprove extends cmsAction {
  4.  
  5. public function run($data){
  6.  
  7. $ctype_name = $data['ctype_name'];
  8. $item = $data['item'];
  9.  
  10. // Обновляем пользователя в ленте активности
  11. cmsCore::getController('activity')->updateEntry(
  12. 'content',
  13. "add.{$ctype_name}",
  14. $item['id'],
  15. 'user_id' => $item['user_id']
  16. )
  17. );
  18.  
  19. $user_model = cmsCore::getModel('users');
  20. $user = $user_model->getUser($item['user_id']);
  21.  
  22. // Если дата публикации новее, чем дата последнего посещения пользователя, ...
  23. if ($item['date_pub'] > $user['date_log']) {
  24.  
  25. // ... то обновляем дату пользователя
  26. $user_model->updateUser(
  27. $item['user_id'],
  28. array('date_log' => $item['date_pub'])
  29. );
  30.  
  31. }
  32.  
  33. return $data;
  34.  
  35. }
  36.  
  37. }
Обязательно измените в этих файлах "Вашконтроллер" на имя вашего контроллера в названиях классов onВашконтроллерContentAfterAddApprove и onВашконтроллерContentAfterUpdateApprove.

После этого заходим в "Админка — Компоненты — Управление событиями", видим там наши хуки в списке новых и добавляем их в базу данных.
Теперь при изменении автора в форме создания/редактирования контента будет изменяться также и автор в ленте активности, и, при необходимости, актуализироваться дата последнего посещения нового "автора".


P.S. Не претендую на иделаьность кода, но у меня он работает. 😊

P.P.S. Конечно, делать хуки в своём компоненте — это не единственный и, возможно, не лучший способ для решения данной задачи. Он подходит тем, кто умеет программировать и хочет добавить такой функционал на свой сайт самостоятельно. Или не хочет ставить на сайт сторонние компоненты ради одной функции. Остальным вебмастерам в качестве альтернативы может подойти решение от Kreator — поле "Выбрать автора записи" в составе компонента "SiteKreator", работающего совместно с шаблоном "SiteStroi".
Нет комментариев. Ваш будет первым!

Еще от автора

Хуки-хухуки: Исключаем неактивных пользователей из списков
Как иногда начинают свой монолог неопытные стендаперы: «У всех в жизни было такое …
«Расширенная отладка» для InstantCMS 2.14.1 (v.14.1.2) – большое обновление для разработчиков
Новые возможности и удобства, облегчающие разработчикам отладку компонентов и шаблонов.
Использование расширенной отладки. Часть 11. Анализ ошибок 403/404 и редиректов
Одной из неудобных задач при отладке для меня является поиск причины ошибки 403/404.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.