порядок выполнения hook_form_alter

10

Есть ли способ изменить порядок выполнения hook_form_alter в Drupal 7 без изменения веса модуля или взлома Drupal Core?

Я пытаюсь изменить элемент, добавленный в translation_form_node_form_alter из модуля перевода. При отладке формы я не могу найти элемент, поэтому я предполагаю, что мой хук выполняется раньше, чем тот, что в модуле перевода.

Барт
источник

Ответы:

2

Я так не думаю. translation_form_node_form_alter()агрегаты, hook_form_BASE_FORM_ID_alter()которые, как я считаю, называются после hook_form_alter() , так что даже изменения веса модуля будет недостаточно. Я думаю, что вы можете использовать два варианта hook_form_BASE_FORM_ID_alter()и убедиться, что у вас достаточно большой вес модуля, или использовать hook_form_FORM_ID_alter()(если это возможно).

Энди
источник
hook_form_FORM_ID_alter () вызывается после hook_form_alter ()
iStryker
Решил это с помощью hook_form_form_id_alter и веса модуля.
Барт
@ Барт, если вы использовали, hook_form_FORM_ID_alter()то, насколько я понимаю, вам вообще не нужно изменять вес (потому что все hook_form_FORM_ID_alter()звонки сделаны в конце концов hook_form_BASE_FORM_ID_alter()).
Энди
@ Энди, похоже, это не сработает, если я использую foo_form_page_node_form_alter без регулировки веса.
Барт
1
@ Барт Я искал источник, чтобы дать вам эти подробности - проверьте в нижней части drupal_prepare_form()и drupal_alter(). Я уже заметил, что документы казались отключенными, поэтому я создал проблему . Не знаю, почему это не работает для вас без изменения веса системы!
Энди
17

Также стоит упомянуть, что есть новый API drupal 7 под названием hook_module_implements_alter (), который позволяет изменять порядок выполнения для данного хука БЕЗ изменения таблицы весов модуля.

Пример кода из документации API, показывающий, как легко это сделать:

<?php
function hook_module_implements_alter(&$implementations, $hook) {
  if ($hook == 'rdf_mapping') {
    // Move my_module_rdf_mapping() to the end of the list. module_implements()
    // iterates through $implementations with a foreach loop which PHP iterates
    // in the order that the items were added, so to move an item to the end of
    // the array, we remove it and then add it.
    $group = $implementations['my_module'];
    unset($implementations['my_module']);
    $implementations['my_module'] = $group;
  }
}
?>
WIIFM
источник
Я смог выполнить свой хук последним с этим точным кодом. Спасибо!
Бо
4

Вот как убедиться, что ваш hook_form_alter вызывается после других модулей hook_form_alter:

/**
 * Implements hook_form_alter().
 */
function my_module_form_alter(&$form, &$form_state, $form_id) {
  // do your stuff
}

/**
 * Implements hook_module_implements_alter().
 *
 * Make sure that our form alter is called AFTER the same hook provided in xxx
 */
function my_module_module_implements_alter(&$implementations, $hook) {
  if ($hook == 'form_alter') {
    // Move my_module_rdf_mapping() to the end of the list. module_implements()
    // iterates through $implementations with a foreach loop which PHP iterates
    // in the order that the items were added, so to move an item to the end of
    // the array, we remove it and then add it.
    $group = $implementations['my_module'];
    unset($implementations['my_module']);
    $implementations['my_module'] = $group;
  }
}

Это также работает, когда другой модуль предоставил хук form_alter в варианте: hook_form_FORM_ID_alter. (они объясняют это в документации: hook_module_implements_alter ).

Я знаю, что этот пост очень похож на пост wiifm, но счел его полезным на примере с hook_form_alter

rosell.dk
источник
Не работал для меня
Achraf JEDAY