Изменяем автора материала прямо в форме редактирования

+16
3.08K
Файлы ядра не изменяются. Основано на решении от Вадим Нарочный в теме Поменять владельца контента. Спасибо Вадим Нарочный за идею и практически готовый код.
Как и просили, по шагам. 😊

1. Создаём свой контроллер, если у вас ещё нет своего подходящего. Если есть, то будем использовать его и этот шаг пропускаем.
Использовать стандартные контроллеры не стоит, так как при обновлении перезапишется манифест.
Читаем про "Контроллеры".

Придумываем вашему контроллеру уникальное имя латинскими буквами. Имя "вашконтроллер" приведено для примера и везде должно быть заменено именем вашего контроллера С УЧЁТОМ РЕГИСТРА!
В \system\controllers\ создаём папку с именем контроллера: \system\controllers\вашконтроллер
А в ней фронтенд контроллера \system\controllers\вашконтроллер\frontend.php
  1. <?php
  2.  
  3. class вашконтроллер extends cmsFrontend {
  4.  
  5. }
2. Создаём манифест, чтобы сказать системе, какой хук вы будете перехватывать.
Читаем про "Обработку событий".

В \system\controllers\ создаём файл \system\controllers\вашконтроллер\manifest.php
  1. <?php
  2.  
  3. return array(
  4. 'hooks' => array(
  5.  
  6. 'content_типконтента_form',
  7.  
  8. )
  9. );
В этом коде и далее "типконтента" — имя типа контента латинскими буквами, куда вы хотите встроить поле для изменения автора. Также С УЧЁТОМ РЕГИСТРА!

3. Создаём хук.
Сначала создаём папку \system\controllers\вашконтроллер\hooks\
А в ней — файл \system\controllers\вашконтроллер\hooks\content_типконтента_form.php
  1. <?php
  2.  
  3. class onВашконтроллерContentТипконтентаForm extends cmsAction {
  4.  
  5. public function run($data){
  6.  
  7. $form = $data[0];
  8. $item = $data[1];
  9.  
  10. if (cmsUser::isAdmin()) {
  11.  
  12. $fs = $form->addFieldset();
  13.  
  14. $form->addField($fs,
  15.  
  16. new fieldList('user_id', array(
  17. 'title' => LANG_USER,
  18. 'default' => 1,
  19. 'rules' => array(
  20. array('required'),
  21. ),
  22. 'generator' => function($item) {
  23.  
  24. $authors = cmsCore::getModel('users')->getUsers();
  25.  
  26. if($authors) {
  27.  
  28. foreach ($authors as $author) {
  29. $items[$author['id']] = $author['nickname'] . ' (' . $author['email'] . ')';
  30. }
  31.  
  32. return array('' => '') + $items;
  33.  
  34. }
  35.  
  36. }
  37. ))
  38.  
  39. );
  40. }
  41.  
  42. return array($form, $item);
  43.  
  44. }
  45.  
  46. }
Обратите внимание на заглавные первые буквы имён контроллера и типа контента в onВашконтроллерContentТипконтентаForm

Теперь при редактировании записей этого типа контента внизу появится поле "Пользователь" с выпадающим списком.


Если нужно менять пользователя для нескольких типов контента

Повторяем п.2, только уже не создаём новый файл, а дублируем строчку в уже созданном файле манифеста
  1. 'content_типконтента_form',
подставляя в неё новый тип контента. Не забываем про запятую в конце строки!

А потом повторяем п.3, также заменяя имя контроллера и тип контента на новый.


Решение проверено, у меня всё работает. Если у вас что-то не так, перечитайте справку и пройдитесь ещё раз по всем шагам более внимательно.
Ответы по проблемам в комментариях смогу дать только после предъявления текста ошибки. Так что если экан пустой, читайте про "Тайну белого экрана от r2.


Возможные проблемы.

Пишет ошибку про ненайденный класс или просто белый экран:
1. Проверьте, везде ли заменили русские названия контроллера и типа контента для примера на свои латинские.
2. Проверьте, везде ли в этих названиях регистр букв соответствует примеру?

Вместо слова "Пользователь" в форме показывает "кракозябры" — уже не актуально. Поменял в коде выше русскую строку на константу LANG_USER.
1. Поменяйте кодировку файла хука в "UTF8 без BOM". Если лень искать в инете как это сделать, то просто напишите название поля в строке 17 на английском или транслитом. 😊
+4
WebMan WebMan 5 лет назад #
Вместо слова "Пользователь" в форме показывает "кракозябры" - уже не актуально. Поменял в коде русскую строку на константу LANG_USER.
+1
Олег Васильевич я Олег Васильевич я 5 лет назад #
Спасибо вам с Вадимом Нарочным
0
Alexprofi Alexprofi 5 лет назад #
Спасибо, иногда бывает очень нужно. +
+4
WebMan WebMan 5 лет назад #
Кстати №1. Оказывается, можно не только менять пользователя при редактировании, а и сразу указывать любого пользователя при создании записи. Это вдвойне удобно и приятно.

Кстати №2. Вадиму не хватает немного кармы, чтобы иметь возможность создать свой блог. Не стесняйтесь, зайдите к нему и дайте ему эту возможность, если захочет - воспользуется.

Кстати №3. Если добавить новый хук "content_form", то можно будет создать один хук на все типы контента. Спрошу у Fuze. smile
0
Alex AV Alex AV 5 лет назад #
Большое спасибо. Такой момент, у меня на сайте больше тысячи пользователей, и пользователи с user_ id > 1000 в списке не показываются, надо снять ограничение limit()
0
Alex AV Alex AV 5 лет назад #
$users_model = cmsCore::getModel('users');
$users_model->limit(0); // убираем лимит в 1000
$authors = $users_model->getUsers();
0
Alexprofi Alexprofi 5 лет назад #
Вадиму не хватает немного кармы
Уже хватает...
0
vikont vikont 5 лет назад #
Спасибо вам WebMan и Вадиму Нарочному! Отлично поработали. Давно мусолилась эта идея разными людьми, но вы наконец взялись ее реализовали. Пусть так, пока не компонентом, а возможно эту функцию внесут в одно из обновлений движка.
+1
JanaKovich JanaKovich 5 лет назад #
Спасибо! Все работает, очень удобно!

вопрос, а как быть с лентой активности, ведь после публикации автора 1 и потом при редактирование и смене на автор 2 в ленте активности автор 1 не меняется.
0
Dimson Dimson 4 года назад #
Не знаю в с какой версии, но в 2.8.1 нашел content_item_form, который можно использовать для всех типов контента и не дублить для каждого в отдельности

Еще от автора

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