Zasadniczo, gdy haczyk nie jest dostępny do zastąpienia w motywie, to nie bez powodu. Motywy powinny dotyczyć wyłącznie kodu odnoszącego się do wyświetlania treści i funkcjonalności udostępnianych przez moduły. Kod, który dodaje / usuwa / zmienia funkcjonalność lub treść zwykle powinien znajdować się w module. Pomyśl także o tym, że jeśli zmienisz motywy, stracisz wszelkie dostosowania wprowadzone w template.php, więc jeśli wprowadzasz zmiany, które prawdopodobnie chciałbyś zachować, jeśli kiedykolwiek zmieniłeś motywy, to zdecydowanie chciałbyś przejść do modułu.
rooby
Odpowiedzi:
11
Ogólnie rzecz biorąc, tylko haki alter mogą być implementowane przez motywy, co oznacza haki podobne hook_form_alter()i hook_menu_alter(), lub w skrócie, wszystkie haki, które są wywoływane drupal_alter()w Drupal 7 i niższych ( ModuleHandler()::alter()lub ThemeManager::alter()w Drupal 8).
Inne haki, które są wywoływane przez module_invoke_all()( ModuleHandler::invokeAll()w Drupal 8), nie są wywoływane dla motywów po prostu dlatego, że kod nie sprawdza, czy aktualnie włączony motyw definiuje jakiś haczyk.
W Drupal 8, gdzie ModuleHandlerklasa wywołuje haki zaimplementowane z modułów, a ThemeManagerklasa wywołuje haki zaimplementowane przez kompozycje, tylko narzędzia pierwszej klasy invoke()i invokeAll(). Oznacza to, że w temacie Drupal 8 nie są wywoływane haki przez rdzeń Drupala.
Dotyczy to haków rdzeniowych Drupal, a przede wszystkim wszystkich haków używanych przez moduły innych firm. Następnie do modułu należy sprawdzenie, czy haczyk jest zaimplementowany przez motyw i wywołanie go. To właśnie robi moduł Widoki.
// 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);}
W przypadku haków używanych przez moduły innych firm należy sprawdzić kod użyty do ich wywołania. Istnieje prawdopodobieństwo, że przy motywach wywoływane są tylko zaczepy alter, ale w niektórych przypadkach motywy mogą również implementować inne zaczepy.
Należy pamiętać, że w przypadku motywów nie wszystkie włączone motywy są sprawdzane pod kątem implementacji przechwytywania, w przeciwieństwie do modułów. Sprawdzane są tylko aktualnie używane motywy i motywy podstawowe, jak to zrobiono z modułu Widoki.
hook_entity_view_alter () nie działa w kompozycjach.
dxvargas
Przynajmniej w haczykach alter-D7 w motywach wywoływane są tylko wtedy, gdy motyw został już zainicjowany w tym samym żądaniu (tj. Przez wywołanie theme()). Jeśli nie został zainicjowany, żadne haczyki alter w żadnym motywie nie zostaną wykonane.
zwirbeltier
W temacie używanym do renderowania strony wywoływane są haki @zwirbeltier. theme()nie zmienia kompozycji użytej dla strony, ale wywołuje funkcję renderowania danych. Nie zmienia motywu, na przykład z Garland na Minelli.
kiamlaluno
@kiamlaluno: Jeśli spojrzysz na kod drupal_alter(), zobaczysz, że wywołuje on zmiany w motywie tylko wtedy, gdy drupal_theme_initialize()był wcześniej wywoływany. Jeśli tak nie było, to nie ma jeszcze aktywnego motywu (a zatem), dlatego nie ma żadnych wywoływanych haków. Przynajmniej w D7 nie ma gwarancji, kiedy drupal_theme_initialize()zostanie wywołany po raz pierwszy w żądaniu.
zwirbeltier
@zwirbeltier Zestaw motywów z Drupal jest już inicjowany podczas renderowania strony. Jeśli moduł ustawia motyw strony bez wywoływania odpowiedniej funkcji, jego inicjalizacja jest obowiązkiem.
Odpowiedzi:
Ogólnie rzecz biorąc, tylko haki alter mogą być implementowane przez motywy, co oznacza haki podobne
hook_form_alter()
ihook_menu_alter()
, lub w skrócie, wszystkie haki, które są wywoływanedrupal_alter()
w Drupal 7 i niższych (ModuleHandler()::alter()
lubThemeManager::alter()
w Drupal 8).Inne haki, które są wywoływane przez
module_invoke_all()
(ModuleHandler::invokeAll()
w Drupal 8), nie są wywoływane dla motywów po prostu dlatego, że kod nie sprawdza, czy aktualnie włączony motyw definiuje jakiś haczyk.W Drupal 8, gdzie
ModuleHandler
klasa wywołuje haki zaimplementowane z modułów, aThemeManager
klasa wywołuje haki zaimplementowane przez kompozycje, tylko narzędzia pierwszej klasyinvoke()
iinvokeAll()
. Oznacza to, że w temacie Drupal 8 nie są wywoływane haki przez rdzeń Drupala.Dotyczy to haków rdzeniowych Drupal, a przede wszystkim wszystkich haków używanych przez moduły innych firm. Następnie do modułu należy sprawdzenie, czy haczyk jest zaimplementowany przez motyw i wywołanie go. To właśnie robi moduł Widoki.
W przypadku haków używanych przez moduły innych firm należy sprawdzić kod użyty do ich wywołania. Istnieje prawdopodobieństwo, że przy motywach wywoływane są tylko zaczepy alter, ale w niektórych przypadkach motywy mogą również implementować inne zaczepy.
Należy pamiętać, że w przypadku motywów nie wszystkie włączone motywy są sprawdzane pod kątem implementacji przechwytywania, w przeciwieństwie do modułów. Sprawdzane są tylko aktualnie używane motywy i motywy podstawowe, jak to zrobiono z modułu Widoki.
źródło
theme()
). Jeśli nie został zainicjowany, żadne haczyki alter w żadnym motywie nie zostaną wykonane.theme()
nie zmienia kompozycji użytej dla strony, ale wywołuje funkcję renderowania danych. Nie zmienia motywu, na przykład z Garland na Minelli.drupal_alter()
, zobaczysz, że wywołuje on zmiany w motywie tylko wtedy, gdydrupal_theme_initialize()
był wcześniej wywoływany. Jeśli tak nie było, to nie ma jeszcze aktywnego motywu (a zatem), dlatego nie ma żadnych wywoływanych haków. Przynajmniej w D7 nie ma gwarancji, kiedydrupal_theme_initialize()
zostanie wywołany po raz pierwszy w żądaniu.