Drupal 8 это не монолитная система, в которой все идеально и ничего не нужно менять. Очень часто клиенты просят добавить ту или иную фичу на сайт. Для того чтобы можно было обслуживать код ядра друпала и наших дополнительных хотелок, в друпале мы используем модули. Модульная система позволяет расширять возможности друпала. Но что если нам нужно расширить возможности уже готового контрибного модуля? Мы, конечно, можем отправить запрос на доработку нужного нам функционала, создав issue на drupal.org и возможно через месяц, два.. год, два мы получим нужный нам функционал в том или ином модуле. Но мы можем поступить по другому и написать нужный нам код сами. Для того чтобы расширять возможности дополнительных модулей друпала, а также самого друпала мы будем применять hook'и и plugin'ы в своих собственных модулях.
Основная идея состоит в том, чтобы нам не нужно было поддерживать код друпала, код дополнительных модулей и в этом выходила у нас большая экономия на оплату работы программиста. Для того, чтобы можно было безболезнено обновлять код модулей и друпала нельзя вносить изменения в ядро друпала и контрибные модули. Иначе все ваши изменения будут затерты при следующем обновление модуля или ядра друпала.
Для взаимосвязи модулей и ядра Друпала, а также модулей между собой, в Друпале есть система хуков. Хук это обратный вызов функции, то есть когда выполнение кода доходит до хука, то происходит добавление кода нашей функции, которую мы дописываем в своем модуле. Таким образом мы можем обработать данные пользователя, меню, таксономии, нод различных контент типов в каждый момент из изменения, добавления, удаления или просто загрузки и отображения. Хуков для 8го друпала довольно много, но уже меньше по сравнению с 7ым друпалом, очень многие хуки были реализованы через сторонние компоненты symfony:
https://api.drupal.org/api/drupal/core%21core.api.php/group/hooks/8.2.x
Если посмотрите 7ую версию, то просто устанешь листать страницу хуков вниз:
https://api.drupal.org/api/drupal/includes%21module.inc/group/hooks/7.x
Но это не значит что 8ой Drupal стал менее мощным, просто все то что реализуется в 7ом друпале хуком, в 8ом нужно добавить для этого соответствующий плагин.
Если вы внимательно посмотрите на список хуков в 8ом друпале, то увидет в их название _alter на конце, это означает что этот хук предназначен для изменения значений переменных, например:
hook_form_alter() - позволяет изменить массив формы в процессе ее обработки в друпале. Позже мы разберем как генерируются формы из массивов в друпале. Чтобы применить этот хук в модуле, как и остальные хуки, мы просто пишем функцию:
function mymodule_form_alter() { // меняем массив формы }
Я упростил пример, не написал аргументы функции, namespaces, с этим мы еще разберемся, пока мы должны вникнуть как в общем случае работают хуки. Mymodule это наш модуль, мы пишем вместо слова hook название нашего модуля и функция автоматически подхватается и изменяет массивы формы. Как это работает? В методе prepareForm вызывается другой метод alter():
$this->moduleHandler->alter($hooks, $form, $form_state, $form_id);
Это значит, что каждый модуль в друпале реализующий hook_form_alter(), вставляет свой код в это место. Таким образом если мы добавим код в какое-то место в друпале, то первым делом мы должны это делать через hook, потом через plugin и если уже совсем невозможно не изменить контрибный модуль, то мы патчим/хакаем/изменяем модуль (к сожалению, приходится делать и так). Пока перед нами не стоит задач, которые требуют изменять контрибные модули, поэтому давайте научимся писать свои модули.
Комментарии
Добавить комментарий
Добрый день!
Добрый день!
Скажите, пожалуйста, вот мне дебагер (Devel Kint) в месте вывода "views-view-list--slider.html.twig" пишет что я могу использовать хук
Как мне в bootstrap.theme обозначить этот хук, чтобы я мог добавить в шаблон переменные?
Вот это не работает:
Для каждого шаблона можно
Для каждого шаблона можно определить preprocess, то есть использовать хук и добавить переменные,
Соответсвенно этот код будет работать для шаблонов html.html.twig, page.html.twig.
Для препроцесса шаблона node.html.twig:
Все поля можно также препроцессить через hook_preprocess_field(), field.html.twig шаблона соотвественно:
Для препроцесса шаблона блока используйте THEMENAME_preprocess_block():
Даже если шаблон будет переопределен, препроцесс все равно будет работать. То есть попробуйте использовать препроцесс THEMENAME_preprocess_field(), только добавьте проверку на имя поля, чтобы ваш код применялся только к одному полю.
Тоже самое и с остальными шаблонами.
Для хлебных крошек:
Вот список препроцессов для bootstrap темы для 8го друпала с одного из действующих сайтов:
В вашем случае функция будет THEMENAME_preprocess_views_view_fields__slider(&$variables), THEMENAME замените на имя своей темы и скиньте всю функцию в файл THEMENAME.theme.
Буду разбираться
Буду разбираться
Большое спасибо и дай вам Бог здоровья.
Как вывести переменные в hook
Я пробовал:
1. mail(.... print_r($vars)) - сервер отвечает ошибкой 500 (мало ОЗУ наверное)
2. print_r($vars); die(); - сервер падает с 500
3. Вывожу через {{ kint() }} - там СТОЛЬКО всего О.о
Обычно настраивают xdebug и
Обычно настраивают xdebug и смотрят переменные в PhpStorm:
http://drupalbook.ru/drupal/nastroyka-xdebug-v-open-server-dlya-phpstorm
По поводу ошибок во-первых нужно включить их вывод:
http://stackoverflow.com/questions/5438060/showing-all-errors-and-warnings
Также посмотрите таблицу watchdog, в ней друпал записывает ошибки и логи сайта.