Другие ответы отличные, точные, подробные, но я не уверен, что это «простые слова», объясняющие суть концепции, которую искал просящий.
Я думаю о хуках как о точке, в которой код останавливается и выкрикивает: «У кого-нибудь еще есть что добавить? ». Любой модуль может иметь функцию, которая отвечает на это и запускается с соответствующими данными, передаваемыми ему в этот момент кода.
Хороший простой пример - hook_node_delete () . Любой модуль может использовать его, чтобы все происходило каждый раз при удалении узла. Документы сообщают вам, что этот хук передает модулю объект этого удаленного узла для работы и выделяет другую полезную информацию, например, о точном времени, когда он вызывается (например, это происходит до того, как данные узла фактически удаляются из базы данных). и где в коде Drupal вызывается хук (который может быть в нескольких местах).
Вы можете изучить, какие существуют хуки, и узнать, какие данные им передаются, исследуя вещи, начинающиеся с "hook_" в API Drupal .
Хуки работают по соглашениям об именах: используя в hook_node_delete
качестве нашего примера, когда процесс удаления узла достигает точки, где вызывается хук, для каждого модуля с такой функцией, [modulename]_node_delete()
где слово хук в имени хука заменяется именем модуля (например, my_amazing_module_node_delete()
) эти функции вызываются.
Почему? Таким образом, любой модуль может делать все что угодно в этих ключевых моментах: например, вы можете посмотреть на удаленный узел и сделать что-то, если он удовлетворяет определенному условию (скажем, отправить электронное письмо администратору или запустить длительный процесс).
Некоторые хуки позволяют вам изменять вещи, которые были сгенерированы непосредственно перед их обработкой. Например, hook_menu_alter () передает вам текущие пункты меню, которые сгенерировала система. Любой модуль может определить функцию some_modulename_menu_alter () и просмотреть их, при необходимости изменить их (удалить некоторые, добавить некоторые, отсортировать их ...) и передать вновь измененное меню обратно.
Это просто, действительно мощно и лежит в основе того, как Drupal работает как модульная система. Реализации хуков лежат в основе большинства модулей Drupal.
Просматривая код модуля Drupal, вы можете определить, какие функции происходят из ловушек (в отличие от функций, которые просто вызываются из самого кода модуля), так как сообщество Drupal применяет соглашение, согласно которому каждая реализация ловушки имеет комментарий перед ним, как это (обратите внимание на бит "Implements hook _..."):
/**
* Implements hook_some_hook().
*
* Some descriptive summary of what this does
*/
function my_amazing_module_some_hook() {
Некоторые модули, которые действуют как API, определяют свои собственные хуки. Например, Views определяет множество хуков, которые позволяют добавлять, считывать и редактировать данные в различных точках в процессе создания или отображения представления. Вы можете найти информацию о хуках, созданных в пользовательских модулях, из двух мест (при условии, что модуль следует соглашениям и т. Д.):
Начальная загрузка, как объяснили другие, в основном загружается - я не буду дублировать другие хорошие четкие объяснения.
С точки зрения непрофессионала, ловушки - это своего рода мосты, которые обеспечивают способ взаимодействия модулей друг с другом, изменения структуры и данных друг друга, предоставления новых данных и т. Д.
В большинстве случаев слово
hook_
в именах функций заменяется именем вашего модуля, и это дает возможность вашему модулю подключиться к работе другого модуля. Например, модуль ядра drupal под названием «узел» вызывает различные хуки. Один из нихhook_node_update
вызывается каждый раз, когда обновляется существующий узел. Когда этот крюк вызываются, ваш модуль (скажем , мы называем егоmymodule
) реализациейhook_node_update
называется, которая в данном случае будет являться функцией в .module файл вашего модуля называетсяmymodule_node_update
(Очевидно , что эта функция может быть в любом файле в папке вашего модуля, пока он также включен в файл .module). В этот хук также будут переданы необходимые параметры (переменные), которые он может использовать, изменять и / или возвращать обратно в функцию, которая вызвала хук.Когда я впервые начал изучать Drupal, я был в той же лодке, что и вы сейчас, сначала немного сложно понять, но как только вы его получите, это так просто и интуитивно понятно. Удачи.
источник
Один из разработчиков ядра недавно написал статью под названием «Программирование на Drupal с объектно-ориентированной точки зрения» . Он хорошо объясняет, как можно рассматривать хуки как реализацию многих общих шаблонов проектирования . Лучшее объяснение хуков можно найти в статье:
источник
Bootstrap - это процесс, через который проходит Drupal для создания страницы, в основном работающей над всем ядром, темой и модульным кодом по порядку.
Это в основном то, как загружается Drupal, и готовится выполнить свою работу в качестве CMS.
Это умно, так как позволяет нам устанавливать хуки в любом месте наших модулей и тем, а процесс начальной загрузки гарантирует, что они запускаются в нужной точке.
Например, если вы используете 'hook_form_alter' для добавления настраиваемого флажка в форму, начальная загрузка Drupal удостоверится, что он выполняет этот код, непосредственно перед тем, как он отобразит вашу форму.
Одна из проблем начальной загрузки заключается в том, что весь процесс требует времени, даже если вы только возвращаете небольшой объем данных. При использовании Drupal с модулем services в качестве API и возврате множества небольших ответов XHTML или JSON выполнение всей начальной загрузки не очень эффективно. Некоторые умные люди ищут обходные пути для Drupal 8.
Но для рендеринга обычных страниц Drupal процесс начальной загрузки работает отлично, он использует систему кэширования Drupals для ускорения работы и дает вам полный контроль над каждой частью вашего сайта. Если вы обнаружите, что ваш сайт работает медленно, вы всегда можете использовать что-то вроде APC или MemCached, чтобы ускорить процесс.
Я надеюсь, что мой ответ был точным и объясняет вещи просто для вас, я не эксперт, но я думаю, что так оно и есть.
источник
Bootstrap - это процесс, во время которого Drupal инициализирует себя; процесс на самом деле включает в себя:
$_SERVER
init_set()
Некоторые из описанных мною операций специфичны для Drupal 7 или выше, но большинство операций не зависят от версии Drupal.
Хук - это PHP-функция, которую можно вызывать из Drupal или сторонних модулей, когда это необходимо для выполнения задачи. Вместо того, чтобы иметь префиксный список функций для вызова, этот список является сборкой, проверяющей включенные модули и функции, которые они реализуют.
Например, Drupal использует
hook_node_update()
; когда узел сохраняется с помощью node_save () , выполняется следующий код.Что делает node_invoke () :
$node
качестве параметраХуки могут сохранять свои собственные данные в базе данных или изменять значение, возвращаемое функцией. Последний случай, например, происходит с hook_form_alter () , который изменяет значение,
$form
переданное в качестве ссылки на drupal_prepare_form () .Хуки Drupal обычно вызываются с помощью трех функций:
drupal_alter()
является функцией, используемой для вызова определенных хуков, целью которых является изменение данных, переданных им в качестве ссылки, таких как hook_form_alter () , hook_hook_info_alter () и hook_tokens_alter () .Есть и другие функции, которые используются для вызова хуков, например
node_invoke()
, но эти функции по существу используют одну из функций, которые я перечислил ранее.источник
Крючки являются точечными и
module_invoke_all
ткачами (увы, мы не совсем понятны в реализации и есть другие функции плетения). Насколько мне известно, Drupal является единственной системой, которая реализует AOP с функциями PHP.Посмотрите другое объяснение о том, как АОП работает в Drupal?
источник
Если вы хотите увидеть хуки, которые Drupal позволяет вам вызывать, перейдите на api.drupal.org , перейдите в окно поиска и введите «hook_». Это даст вам большой список большинства хуков, определенных Drupal. Сделайте то же самое для «_alter» и посмотрите еще больше.
Страница Hooks Node API предлагает хронологический список всех хуков, вызванных во время операций узла. Вы можете видеть модуль Node и системы Entity и Field, дающие друг другу повороты при вызове хуков.
Например, если вы прокрутите вниз и посмотрите на раздел
node_load()
: Модуль Node даст вам hook_load (), а затем передаст управление системе управления данными, которая загружает некоторые поля. Существует целый ряд перехватчиков полей, которых нет в списке, и затем, когда все закончится, активируется система управления даннымиhook_entity_load()
, прежде чем передать управление обратно в Node, который вызываетhook_node_load()
.Это дает вашему коду возможность воздействовать на рассматриваемый узел по мере его загрузки по частям. Изучение этих хуков и когда и почему они называются, является частью приключения Drupal кодирования. :-)
В других системах тоже есть крючки. Такие как
hook_init()
иhook_boot()
. Это касается начальной части вашего вопроса.hook_boot()
вызывается Drupal до загрузки системы кэширования. Поэтому, если вашему модулю нужно что-то сделать до того, как Drupal действительно запустится, и вы хотите, чтобы ваш код выполнялся независимо от кэширования, вы должны реализовать этоhook_boot()
. В противном случае, если вы заботитесь только о страницах, которые не кэшированы, вы бы реализовалиhook_init()
.Это дает вам возможность реализовать что-то в начале процесса загрузки, до полной загрузки Drupal, и при этом дает вам некоторую гибкость в отношении того, какой момент процесса вы хотите перехватить.
Если вам необходимо убедиться, что Drupal загрузился до определенной точки, прежде чем продолжить, вы можете позвонить
drupal_bootstrap()
. Если вы перейдете к этой документации, вы увидите доступные уровни начальной загрузки, от ничего до всего.И, наконец, вы можете увидеть подробный документированный код для любой подсистемы в проекте примеров .
источник
Хуки - это php-функции, строительные блоки, основанные на соглашениях об именах «yourmodulename_hookname», они предназначены для облегчения возможности разработчиков создавать модули .
Модули - это реальная сделка, потому что они обеспечивают как CORE, так и пользовательские функции в вашей системе Drupal. Таким образом, модули состоят из хуков, и когда модуль активируется в вашей установке Drupal, его функции хуков могут вызываться из других модулей благодаря функции module.inc module_invoke_all ($ hook) или module_invoke.
Поэтому, чтобы правильно понять, что такое хуки, вы должны действительно испачкать руки и попробовать разработку модулей. Для этого, начав загружать и пробовать некоторые примеры Drupal для разработчиков , вы также должны ознакомиться с созданием модулей .
Вот некоторые из полезных примеров Drupal для разработчиков, упомянутых выше:
Пример реализации hook_block_view () в модуле block_example
Этот хук дает вам доступ к созданию блоков Drupal для отображения пользовательских блоков на вашем сайте. Это возможно потому, что в block.module есть функция _block_render_block, которая позволяет всем модулям определять свое представление hook_block (обратите внимание на последнюю строку module_invoke):
Пример реализации hook_menu () в модуле render_example
Этот хук связан с системой маршрутизации URL в Drupal и определяет шаблоны URL со связанными обратными вызовами рендеринга, используемыми вашим модулем. Он вызывается из system.module .
Что касается начальной загрузки, в основном вам просто нужно знать, что она выполняется при каждом запросе страницы. Я действительно советую вам прочитать этот ответ stackoverflow , он объясняет, как bootstrap и ловушки связаны, но разделены.
Что касается отображения веб-страницы, то отображение html веб-сайта Drupal в основном достигается с помощью массивов рендеринга и тематики.
источник
Везде, где модуль вызывает module_implements () http://api.drupal.org/api/drupal/includes%21module.inc/function/module_implements/7 Drupal будет запускать все правильно названные функции в правильном порядке в зависимости от их веса. Они называются функциями перехвата, потому что в документации для модулей, которые используют module_implements, вы видите такие вещи, как hook_menu (когда меню вызывает все функции, предназначенные для возврата пунктов меню). Слово «крючок» просто нужно заменить на имя модуля, реализующего его, а Drupal сделает все остальное.
Есть также функция drupal_alter (), которая запускает все правильно названные функции alter с намерением позволить вам изменять вещи, которые были ранее зарегистрированы другим хуком.
Обычно alters передает аргументы по ссылке, так что вы можете редактировать объект напрямую, тогда как «обычные» ловушки обычно заставляют вас возвращать новые вещи.
Идея состоит в том, что любой модуль (включая ваш собственный) можно легко расширить, попросив Drupal вызвать все необходимые функции ловушек и вернуть то, что они возвращают для обработки. Модуль, вызывающий функции ловушки, не должен ничего знать о модулях, которые реализуют ловушки, и модулям, реализующим ловушку, действительно не нужно ничего знать о модуле, вызывающем ловушку. Единственное, что нужно знать обоим модулям, - это структура данных, которые возвращаются или изменяются.
На практике крючки чаще всего используются для:
источник
У вас есть много ответов выше, но я хочу дать ответ гораздо более простым способом, чтобы понять основную концепцию, стоящую за крючками. Хуки на самом деле встроены в ядро drupal для управления разными вещами и выполняют разные задачи в ядре. Вы можете синхронизировать свои собственные функции с этими встроенными функциями ядра drupal, чтобы добавить их функциональность в свои собственные функции, вызывая различные хуки.
Я надеюсь, что вы получите точку!
источник
Для меня это все о функции module_implements, когда дело доходит до хуков и ядра (D7). Одна вещь, которую я считаю крайне важной для понимания, заключается в том, что, написав хук для изменения чего-либо, вы никоим образом не можете сказать, что происходит со структурами данных, с которыми вы имеете дело. Ваш хук просто попадает в строку (очередь) функций, которые ТАКЖЕ действуют на одни и те же структуры данных, будь то меню, ссылки меню, блоки, узлы, пользователи или любой объект или элемент рендеринга.
Таким образом, чтобы действительно увидеть, как ваши крючки используются ожидаемым образом, вам нужно знать или знать, где вы (ваш крючок) стоят в очереди. Это определяется весом вашего месяца. Ядро Drupal просто вызывает правильно именованные хуки в порядке возрастания веса, и происходит то, что происходит с данными.
Я писал хуки до того, как это не имело никакого эффекта, только для того, чтобы после нескольких часов ударов головой узнать, что вес моего модуля был слишком легким, а последующие хуки фактически не выполняли то, что я делал, или полностью игнорировали все это вместе.
Хорошо написанный хук не будет «ручным человеком» или «заставит» себя быть последним, но будет «хорошо ладить с другими», следя за тем, чтобы они поддерживали структуры данных, как и ожидалось остальными хуками в конце.
И если говорить о «Линии» крючков. На протяжении многих лет я проверял Google для Drupal, это изображение, кажется, является хорошим представлением списка возможностей для предварительной обработки и перехвата процесса.
источник
Проще говоря, хуки помогают разработчику изменять существующую функциональность в соответствии с требованиями, не внося изменений в существующий код. Больше похоже на абстрактную функцию в php.
Пример: вы создали модуль для бронирования автобусного билета. Согласно вашему коду, если билет был забронирован, то место получения невозможно изменить, что было вашим требованием для этого проекта. Предположим, вашему другу нужен такой же модуль для аналогичного требования, за исключением того, что пользователь может изменить место получения. Каким-то образом он должен использовать ваш модуль, и вы не хотите, чтобы он делал какие-либо изменения кода. Таким образом, вы предоставляете интерфейс (зацепка в нашем случае), где он может реализовать свои изменения без внесения изменений в ваш модуль.
В drupal до drupal-7 у нас есть хуки для модулей и тем. Чтобы узнать , как проверить крюк работа является Drupal.org крючков для создания проверки пользовательского крюка этой ссылки
источник
Крючки. Разрешить модулям взаимодействовать с ядром Drupal. Модульная система Drupal основана на концепции «крючков». Хук - это PHP-функция с именем foo_bar (), где «foo» - это имя модуля (имя файла которого, таким образом, foo.module), а «bar» - это имя хука.
источник