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

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


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

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


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

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

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

В \system\controllers\ создаём файл \system\controllers\вашконтроллер\manifest.php
Спойлер
Либо добавляем строку с "'content_item_form'," в существующий манифест вашего контроллера.

3. Создаём хук.
Сначала создаём папку \system\controllers\вашконтроллер\hooks\
А в ней - файл \system\controllers\вашконтроллер\hooks\content_item_form.php
Спойлер
Обратите внимание на заглавную первую букву имени контроллера в onВашконтроллерContentItemForm

Теперь при редактировании записей любого типа контента внизу появится поле "Пользователь" с выпадающим списком.
Изменяем автора материала прямо в форме редактирования | «Расширенная отладка» для InstantCMS 2.7.0 (v.10.3.270)
Комментарии (13)
Alex 4 февраля 2017 в 13:07 0
small user social cms
Создал хук "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
Олег Васильевич я 4 февраля 2017 в 13:12 0
small user social cms
На 2.7.0 (вчераний гит) всё работает без проблем.
Alex 4 февраля 2017 в 13:15 0
small user social cms
Тоесть хук "content_item_form" появится в недалёком будущем?
WebMan 4 февраля 2017 в 13:23 +1
small user social cms
Хук "content_item_form" точно есть в 2.6.1.

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

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

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

Решается заходом под именем этого пользователя (например, через "Реавторизатор" или подобный виджет) или дописыванием ещё пары хуков "content_after_add" и 'content_after_update', в которых можно обновлять время последнего визита "автора". Мне они не нужны. Если вам нужны, сделайте сами по этому примеру.
Clear 7 февраля 2017 в 15:01 0
small user social cms
А как мне вывести этот блок в самый верх, чет как то листать вниз неудобно и когда список открывается он прячется за экран в нижнюю часть и не видно толком список. И можно ли еще по умолчанию выводить по алфавиту а то какая то каша получается. Спасибо.
WebMan 7 февраля 2017 в 15:26 0
small user social cms
В самый верхний блок (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();