Jak korzystać z funkcji preprocesora motywu dla własnych szablonów?

Mam kilka .tpl.Pliki php dla węzłów, pól CCK i widoków. Te pliki szablonów mają w sobie wiele logiki, aby przenosić rzeczy, usuwać linki, tworzyć nowe linki itp. Rozumiem, że jest to zły rozwój, a nie "sposób Drupal".

Jeśli dobrze rozumiem, "sposobem Drupala" jest użycie funkcji preprocesora w pliku template.php do manipulowania zmiennymi i dodawania nowych zmiennych. Kilka pytań na ten temat:

  • czy istnieje konwencja nazewnictwa do tworzenia funkcji preprocesora dla określonego motywu? Na przykład, jeśli mam szablon pola CCK o nazwie content-field-field_transmission_make_model.tpl, Jak nazwałbym funkcję preprocesora?
  • Czy Mogę używać funkcji preprocesora szablonów dla szablonów węzłów, szablonów pól CCK i szablonów widoków? Czy mają różne metody modyfikowania zmiennych szablonów lub dodawania nowych?
Author: Steffen Opel, 2010-03-05

2 answers

Aby uzyskać ogólny przegląd, powinieneś przeczytać o manipulowaniu zmiennymi w funkcjach preprocesowych .


Jeśli chodzi o konwencję nazewnictwa, jest to zwykle dość proste, ale jest pewien haczyk dla Twojego obecnego przykładu (patrz poniżej):

Podpis funkcji preprocesowych musi być

[yourModuleName|yourThemeName]_preprocess_[themeFunctionName](&$variables)

Więc wdrożenie jednego dla szablonu strony w szablonie motywów.plik php oznaczałby

themeName_preprocess_page(&$variables)

Przez większość czasu nazwa funkcja motywu będzie nazwą *.tpl.plik php, beztpl.zakończenie php i podkreślenie zamiast myślników. ale jest pewien haczyk jeśli plik szablonu zostanie wybrany na podstawie sugestii szablonu , ponieważ funkcja preprocess może być zaimplementowana tylko dla nazwy bazy, a nie dla dodatkowych sugestii! (Sugestie dotyczące alternatywnych plików szablonów są dodawane w samych funkcjach preprocesu.)

Twój obecny przykład jest jednym z tych przypadki, ponieważ content-field-field_transmission_make_model.tpl.php jest taką sugestią, przy czym nazwa bazowa to content-field.tpl.php, A odpowiadająca jej funkcja motywu to content_field. Trzeba więc zaimplementować funkcję preprocesu o nazwie yourThemeName_preprocess_content_field(&$variables), a w jej ramach sprawdzić dostępne wpisy w tablicy $ variables, aby sprawdzić, czy rzeczywiście wywołano cię dla 'field_transmission_make_model', a nie dla zupełnie innego pola CCK, np.:

function yourThemeName_preprocess_content_field(&$variables) {
  // Are we called for the right field?
  if ('field_transmission_make_model' == $variables['field_name']) {
    // Yes, add/manipulate entries within the variables array
    $variables['new_entry'] = 'A useless new variable';
    $variables['label'] = 'A useless change of the existing label variable';
  }
}

(Uwaga: Nieprzetestowany kod, uwaga na literówki)

Następnie powinna pojawić się nowa zmienna $new_entry jest dostępna w pliku szablonu, a zawartość zmiennej $label powinna się zmienić (wszystkie wpisy najwyższego poziomu w tablicy $ variables zostaną zamienione w oddzielne zmienne dla pliku szablonu, nazwane od indeksu tablicy).


Jeśli chodzi o drugie pytanie, podstawowe użycie funkcji preprocess jest takie samo dla wszystkich plików szablonów, ale pamiętaj:

  • funkcje Preprocesu są dostępne tylko dla wywołań motywów, które używają *.tpl.Pliki php, Nie dla funkcji tematycznych
  • zawartość tablicy $ variables jest bardzo różna, w zależności od tego, co zostanie tematyczne
  • inne moduły mogą również implementować funkcje preprocesu i będą wywoływane jeden po drugim, więc jeśli chcesz zmienić coś, co zostanie dodane przez inny moduł, możesz to zrobić tylko wtedy, gdy twoja implementacja zostanie wywołana po tym (co nie będzie problemem w Twoim przypadku, ponieważ implementacje w ramach tematu są wywoływane po wszystkich implementacjach w ramach modułów-chciałem tylko wspomnieć, że może być wiele implementacji jednocześnie) {]}
 55
Author: Henrik Opel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-05 15:23:15

Aby dowiedzieć się, jak powinna zostać nazwana nasza funkcja przetwarzania wstępnego, musimy wiedzieć, z jakiego pliku szablonu lub funkcji motywu pochodzi dane wyjście i jednym z najlepszych sposobów na to jest użycie modułu wywoływacza motywów .

Oto film, który wyjaśnia to szczegółowo - http://buildamodule.com/video/drupal-theming-essentials-template-files-theme-function-overrides-and-preprocessing-functions-how-to-use-simple-preprocessing-functions

 2
Author: amitgoyal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-21 09:42:57