Хуки-хухуки: Как создать свой компонент для хуков?

+16
735
Часто в блогах и на форуме можно увидеть совет «для решения задачи нужно в таком-то хуке сделать так-то» и даже есть рабочий код, но куда его вставить?
Прямо как в анекдоте: Почему холостяки не готовят себе рецепты из интернета? Потому что каждый рецепт начинается со слов «Возьмите чистую кастрюлю».
Сделаем себе «чистую кастрюлю» — пустой компонент для своих хуков.



Небольшое отступление.
1. Заранее прошу прощения у моих коллег-программистов, за то, что я отбираю немного хлеба у богатых продвинутых программеров и отдаю его начинающим.
2. Я не претендую на звание «гуру». Просто делюсь тем, что уже изучил. Если у вас есть замечания или дополнения – смело пишите в комментариях.

Для начала дня три почитаем «Документацию по созданию компонентов» и посмотрим замечательные видео-туториалы от разработчиков…
Шутка. Изучать доки нужно обязательно, но для наших целей всё гораздо проще и быстрее. Дальше без шуток.

Создаём контроллер компонента

Придумаем название компонента. Вы можете выбрать любое и написать его латинскими буквами. Я назову – ‘Webman’. Не потому, что у меня мало скромности (у меня её вообще нет). А для того, чтобы вам захотелось подставить другое имя и вы поняли, что и как дальше делается.

Создаём папку с этим названием в папке /system/controllers. Название должно быть написано прописными (маленькими) буквами. Получаем папку /system/controllers/webman

Теперь создаём пустой файл контроллера (фронтенда) компонента /system/controllers/webman/frontend.php, открываем его в любимом редакторе PHP-файлов (Notepad++, NetBeans. PHPStorm и т.п.) и добавляем такие строки:
  1. <?php
  2.  
  3. class webman extends cmsFrontend {
  4.  
  5. protected $useOptions = true;
  6.  
  7. }
Обратите внимание, класс называется именем нашего компонента, полностью прописными буквами.
На самом деле можно было обойтись тремя строчками, но мы хотим в дальнейшем пользоваться удобством работы с опциями контроллера, поэтому задали свойство $useOptions.

Вы не поверите, но пустой компонент с контроллером уже готов! Можно пользоваться!
Но лично мне этого мало, я хочу иметь управляемый компонент. Поэтому сразу сделаем форму опций для него в Админке.

Добавляем опции компонента

Что мне очень нравится в Двойке – у неё очень продуманная структура и логика работы. От этого получается простота в использовании. Для добавления опций нужно всего два файла: бэкенд («админская» часть) и сама форма опций.

Пустой бэкенд делается так же просто, как и фронтенд. Создаём файл /system/controllers/webman/backend.php с кодом
  1. <?php
  2.  
  3. class backendWebman extends cmsBackend {
  4.  
  5. protected $useOptions = true;
  6.  
  7. public $useDefaultOptionsAction = true;
  8.  
  9. public function actionIndex() {
  10. $this->redirectToAction('options');
  11. }
  12.  
  13. public function getBackendMenu() {
  14. return array(
  15. 'title' => LANG_OPTIONS,
  16. 'url' => href_to($this->root_url, 'options')
  17. ),
  18. );
  19. }
  20. }
Здесь название компонента пишем уже с заглавной буквы, чтобы отделить его от префикса ‘backend’.
Свойство $useOptions нам уже знакомо, а $useDefaultOptionsAction указывает бэкенду использовать стандартные методы работы с опциями.
Метод actionIndex() редиректит с ссылки site/admin/controllers/edit/webman на site/admin/controllers/edit/webman/options, чтобы из списка компонентов cразу открывать опции нашего компонента.
Метод getBackendMenu() добавляет кнопочку «Опции» над формой, чтобы видеть где мы находимся. Можно и без него, но с кнопочкой красивее.

В папке компонента создаём папку backend, в ней папку forms, а в ней файл опций form_options.php. Получаем такой путь /system/controllers/webman/backend/forms/form_options.php
Код для него:
  1. <?php
  2.  
  3. class formWebmanOptions extends cmsForm {
  4.  
  5. public $is_tabbed = true;
  6.  
  7. public function init() {
  8.  
  9. return array(
  10.  
  11. 'type' => 'fieldset',
  12. 'title' => LANG_WEBMAN_OPT_TAB_TEST,
  13. 'childs' => array(
  14.  
  15. new fieldCheckbox('is_it_works', array(
  16. 'title' => LANG_WEBMAN_OPT_IS_IT_WORKS,
  17. )),
  18.  
  19. )
  20. ),
  21.  
  22. );
  23.  
  24. }
  25.  
  26. }
По сути, в этом файле мы свойством $is_tabbed сказали, что форма опций будет с табами – так и красивее, и удобнее при большом количестве опций. А потом в методе init() возвращаем массив с полями нашей формы. В данном случае это одна вкладка (fieldset) с названием ‘TEST’ и одним полем типа сheckbox с именем 'is_it_works' и заголовком 'Заработало!'.
Подробнее про опции в документации «Стандартная форма опций в админке»

Файлы языков

Обратите внимание, в форме опций использованы две языковые константы (начинаются на ‘LANG_’). Понимаю, что хотелось бы сразу вписать нужные строки в код, но правильнее вынести их константами в языковые файлы. Это просто.

