hook_form_alter yürütme sırası


10

Bir modülün ağırlığını değiştirmeden veya Drupal Core'u hacklemeden Drupal 7'de hook_form_alter'ın yürütme sırasını değiştirmenin bir yolu var mı?

Çeviri modülünden translation_form_node_form_alter'da eklenen öğeyi değiştirmeye çalışıyorum . Formda hata ayıklama yaparken öğeyi bulamıyorum, bu yüzden kanca modülümün çeviri modülünde olandan önce yürütüldüğünü varsayıyorum.

Yanıtlar:


2

Ben öyle düşünmüyorum. translation_form_node_form_alter()uygular hook_form_BASE_FORM_ID_alter()Aradım inanıyoruz sonra hook_form_alter() bu kadar bile modül ağırlığı değiştirmek, yeterli olmaz. Bence iki seçeneğiniz hook_form_BASE_FORM_ID_alter()bir modül kullanmak ve yeterince yüksek bir modül ağırlığına sahip olmak ya da hook_form_FORM_ID_alter()(mümkünse) kullanmaktır.


hook_form_FORM_ID_alter () hook_form_alter () sonra çağrılır
iStryker

Hook_form_form_id_alter ve modül ağırlığı kullanarak çözüldü.
Bart

@Bart'ı kullandıysanız, hook_form_FORM_ID_alter()benim anlayışım, ağırlığı hiç değiştirmenize gerek olmamasıdır (çünkü tüm hook_form_FORM_ID_alter()aramalar sonuçta yapılır hook_form_BASE_FORM_ID_alter()).
Andy

@Andy, ağırlığı ayarlamadan foo_form_page_node_form_alter kullanırsam işe yaramaz.
Bart

1
@Bart Sana bu ayrıntıları vermek için kaynakta bakıyordu - altını kontrol drupal_prepare_form()ve drupal_alter(). Dokümanların göründüğünü zaten fark etmiştim, bu yüzden bir sorun yarattım . Neden sistem ağırlığını değiştirmeden sizin için işe yaramıyor!
Andy

17

Ayrıca belirtmek gerekirse, hook_module_implements_alter () adında yeni bir drupal 7 API'sı var .

Bunun ne kadar kolay olduğunu gösteren API belgelerinden örnek kod:

<?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;
  }
}
?>

Bu tam kod ile kanca son yürütmek mümkün. Teşekkürler!
Beau

4

Hook_form_alter modülünden sonra hook_form_alter öğenizin çağrılmasını sağlamak için:

/**
 * 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;
  }
}

Bu, diğer modül varyasyonda bir form_alter kancası sağladığında da çalışır: hook_form_FORM_ID_alter. (bunu belgelerde açıklarlar : hook_module_implements_alter ).

Bu yazının wiifm'in yazısına oldukça benzediğini biliyorum, ancak hook_form_alter ile bir örnekle yararlı olduğunu düşündüm


Benim için çalışmadı.
Achraf JEDAY
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.