Динамическая регистрация крючка


Можно ли динамически регистрировать крючки? Т.е. не путем жесткого кодирования обработчика крючков в ваш код.

Например, я пишу модуль и хотел бы добавить опцию на некоторые страницы создания типов контента. Я знаю, что это можно сделать с помощью крючка hook_form_FORM_ID_alter, но поскольку я не знаю, какие типы узлов будут существовать в установке drupal, я, очевидно, не могу жестко закодировать крючки.

Или мне придется использовать hook_form_alter или hook_form_BASE_FORM_ID_alter и проверить, должна ли опция быть показано для этой формы? Я бы очень, ОЧЕНЬ хотел избежать этого, так как это действительно неприятное решение.

Или я подхожу к этому неправильно?

Author: kiamlaluno, 2012-12-14

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.)

 1
Author: kiamlaluno, 2012-12-14 20:49:24

Обычный подход заключается в создании формы настроек для вашего модуля и сохранении типов контента, в которые вы хотите, чтобы ваш 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 фактически принимал их во внимание.

 1
Author: cmos, 2012-12-14 20:59:26