perintah pelaksanaan hook_form_alter

10

Apakah ada cara untuk mengubah urutan pelaksanaan hook_form_alter di Drupal 7 tanpa mengubah bobot modul atau meretas Drupal Core?

Saya mencoba mengubah elemen yang ditambahkan di translation_form_node_form_alter dari modul terjemahan. Ketika debugging formulir saya tidak dapat menemukan elemen jadi saya menganggap kait saya dieksekusi sebelum yang ada di modul terjemahan.

Bart
sumber

Jawaban:

2

Saya kira tidak. translation_form_node_form_alter()mengimplementasikan hook_form_BASE_FORM_ID_alter()yang saya percaya dipanggil setelah hook_form_alter() , jadi bahkan mengubah berat modul tidak akan cukup. Saya pikir dua opsi Anda adalah menggunakan hook_form_BASE_FORM_ID_alter()dan memastikan Anda memiliki berat modul yang cukup tinggi, atau gunakan hook_form_FORM_ID_alter()(jika mungkin).

Andy
sumber
hook_form_FORM_ID_alter () dipanggil setelah hook_form_alter ()
iStryker
Memecahkannya menggunakan hook_form_form_id_alter dan bobot modul.
Bart
@Bart jika Anda menggunakan hook_form_FORM_ID_alter()maka pengertian saya adalah bahwa Anda tidak perlu memodifikasi bobot sama sekali (karena semua hook_form_FORM_ID_alter()panggilan dibuat setelah semua hook_form_BASE_FORM_ID_alter()).
Andy
@Andy, sepertinya tidak berfungsi jika saya menggunakan foo_form_page_node_form_alter tanpa menyesuaikan bobot.
Bart
1
@Bart saya melihat sumber untuk memberi Anda rincian - lihat bagian bawah drupal_prepare_form()dan drupal_alter(). Saya sudah memperhatikan bahwa dokumen itu kelihatan tidak enak, jadi saya membuat masalah . Entah mengapa itu tidak bekerja untuk Anda tanpa mengubah berat sistem tho!
Andy
17

Juga layak disebutkan, ada drupal 7 API baru yang disebut hook_module_implements_alter () yang memungkinkan Anda mengubah urutan eksekusi untuk pengait yang diberikan.

Kode sampel dari API API menunjukkan betapa mudahnya melakukannya:

<?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
sumber
Saya dapat menjalankan hook saya terakhir dengan kode yang tepat ini. Terima kasih!
Beau
4

Berikut adalah cara memastikan hook_form_alter Anda dipanggil setelah modul lain 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;
  }
}

Ini juga berfungsi ketika modul lain telah menyediakan hook form_alter dalam variasi: hook_form_FORM_ID_alter. (mereka menjelaskannya dalam dokumentasi: hook_module_implements_alter ).

Saya tahu bahwa posting ini sangat mirip dengan posting wiifm, tetapi saya pikir ini berguna dengan contoh dengan hook_form_alter

rosell.dk
sumber
Tidak bekerja untuk saya.
Achraf JEDAY