Динамическая регистрация крючка
Можно ли динамически регистрировать крючки? Т.е. не путем жесткого кодирования обработчика крючков в ваш код.
Например, я пишу модуль и хотел бы добавить опцию на некоторые страницы создания типов контента. Я знаю, что это можно сделать с помощью крючка hook_form_FORM_ID_alter
, но поскольку я не знаю, какие типы узлов будут существовать в установке drupal, я, очевидно, не могу жестко закодировать крючки.
Или мне придется использовать hook_form_alter
или hook_form_BASE_FORM_ID_alter
и проверить, должна ли опция быть показано для этой формы? Я бы очень, ОЧЕНЬ хотел избежать этого, так как это действительно неприятное решение.
Или я подхожу к этому неправильно?
2 answers
То, что вы описываете, - это то, что Drupal делает в translation_form_node_form_alter() и book_form_node_form_alter(). Оба крючка являются реализациями hook_form_BASE_FORM_ID_alter()
, которые сначала проверяют, следует ли изменять форму.
Крючки - это обычные функции; для их динамического добавления вы должны выполнить код, аналогичный следующему, вне какой-либо функции.
$body = "The body of the function";
foreach (mymodule_get_content_types() as $type) {
eval("function mymodule_form_{$type}_alter { {$body} }");
}
Этот код будет выполняться каждый раз при загрузке файла модуля, и не будет никаких практических извлеките выгоду из использования такого кода.
Учитывая, что Drupal 8 будет использовать Symfony и его контейнер для инъекций зависимостей , предпочтительнее использовать hook_form_BASE_FORM_ID_alter()
до Drupal 8, а затем изменить реализацию с помощью Drupal 8. (В любом случае код модуля уже необходимо изменить для Drupal 8.)
Обычный подход заключается в создании формы настроек для вашего модуля и сохранении типов контента, в которые вы хотите, чтобы ваш hook_form_alter вмешивался. Затем с помощью простой проверки вы можете внести свои изменения. Список типов контента, существующих на определенном этапе в Drupal, легко проверить.
Я не вижу другого способа фактически разместить ваши изменения для определенных типов контента. Даже если вы создадите свой крюк динамически, используя неортодоксальный
foreach ($SELECTED_NODETYPES as $NODETYPE) {
if (!function_exists("my_module_form_$NODETYPE_node_form_alter")) {
function my_module_form_$NODETYPE_node_form_alter (&$form, &$form_state) {
//your alterations
}
}
}
Вам все равно придется иметь список типов узлов для проверки, и при каждом создании нового типа узлов вы должны быть уверены, что очищаете кэш, чтобы ваш модуль объявлял новые крючки, и Drupal фактически принимал их во внимание.