Изменяем автора материала в форме редактирования (для всех типов контента сразу)

+19
3.17K
В продолжение предыдущего поста. Только теперь делаем хук для добавления выбора пользователей сразу во все типы контента. Я вчера не обнаружил нужный хук, а сегодня его подсказал Fuze — спасибо!
Файлы ядра также не изменяются.


Если вы уже создавали хуки для отдельных типов контента из предыдущего поста, то их нужно удалить, чтобы не было по два одинаковых поля выбора пользователей. Если не делали, пропустите этот блок.

1. В файле манифеста удалите строки по шаблону:
  1. 'content_типконтента_form',
2. Удалите все файлы вашего контроллера с именами типа \system\controllers\вашконтроллер\hooks\content_типконтента_form.php


Теперь делаем один общий хук.

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_item_form',
  7.  
  8. )
  9. );
Либо добавляем строку с "'content_item_form'," в существующий манифест вашего контроллера.

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

Теперь при редактировании записей любого типа контента внизу появится поле "Пользователь" с выпадающим списком.
0
Alex AV Alex AV 5 лет назад #
Создал хук "content_item_form" с помощью генератора контента.
Если в "manifest.php" есть строчка
'content_item_form', // форма для всех типов контента

То вместо формы просто белый экран, отладка выдаёт вот это :
Parse error: syntax error, unexpected end of file, expecting function (T_FUNCTION) in /home/#####/site.ru/system/controllers/name_controller/hooks/content_item_form.php on line 36
0
Олег Васильевич я Олег Васильевич я 5 лет назад #
На 2.7.0 (вчераний гит) всё работает без проблем.
0
Alex AV Alex AV 5 лет назад #
Тоесть хук "content_item_form" появится в недалёком будущем?
+1
WebMan WebMan 5 лет назад #
Хук "content_item_form" точно есть в 2.6.1.

Проверьте наличие всех фигурных скобок в файле /home/#####/site.ru/system/controllers/name_controller/hooks/content_item_form.php и вообще правильность копирования кода в него.
0
Alex AV Alex AV 5 лет назад #
Да такой хук "content_item_form" действительно есть. Я же говорю я хук не руками писал, а с помощью "Генератора компонентов", есть там такой раздел - сделать хук. Так что код правильный. Но не работает.
+1
WebMan WebMan 5 лет назад #
Код в топике - один в один из моего рабочего файла хука.
Приведите полное содержимое Вашего файла /home/#####/site.ru/system/controllers/name_controller/hooks/content_item_form.php, только спрячьте его под спойлер.
0
Alex AV Alex AV 5 лет назад #
Дико извиняюсь. Да, всё работает - это у меня закрывающей скобки не хватало "}".
предлагаю придать название полю, и всё таки сделать что то с лимитом 1000.

Код PHP:
  1. // Делаем поле : сменить автора
  2. if (cmsUser::isAdmin())
  3. {
  4. $fs = $form->addFieldset('Владелец'); // заголовок
  5. // добавляем поле в форму
  6. $form->addField($fs,
  7. new fieldList('user_id', array(
  8. 'title' => LANG_USER,
  9. 'default' => 1, // автор по умолчанию admin, id=1
  10. 'rules' => array(
  11. array('required'), // должно быть заполнено
  12. ),
  13. 'generator' => function($item) {
  14. $users_model = cmsCore::getModel('users');
  15. $users_model->limit(0); // убираем лимит в 1000
  16. $authors = $users_model->getUsers();
  17. if($authors) {
  18. foreach ($authors as $author) {
  19. $items[$author['id']] = $author['nickname'] .' ('. $author['email'] .')';
  20. }
  21. return array('' => '') + $items;
  22. }
  23. }
  24. ))
  25. );
  26. return $form;
  27. }
+1
WebMan WebMan 5 лет назад #
Название у поля есть - "Пользователь". Оно подходит больше, чем "Автор", так как не всегда материалы публикуются самими авторами и иногда поле "Автор" уже есть.

Лимит 1000 для меня сейчас пока не актуален. Как вариант, могу предложить создать новую группу только с теми пользователями, которые должны быть в списке, а потом фильтровать в список только эту группу.
Заменить строку
Код PHP:
  1. $authors = cmsCore::getModel('users')->getUsers();
на
Код PHP:
  1. $authors = cmsCore::getModel('users')->filterGroupByName('admins')->getUsers();
где вместо 'admins' подставить название нужной группы.
0
Clear Clear 5 лет назад #
С добавление определенной группы в выбор пропадает возможность поиска с набором, это крайне не удобно если пользоавтелей много, тогда уж лучше через поиск оставить.
0
WebMan WebMan 5 лет назад #
Действительно так. Неожиданно. Я не знаю, почему.
+2
WebMan WebMan 5 лет назад #
Есть небольшой нюанс при использовании данного варианта для добавления новых материалов от имени разных пользователей.
При подстановке другого пользователя (не себя) не меняется время последнего визита для этого пользователя. Поэтому может получиться, что "автор" был месяц назад, а статью разместил только что.

Решается заходом под именем этого пользователя (например, через "Реавторизатор" или подобный виджет) или дописыванием ещё пары хуков "content_after_add" и 'content_after_update', в которых можно обновлять время последнего визита "автора". Мне они не нужны. Если вам нужны, сделайте сами по этому примеру.
0
Clear Clear 5 лет назад #
А как мне вывести этот блок в самый верх, чет как то листать вниз неудобно и когда список открывается он прячется за экран в нижнюю часть и не видно толком список. И можно ли еще по умолчанию выводить по алфавиту а то какая то каша получается. Спасибо.
0
WebMan WebMan 5 лет назад #
В самый верхний блок (0) перед всеми полями - в файле обработчика заменить
Код PHP:
  1. $form->addField($fs,
на
Код PHP:
  1. $form->addFieldToBeginning(0,
Сортировка по нику - в том же файле заменить
Код PHP:
  1. $authors = cmsCore::getModel('users')->getUsers();
на
Код PHP:
  1. $authors = cmsCore::getModel('users')->orderBy('nickname')->getUsers();
или для фильтра группы на
Код PHP:
  1. $authors = cmsCore::getModel('users')->filterGroupByName('admins')->orderBy('nickname')->getUsers();
0
nmsk nmsk 3 года назад #
На 2.10.1 данный метод работает? Больше года прошло.. нет такого маленького дополнения для установки?
0
Loadырь Loadырь 3 года назад #
Работает. Но есть "нюанс": если реальный автор отсутствует в списке авторов, то при редактировании записи другим пользователем, подставится первый "Админ" - автор по умолчанию id=1.

Еще от автора

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