Kadang-kadang ketika saya mencoba menerapkan pengait, hanya untuk menyadari itu seharusnya ada dalam file modul.
Apakah ada cara untuk mengetahui kait apa yang dapat diimplementasikan dalam file template.php tema, atau yang ada di modul?
Kadang-kadang ketika saya mencoba menerapkan pengait, hanya untuk menyadari itu seharusnya ada dalam file modul.
Apakah ada cara untuk mengetahui kait apa yang dapat diimplementasikan dalam file template.php tema, atau yang ada di modul?
Jawaban:
Secara umum, hanya kait yang dapat diterapkan oleh tema, yang berarti kait seperti hook_form_alter()
dan hook_menu_alter()
, atau singkatnya, semua kait yang dipanggil melalui drupal_alter()
Drupal 7 dan lebih rendah ( ModuleHandler()::alter()
atau ThemeManager::alter()
dalam Drupal 8).
Kait lain, yang dipanggil oleh module_invoke_all()
( ModuleHandler::invokeAll()
dalam Drupal 8), jangan diminta untuk tema hanya karena kode tidak memeriksa apakah tema yang aktif saat ini menentukan kait apa pun.
foreach (module_implements($hook) as $module) {
$function = $module . '_' . $hook;
if (function_exists($function)) {
$result = call_user_func_array($function, $args);
if (isset($result) && is_array($result)) {
$return = array_merge_recursive($return, $result);
}
elseif (isset($result)) {
$return[] = $result;
}
}
}
Dalam Drupal 8, di mana ModuleHandler
kelas memanggil kait diimplementasikan dari modul dan ThemeManager
kelas memanggil kait diimplementasikan oleh tema, hanya kelas mengimplementasikan invoke()
dan invokeAll()
. Ini berarti bahwa dalam Drupal 8 theme hooks tidak dipanggil, oleh Drupal core.
Ini berlaku untuk kait inti Drupal, dan sebagian besar semua kait digunakan oleh modul pihak ketiga. Kemudian terserah modul untuk memverifikasi kait yang diterapkan oleh suatu tema juga, dan memohonnya. Inilah yang dilakukan modul Views.
// Let modules modify the view just prior to rendering it.
foreach (module_implements('views_pre_render') as $module) {
$function = $module . '_views_pre_render';
$function($this);
}
// Let the themes play too, because pre render is a very themey thing.
foreach ($GLOBALS['base_theme_info'] as $base) {
$function = $base->name . '_views_pre_render';
if (function_exists($function)) {
$function($this);
}
}
$function = $GLOBALS['theme'] . '_views_pre_render';
if (function_exists($function)) {
$function($this);
}
Untuk kait yang digunakan oleh modul pihak ketiga, Anda perlu memeriksa kode yang digunakan untuk menjalankannya. Kemungkinannya adalah hanya pengait yang dipanggil untuk tema, tetapi dalam beberapa kasus juga pengait lainnya dapat diterapkan oleh tema.
Ingatlah bahwa dalam hal tema, tidak semua tema yang diaktifkan diperiksa untuk implementasi pengait, bertentangan dengan apa yang terjadi dengan modul. Hanya tema yang saat ini digunakan dan tema dasar yang diperiksa, seperti yang dilakukan dari modul Views.
theme()
). Jika belum diinisialisasi, tidak akan ada perubahan kait di tema apa pun.
theme()
tidak mengubah tema yang digunakan untuk halaman, tetapi memanggil fungsi untuk membuat data. Itu tidak mengubah tema, misalnya, dari Garland ke Minelli.
drupal_alter()
Anda melihat bahwa itu hanya memanggil alter-hooks dalam tema jika drupal_theme_initialize()
dipanggil sebelumnya. Jika tidak maka tidak ada tema aktif (belum) dan dengan demikian tidak ada kait yang disebut. Setidaknya di D7 tidak ada jaminan kapan drupal_theme_initialize()
dipanggil pertama kali dalam permintaan.