Kait tema vs kait modul

10

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?

hamahama
sumber
4
Umumnya ketika sebuah kait tidak tersedia untuk ditimpa dalam suatu tema, itu adalah alasan yang bagus. Tema hanya untuk kode yang menghubungkan tampilan konten dan fungsionalitas yang disediakan modul. Kode yang menambah / menghapus / mengubah fungsi atau konten biasanya harus ada dalam modul. Pikirkan juga fakta bahwa jika Anda mengubah tema, Anda kehilangan penyesuaian apa pun yang dibuat di template.php, jadi jika Anda membuat perubahan yang mungkin ingin Anda pertahankan jika Anda pernah mengubah tema maka itu pasti ingin dimasukkan dalam modul.
rooby

Jawaban:

11

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 ModuleHandlerkelas memanggil kait diimplementasikan dari modul dan ThemeManagerkelas 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.

kiamlaluno
sumber
hook_entity_view_alter () tidak berfungsi di tema.
dxvargas
Setidaknya dalam D7 alter-hooks dalam tema hanya dipanggil jika tema telah diinisialisasi dalam permintaan yang sama (mis. Dengan menelepon theme()). Jika belum diinisialisasi, tidak akan ada perubahan kait di tema apa pun.
zwirbeltier
@zwirbeltier Tema kait digunakan untuk tema yang digunakan untuk merender halaman. theme()tidak mengubah tema yang digunakan untuk halaman, tetapi memanggil fungsi untuk membuat data. Itu tidak mengubah tema, misalnya, dari Garland ke Minelli.
kiamlaluno
@kiamlaluno: Jika Anda melihat kode di dalam 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.
zwirbeltier
@zwirbeltier Tema yang ditetapkan dari Drupal sudah diinisialisasi ketika halaman dirender. Jika sebuah modul menetapkan tema untuk sebuah halaman tanpa memanggil fungsi yang sesuai, itu adalah tanggung jawabnya untuk menginisialisasi.
kiamlaluno