Mam kilka typów treści, które muszę wstępnie przetwarzać na różne sposoby. Więc template.php
w moim motywie foo
obecnie wygląda następująco:
function foo_preprocess_node(&$variables) {
if ('news' ==$variables['type']) _preprocess_news($variables);
if ('event'==$variables['type']) _preprocess_event($variables);
if ('alert'==$variables['type']) _preprocess_alert($variables);
...
}
function _preprocess_news(&$variables) {
...
}
function _preprocess_event(&$variables) {
...
}
function _preprocess_alert(&$variables) {
...
}
Chciałbym móc określić funkcję wstępnego przetwarzania specyficzną dla Drupala, która uzależniałaby nazwę komputera typu zawartości. Próbowałem użyć, foo_preprocess_news
ale nigdy się nie nazywa.
Czy jest lepszy sposób?
foo_preprocess_node
, wdrażając go takcall_user_func('_preprocess_' . $vars['type'], $vars);
, aby uniknąć powtarzania ifs, ale prawdopodobnie najlepiej pozostać prosty.hook_preprocess_node()
na niestandardowym module i miałem nadzieję, że to ograniczy, gdy hak zostanie wywołany, ale tak nie jest. Jakikolwiek sposób ograniczenia, gdy hak zostanie wywołany według typu zawartości?if ($vars['node']->type == 'foo') { ...
osiągnie oczekiwany efekthook_block_view_MODULE_DELTA_alter()
. Obecnie robię to, co mówisz, ale chciałbym, aby istniał sposób ograniczenia, gdy hak zostanie trafiony.Podtemat zen osiąga to poprzez dodanie tego do swojej funkcji theme_preprocess_node:
Jeśli masz typ zawartości o nazwie „aktualności”, możesz utworzyć funkcję o nazwie foo_preprocess_node_news w pliku template.php.
źródło
Właśnie miałem podobny problem, dlatego Google przeniósł mnie na tę stronę: moja funkcja wstępnego przetwarzania węzła rosła tak ogromnie, że wolałbym podzielić funkcję na wiele plików.
Podjąłem już podobne podejście w moim pliku template.php, który zawiera wszystkie funkcje alter, a ponieważ ta sama metoda działa tutaj doskonale, pomyślałem, że podzielę się tym podejściem:
konfiguracja pliku w folderze
MYTHEME/preprocess
:powinieneś już mieć
node.preprocess.inc
, inne, które możesz sam stworzyć. to, jak je nazywasz, jest raczej arbitralne, ale lepiej nadaj im nazwy, które dobrze je identyfikują i pasują do całego systemu nazewnictwa Drupal.dalej do treści tych plików!
w zasadzie przełączamy rodzaj bieżącego węzła. to, co przełączysz, zależy od ciebie;
#id
,#view_mode
wszystko zależy od konkretnych potrzeb.po znalezieniu dopasowania ładuje określony plik i działa na jego zawartość, tak jakby był zapisany bezpośrednio w tej funkcji.
zawartość tych
included
plików wygląda dokładnie tak, jakbyś umieścił je wnode.preprocess.inc
pliku, z tym wyjątkiem, że nie wywołujemy ponownie funkcji wstępnego przetwarzania:w zasadzie możesz to zrobić z dowolną liczbą plików, a nawet kaskadować wiele przełączników, na przykład dalej dzieląc określone pliki przetwarzania wstępnego węzła w zależności od
#view_mode
, mając jeden plik dlafull
trybu widoku, a drugi dlateaser
mam nadzieję, że to pomoże, jeśli ktoś kiedykolwiek natknie się na to pytanie (:
źródło
call_user_func()
nie przekazuje parametrów przez odniesienie. Tak więc w przypadku$variables
twoichpreprocess_foo()
funkcji będzie działać tylko na kopiach oryginalnej tablicy; zmiany w obiektach innych niż obiekty nie zostaną zastosowane podczas pozostałego procesu renderowania.źródło
W głównym węźle hook_preprocess_node zaimplementuj następujący kod na końcu
Więc miałbyś teraz proces wstępny według typu węzła
źródło