Гачки тематичні та модульні


10

Іноді, коли я намагаюся застосувати гачок, просто зрозумів, що він повинен бути у файлі модуля.

Чи є спосіб дізнатися, які гачки можуть бути реалізовані у файлі template.php теми чи одному в модулі?


4
Як правило, коли гачок недоступний для перекриття теми, це з поважних причин. Теми повинні бути лише для коду, що стосується відображення вмісту та функціональності, які надають модулі. Код, який додає / видаляє / змінює функціональність або вміст, як правило, повинен бути в модулі. Також подумайте про те, що якщо ви змінюєте теми, ви втрачаєте будь-які налаштування, зроблені в template.php, тож якщо ви вносите зміни, які ви, ймовірно, хочете зберегти, якщо ви коли-небудь змінили теми, то це, безумовно, захочеться перейти в модуль.
рубін

Відповіді:


11

Взагалі кажучи, змінювати тільки гачки можуть бути реалізовані з допомогою тим, що означає , як гачки hook_form_alter()і hook_menu_alter(), або коротше все ті гачки, які викликаються через drupal_alter()в Drupal 7 і нижче ( ModuleHandler()::alter()або ThemeManager::alter()в Drupal 8).

Інші гачки, на які посилається module_invoke_all()( ModuleHandler::invokeAll()в Drupal 8), не посилаються на теми просто тому, що код не перевіряє, чи визначена в даний час включена тема визначає будь-який гачок.

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

У Drupal 8, де ModuleHandlerклас викликає гачки, реалізовані з модулів, а ThemeManagerклас викликає гачки, реалізовані за темами, реалізує лише перший клас invoke()та invokeAll(). Це означає, що в Drupal 8 гачки теми не викликаються ядром Drupal.

Це справедливо для гачків з сердечником Drupal, і в основному для всіх гаків, які використовуються сторонніми модулями. Потім модуль повинен перевірити, чи гак реалізований темою, і викликати її. Це робить модуль 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);
  }

Для гачків, які використовуються сторонніми модулями, потрібно перевірити код, який використовується для їх виклику. Цілком ймовірно, що для тем викликаються лише зміни на гачки, але в деяких випадках також можуть бути реалізовані інші гачки за темами.
Майте на увазі, що у випадку з темами не всі включені теми перевіряються на реалізацію гака, незважаючи на те, що відбувається з модулями. Перевіряється лише використовувана в даний час тема та основні теми, як це зроблено з модуля «Перегляди».


ho_entity_view_alter () не працює в темах.
dxvargas

Принаймні, у D7 альтер-гачки в темах викликаються лише в тому випадку, якщо тема вже ініціалізована в тому самому запиті (тобто, за допомогою виклику theme()). Якщо вона не була ініціалізована, жодні зміни гаків у будь-якій темі не виконуватимуться.
zwirbeltier

Для теми, що використовується для візуалізації сторінки, викликаються гачки теми @zwirbeltier. theme()не змінює тему, що використовується для сторінки, але вона викликає функцію візуалізації даних. Це не змінює тему, наприклад, від Гарланда до Мінеллі.
kiamlaluno

@kiamlaluno: Якщо ви подивитесь на код, drupal_alter()ви побачите, що він лише викликає альтер-гаки в темі, якщо drupal_theme_initialize()був зателефонований раніше. Якщо цього не було, то немає активної теми (поки), і тому не закликаються гачки. Принаймні, у D7 немає гарантії, коли drupal_theme_initialize()викликається вперше у запиті.
zwirbeltier

@zwirbeltier Тема, встановлена ​​в Drupal, вже ініціалізується, коли сторінка надається. Якщо модуль задає тему для сторінки без виклику відповідної функції, її відповідальність ініціалізувати її.
kiamlaluno
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.