Chciałbym zapewnić implementację szablonu w moim module i pozwolić motywom na zastąpienie go. Zasadniczo dodaję sugestię za pomocą tego uproszczonego kodu:
function attach_preprocess_node(&$vars) {
$vars['theme_hook_suggestions'][] = 'node__test';
}
(Nie chcę używać hook_theme do dodawania nowego motywu, ponieważ chcę ponownie użyć funkcji węzła preprocesowania. Nazwa motywu jest niezręczna, ale nie chcę pisać node_ attach _%, aby uniknąć pomyłki z typem węzła).
Następnie używam hook_theme_registry_alter (), aby dodać ścieżkę modułu:
function attach_theme_registry_alter(&$theme_registry) {
$path = drupal_get_path('module', 'attach') . '/themes';
$theme_registry_copy = $theme_registry;
_theme_process_registry($theme_registry_copy, 'phptemplate', 'theme_engine', 'node', drupal_get_path('module', 'node'));
$theme_registry += array_diff_key($theme_registry_copy, $theme_registry);
if (!isset($theme_registry['node']['theme paths'])) {
$theme_registry['node']['theme paths'] = array();
}
if (!isset($theme_registry['node']['theme paths'])) {
$first_element = array_shift($theme_registry['node']['theme paths']);
if ($first_element) {
array_unshift($theme_registry['node']['theme paths'], $first_element, $path);
}
else {
array_unshift($theme_registry['node']['theme paths'], $path);
}
}
}
Jednak to nie działa. To znaczy: plik themes / node - super.tpl.php nie jest używany. Jest używany tylko wtedy, gdy skopiowałem go do folderu motywu.
Odpowiedzi:
Zasadniczo możesz zaoszczędzić sobie trochę bólu głowy, wdrażając
hook_theme()
zamiast modyfikować rejestr.Proponuję rzucić okiem na theming_example w projekcie przykładów , ręcznie odtworzonym na tej stronie dokumentu API , być może ze szczególnie pomocnym kodem na tej stronie .
To wszystko dotyczy Drupala 7.
źródło
hook_theme
powinna dać ci$existing
parametr, który pozwala modyfikować rzecz, a nie przesłonić ją. Jeśli tak nie jest, być może trafiłeś w błąd.Może ten działa:
Ważne jest tutaj kluczowe „ hak podstawowy ”.
źródło
base hook
: drupal.org/node/2106635Lubię rozwiązanie dashohoxha implementacji hook_theme, ale nie udało mi się go uruchomić. Po kilku kolejnych googlingach znalazłem odmianę, która działała dla mnie dobrze:
Uwagi: mój niestandardowy moduł nazywa się „mymoduł”, a mój niestandardowy typ zawartości to „blog_post”. Używany przeze mnie tpl.php nazywa się „node - blog_post.tpl.php” i znajduje się w podfolderze „templates” mojego modułu.
źródło
Oto mój fragment kodu do deklarowania szablonów widoków przechowywanych w folderze „template” mojego „custom_module”:
Mam nadzieję, że to komuś pomoże.
źródło
Zapytałem o to raz na Stack Overflow . Zasadniczo musisz wdrożyć,
hook_theme_registry_alter()
aby dodać ścieżkę do ścieżki szablonu zaczepu motywu; następniehook_enable()
wywołujesz drupal_theme_rebuild (), aby wyczyścić pamięć podręczną rejestru motywów i przeskanować ścieżkę w poszukiwaniu szablonów.źródło
hook_enable()
jest wywoływany, gdy moduł jest włączony; jeśli moduł jest już włączony, należy go wyłączyć, a następnie włączyć ponownie.