Файлы ядра не изменяются. Основано на решении от Вадим Нарочный в теме Поменять владельца контента. Спасибо Вадим Нарочный за идею и практически готовый код.
Как и просили, по шагам. 😊
1. Создаём свой контроллер, если у вас ещё нет своего подходящего. Если есть, то будем использовать его и этот шаг пропускаем.
Использовать стандартные контроллеры не стоит, так как при обновлении перезапишется манифест.
Читаем про "Контроллеры".
Придумываем вашему контроллеру уникальное имя латинскими буквами. Имя "вашконтроллер" приведено для примера и везде должно быть заменено именем вашего контроллера С УЧЁТОМ РЕГИСТРА!
В \system\controllers\ создаём папку с именем контроллера: \system\controllers\вашконтроллер
А в ней фронтенд контроллера \system\controllers\вашконтроллер\frontend.php
2. Создаём манифест, чтобы сказать системе, какой хук вы будете перехватывать.
Читаем про "Обработку событий".
В \system\controllers\ создаём файл \system\controllers\вашконтроллер\manifest.php
В этом коде и далее "типконтента" — имя типа контента латинскими буквами, куда вы хотите встроить поле для изменения автора. Также С УЧЁТОМ РЕГИСТРА!
3. Создаём хук.
Сначала создаём папку \system\controllers\вашконтроллер\hooks\
А в ней — файл \system\controllers\вашконтроллер\hooks\content_типконтента_form.php
Обратите внимание на заглавные первые буквы имён контроллера и типа контента в onВашконтроллерContentТипконтентаForm
Теперь при редактировании записей этого типа контента внизу появится поле "Пользователь" с выпадающим списком.
Если нужно менять пользователя для нескольких типов контента
Повторяем п.2, только уже не создаём новый файл, а дублируем строчку в уже созданном файле манифеста
подставляя в неё новый тип контента. Не забываем про запятую в конце строки!
А потом повторяем п.3, также заменяя имя контроллера и тип контента на новый.
Решение проверено, у меня всё работает. Если у вас что-то не так, перечитайте справку и пройдитесь ещё раз по всем шагам более внимательно.
Ответы по проблемам в комментариях смогу дать только после предъявления текста ошибки. Так что если экан пустой, читайте про "Тайну белого экрана от r2.
Возможные проблемы.
Пишет ошибку про ненайденный класс или просто белый экран:
1. Проверьте, везде ли заменили русские названия контроллера и типа контента для примера на свои латинские.
2. Проверьте, везде ли в этих названиях регистр букв соответствует примеру?
Вместо слова "Пользователь" в форме показывает "кракозябры" — уже не актуально. Поменял в коде выше русскую строку на константу LANG_USER.
1. Поменяйте кодировку файла хука в "UTF8 без BOM". Если лень искать в инете как это сделать, то просто напишите название поля в строке 17 на английском или транслитом. 😊
Как и просили, по шагам. 😊
1. Создаём свой контроллер, если у вас ещё нет своего подходящего. Если есть, то будем использовать его и этот шаг пропускаем.
Использовать стандартные контроллеры не стоит, так как при обновлении перезапишется манифест.
Читаем про "Контроллеры".
Придумываем вашему контроллеру уникальное имя латинскими буквами. Имя "вашконтроллер" приведено для примера и везде должно быть заменено именем вашего контроллера С УЧЁТОМ РЕГИСТРА!
В \system\controllers\ создаём папку с именем контроллера: \system\controllers\вашконтроллер
А в ней фронтенд контроллера \system\controllers\вашконтроллер\frontend.php
<?php class вашконтроллер extends cmsFrontend { }
Читаем про "Обработку событий".
В \system\controllers\ создаём файл \system\controllers\вашконтроллер\manifest.php
В этом коде и далее "типконтента" — имя типа контента латинскими буквами, куда вы хотите встроить поле для изменения автора. Также С УЧЁТОМ РЕГИСТРА!
3. Создаём хук.
Сначала создаём папку \system\controllers\вашконтроллер\hooks\
А в ней — файл \system\controllers\вашконтроллер\hooks\content_типконтента_form.php
<?php class onВашконтроллерContentТипконтентаForm extends cmsAction { public function run($data){ $form = $data[0]; $item = $data[1]; if (cmsUser::isAdmin()) { $fs = $form->addFieldset(); $form->addField($fs, 'title' => LANG_USER, 'default' => 1, ), 'generator' => function($item) { $authors = cmsCore::getModel('users')->getUsers(); if($authors) { foreach ($authors as $author) { $items[$author['id']] = $author['nickname'] . ' (' . $author['email'] . ')'; } } } )) ); } } }
Теперь при редактировании записей этого типа контента внизу появится поле "Пользователь" с выпадающим списком.
Если нужно менять пользователя для нескольких типов контента
Повторяем п.2, только уже не создаём новый файл, а дублируем строчку в уже созданном файле манифеста
'content_типконтента_form',
А потом повторяем п.3, также заменяя имя контроллера и тип контента на новый.
Решение проверено, у меня всё работает. Если у вас что-то не так, перечитайте справку и пройдитесь ещё раз по всем шагам более внимательно.
Ответы по проблемам в комментариях смогу дать только после предъявления текста ошибки. Так что если экан пустой, читайте про "Тайну белого экрана от r2.
Возможные проблемы.
Пишет ошибку про ненайденный класс или просто белый экран:
1. Проверьте, везде ли заменили русские названия контроллера и типа контента для примера на свои латинские.
2. Проверьте, везде ли в этих названиях регистр букв соответствует примеру?
Вместо слова "Пользователь" в форме показывает "кракозябры" — уже не актуально. Поменял в коде выше русскую строку на константу LANG_USER.
Реклама #
WebMan 7 лет назад #
Олег Васильевич я 7 лет назад #
Alexprofi 7 лет назад #
WebMan 7 лет назад #
Кстати №2. Вадиму не хватает немного кармы, чтобы иметь возможность создать свой блог. Не стесняйтесь, зайдите к нему и дайте ему эту возможность, если захочет - воспользуется.
Кстати №3. Если добавить новый хук "content_form", то можно будет создать один хук на все типы контента. Спрошу у Fuze.
Pro AV 7 лет назад #
Pro AV 7 лет назад #
$users_model->limit(0); // убираем лимит в 1000
$authors = $users_model->getUsers();
Alexprofi 7 лет назад #
vikont 7 лет назад #
JanaKovich 7 лет назад #
вопрос, а как быть с лентой активности, ведь после публикации автора 1 и потом при редактирование и смене на автор 2 в ленте активности автор 1 не меняется.
Dimson 7 лет назад #
WebMan 7 лет назад #