замовлення на виконання гачка_форма_альтера


10

Чи є спосіб змінити порядок виконання mock_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()(якщо можливо).


гак_форма_FORM_ID_alter () Іменований після гачки_форма_алтер ()
iStryker

Вирішили це за допомогою гачки_form_form_id_alter та ваги модуля.
Барт

@Bart, якщо ви використовували, hook_form_FORM_ID_alter()тоді я розумію, що вам не потрібно змінювати вагу взагалі (адже всі hook_form_FORM_ID_alter()дзвінки здійснюються все-таки hook_form_BASE_FORM_ID_alter()).
Енді

@Andy, здається, не працює, якщо я використовую foo_form_page_node_form_alter без коригування ваги.
Барт

1
@Bart Я дивився на джерело, щоб надати вам ці деталі - ознайомтеся з нижньою частиною drupal_prepare_form()та drupal_alter(). Я вже помічав, що документи здаються вимкненими, тому я створив проблему . Не знаю, чому це не працює для вас, не змінюючи вагу системи тхо!
Енді

17

Також варто згадати, є новий API drupal 7, який називається mock_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;
  }
}
?>

Мені вдалося остаточно виконати свій гак із цим точним кодом. Дякую!
Бо

4

Ось, як переконатися, що ваш кука_форма_алтер викликається після інших модулів гак_форма_алтер:

/**
 * 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 у варіації: hok_form_FORM_ID_alter. (вони пояснюють, що це в документації: ho_module_implements_alter ).

Я знаю, що ця публікація досить схожа на публікацію wiifm, але вважала її корисною на прикладі з mong_form_alter


Не працювало для мене.
Achraf JEDAY
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.