Создаём файл для русского языка /system/languages/ru/controllers/webman/webman.php и добавляем туда наши константы
  1. <?php
  2.  
  3. define('LANG_WEBMAN_CONTROLLER', 'Хуки-хухуки');
  4.  
  5. define('LANG_WEBMAN_OPT_TAB_TEST', 'Тест');
  6.  
  7. define('LANG_WEBMAN_OPT_IS_IT_WORKS', 'Заработало!');
  8.  
В первой строке константа LANG_WEBMAN_CONTROLLER задаёт имя вашего компонента, отображаемое в Админке. Далее можете писать любые свои константы с именами, начинающимися на LANG_ИМЯКОМПОНЕНТА_

При необходимости можете создать такие же файлы с переводом на другие языки. Например, для английского /system/languages/en/controllers/webman/webman.php

Вы же помните, что везде имя webman нужно заменить на своё имя компонента с сохранением регистров символов?

Инсталляционный пакет

Компонент для хуков полностью готов. Осталось только зарегистрировать его в системе. Это можно сделать по-старинке, запросом в базу данных. Но мы сделаем правильно — инсталляционным пакетом.
Внимательно читаем «Создание пакета дополнения CMS»

Создаём отдельную папку (не в папках сайта!) webman_install_0.0.1. В ней создаём папку package, в которую с сохранением структуры папок копируем все добавленные нами файлы.


Рядом с папкой package создаём файл manifest.ru.ini с описанием нашего пакета:
  1. [info]
  2. title = "Хуки-хухуки"
  3.  
  4. [version]
  5. major = "1"
  6. minor = "0"
  7. build = "0"
  8. date = "20210125"
  9.  
  10. [depends]
  11. core = "2.14.0"
  12.  
  13. [install]
  14. type = "component"
  15. name = "webman"
  16.  
  17. [author]
  18. name = "WebMan"
  19. url = "/users/WebMan"
  20.  
  21. [description]
  22. text[] = "Мой компонент для хуков."
  23.  
Имя пакета, название и автора меняете на свои. При необходимости можете создать такие же файлы манифеста и для других языков.
Запаковываем манифест и папку с файлами пакета (всё, что внутри папки webman_install_0.0.1, без неё самой) в архив webman_install_0.0.1.zip.

Устанавливаем полученный пакет стандартным образом через Админку. Если ставите на тот же сайт, где уже добавили все файлы, то шаг копирования на ftp пропускайте, чтобы только зарегистрировался компонент.
После этого открываем «Компоненты», находим свой компонент и кликом по названию открываем его опции. Теперь можем изменять и сохранять настройки компонента. Заработало!


Поздравляю с первым компонентом!

Ссылка на готовый пакет для ленивых webman_install_1.0.0.zip
Но всё же настоятельно рекомендую создать компонент с более подходящим для вас именем вручную, чтобы понять как это делается и чтобы потом вносить в него нужные вам хуки.

Примечание: для наших целей – обработка хуков – можно было и не создавать контроллер frontend.php – он нужен для обработки пользовательской части сайта или для основной логики компонента. Но мало ли что мы захотим делать в компоненте дальше, так что пусть будет.
А что мы будем с ним делать дальше — читайте в следующих выпусках. 😊
0
Реклама Реклама #
+4
KoRn KoRn 7 месяцев назад #
Ура, неужели кто то распишет как создать "плюшки" dance Продолжайте, интересная идея! Если будет канал на ютуб - подпишусь.
+2
Loadырь Loadырь 7 месяцев назад #
Как создать "плюшки" уже расписали, поэтому ждём ваших "плюшек" в каталоге дополнений smile
+4
WebMan WebMan 7 месяцев назад #
Та я продолжу парой примеров - не вопрос. Лишь бы у вас хватило смелости и терпения попробовать сделать своё на базе прочитанного. joke
0
Алексей Алексей 7 месяцев назад #
Спасибо изучаю-буду пребывать воплотить одну идею
0
Алексей Алексей 7 месяцев назад #
Пробовать*
+1
IamB IamB 7 месяцев назад #
WebMan, благодарю за ваш труд! Материал доступный и, что важно, практический. Именно этого практического мостика мне порой не хватает в штатной документации, читаешь - мысль улавливаешь, а с применением возникают трудности. Очередная ваша статья отправляется в закладки. Пишите ещё.
+1
fincheck fincheck 7 месяцев назад #
Заранее прошу прощения у моих коллег-программистов, за то, что я отбираю немного хлеба у богатых продвинутых программеров и отдаю его начинающим.
Думаю продвинутые разработчики как раз будут только за такие мануалы, так как меньше будет вопросов у нубов, да и сослаться при случае можно будет(мол читать здесь). А вот как раз "начинающие", которые научились лепить и этим приторговывали будут не в восторге. laugh
Спасибо огромное за труды, пошёл уже чаю наливать.
+5
Ris Ris 7 месяцев назад #
Тоже сделал себе такой компонент, когда делал рефакторинг сайта.
Только еще модель есть пустая, чтобы не писать в хуках каждый раз обращение к модели какого-нибудь контроллкра.
Сгрёб туда все хуки из всех компонентов и все хроны тоже. Теперь имею этакий миникомпонент, состоящий целиком из хуков и с целой простынёй опций и настроек. smile
Буквально до последнего времени приходилось под каждый хук писать отдельный миникомпонент, чтобы при обновлении манифест не обновлялся, но буквально 19 дней назад нам всем амнистия вышла. С новой версии Инстанта манифесты будут не нужны. Можно будет делать хуки без отдельного компонента. dance
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.