Іноді, коли я намагаюся застосувати гачок, просто зрозумів, що він повинен бути у файлі модуля.
Чи є спосіб дізнатися, які гачки можуть бути реалізовані у файлі template.php теми чи одному в модулі?
Іноді, коли я намагаюся застосувати гачок, просто зрозумів, що він повинен бути у файлі модуля.
Чи є спосіб дізнатися, які гачки можуть бути реалізовані у файлі template.php теми чи одному в модулі?
Відповіді:
Взагалі кажучи, змінювати тільки гачки можуть бути реалізовані з допомогою тим, що означає , як гачки 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);
}
Для гачків, які використовуються сторонніми модулями, потрібно перевірити код, який використовується для їх виклику. Цілком ймовірно, що для тем викликаються лише зміни на гачки, але в деяких випадках також можуть бути реалізовані інші гачки за темами.
Майте на увазі, що у випадку з темами не всі включені теми перевіряються на реалізацію гака, незважаючи на те, що відбувається з модулями. Перевіряється лише використовувана в даний час тема та основні теми, як це зроблено з модуля «Перегляди».
theme()
). Якщо вона не була ініціалізована, жодні зміни гаків у будь-якій темі не виконуватимуться.
theme()
не змінює тему, що використовується для сторінки, але вона викликає функцію візуалізації даних. Це не змінює тему, наприклад, від Гарланда до Мінеллі.
drupal_alter()
ви побачите, що він лише викликає альтер-гаки в темі, якщо drupal_theme_initialize()
був зателефонований раніше. Якщо цього не було, то немає активної теми (поки), і тому не закликаються гачки. Принаймні, у D7 немає гарантії, коли drupal_theme_initialize()
викликається вперше у запиті.