Definition von Variablen zur Verwendung im Template (preprocess functions)
[ Übersetzung der Seite Setting up variables for use in a template (preprocess functions) ]
Präprozessor-Funktionen werden nur verwendet für theming hooks in Form von Templates.
Die Hauptaufgabe des Präprozessors ist es Variablen zu definieren, die in den Template Dateien (.tpl.php) verwendet werden können. Reine Theme Funktionen arbeiten nicht mit Präprozessoren.
Anmerkungen:
- Damit dein Theme die Preprocess Variablen erkennt muss das Template welches mit dem hook assoziiert ist innerhalb des Theme-Ordners existieren. Ab Drupal 6.7. ist dies nicht länger nötig. Wenn ein Standard Template existiert, kopiere es in den Themeordner und leere die Registry. Wie du Funktionen in Templates konvertieren kannst steht hier
- Präprozessor-Funktionen werden auch verwendet zur Bereitstellung von Template Vorschlägen
- In Version 5 abwärts dient die Funktion _phptemplate_variables dem gleichen Zweck
Es kann zahlreiche Präprozessoren geben für jeden theming hook. In den verschiedenen Schichten - Kern, Modulen, Engines und Themes können sie Variablen definieren, vor der eigentlichen Darstellung durch die Templates. Das hält den Quellcode sauber und einfach zu handhaben indem man die meiste Logik in die Präprozessoren verlagert.
Hier sind die erwarteten Präprozessoren. Sie werden in dieser Reihenfolge abgearbeitet sofern sie existieren:
- template_preprocess
- Dies wird vom Core geliefert und immer hinzugefügt. Die hier erzeugten Variablen gelten für jeden Template hook. - template_preprocess_hook
- Das Modul oder Core welches den theming hook implementiert liefert das. Die Initialisierung der hook spezifischen Variablen wird üblicherweise hier gemacht. - modulName_preprocess
- Nicht zu verwechseln mit dem vorherigen Präprozessor. Dieser erlaubt anderen Modulen (als die den hook ursprünglich implementiert haben) Einfluss auf die Variablen zu nehmen. Gilt für alle hooks. - moduleName_preprocess_hook
- Selbe Idee wie der vorherige Präprozessor nur für bestimmte hooks. - engineName_engine_preprocess
- Der Präprozessor für Theming Engines. Gilt für alle hooks. - engineName_engine_preprocess_hook
- Noch ein Präprozessor für Theming Engines nur für einen einzelnen hook. - engineName_preprocess
- NICHT EMPFOHLEN. Das ist der erste Präprozessor, der innerhalb des Theme benutzt werden kann. Kann benannt werden nach der Engine mit dem das Theme läuft. Gilt für alle hooks. - engineName_preprocess_hook
- NICHT EMPFOHLEN. Noch ein Präprozessor banannt nach der Engine aber spezifisch für einen einzelnen hook. - themeName_preprocess
- Dieser ist nach dem Theme selbst benannt. Gilt für alle hooks. - themeName_preprocess_hook
- Wie der vorherige nur für einen bestimmten hook.
Es gibt hier viele Möglichkeiten die Variablen zu verändern. In den meisten Fällen existieren anfänglich nur die ersten beiden Präprozessoren. Der erste liefert die standard Basis-Variablen und der zweite liefert ein Set spezifisch für den theming hook. Zusätzliche Module die Methode 3&4 nutzen sollten dokumentieren wie. Das wird hier nicht ausführlich behandelt.
Obwohl es möglich ist bedient sich die standard PHPTemplate nicht dieser Möglichkeiten (5&6)
Themes können ihre Präprozessoren ab Möglichkeit 7 in der Liste hinzufügen. Die Präprozessor-Funktion sollte innerhalb der entsprechenden template.tpl.php definiert werden. Aufgrund der weiter unten beschriebenen Probleme wird empfohlen, den Themenamen als Prefix voranzustellen (9&10). Es ist möglich , die beiden letzten Methoden auch auf Sub-Themes anzuwenden.
Einige Anmerkungen:
- Es gibt leider einen Bug im Theme System wenn ein Theme Teil einer Basis-/Sub-Theme Hierarchie ist. Jede Funktion mit dem Prefix engineName_preprocess wird mehrmals aufgerufen (einmal für jedes Theme in der Hierarchie) statt nur einmal. Das verschwendet nicht nur Ressourcen sondern kann auch zu schwer nachvollziehbaren Fehlern führen.
- Der Themename sollte immer für Themes verwendet werden. Das minimiert die Gefahr, dass ein Sub-Theme eine Funktion mit dem Prefix engineName_preprocess doppelt deklariert und dadurch einen schweren PHP-Fehler erzeugt.
Beachte, dass diese Funktionen keinen return Wert zurückgeben dürfen und die Variablen mittels reference übergeben werden müssen. In der Form &$variables.
In früheren Schichten definierte Variablen werden auf diese Weise durch alle späteren Präprozessoren übergeben also pass auf dass du sie nicht unbeabsichtigt resettest vor dem Theme. Es ist in Ordnung sie zu überschreiben, unbeabsichtigt kann das aber zu Rätselraten führen.
Beispiel für einen Modul-Präprozessor, der hook "foo" implementiert:
<?php
function template_preprocess_foo(&$variables) {
$variables['foo_list'] = array(
'list item 1',
'list item 2',
'list item 3',
);
}
?>
Und der Präprozessor deklariert durch das Theme um die Variable von oben hinzuzufügen:
<?php
function drop_preprocess_foo(&$variables) {
// Do not do this unless you mean to:
$variables['foo_list'] = array('list item 4');
// Instead do this:
$variables['foo_list'][] = 'list item 4';
}
?>
Die Variablen eingetragen in die Template Datei sind die in $variables
gesetzten Schlüssel. Für das obige Bsp. wäre dies also $foo_list
Benutzt man einen Präprozessor unspezifisch zu einem Theming hook, kann ein zweiter Parameter benutzt werden der immer den aktuellen hook übergibt. Diese Methode kann gewünscht sein sofern es geteilten Code für mehrere Theming hooks gibt. Sonst ist der Code in einer spezielleren Funktion wie oben beschrieben einfacher zu pflegen.
<?php
function drop_preprocess(&$variables, $hook) {
// Shared between the 'foo' and 'bar' theming hooks.
if ($hook == 'foo' || $hook == 'bar') {
$variables['foobar_item'] = 'foobar item';
}
// Specific to 'foo'.
if ($hook == 'foo') {
$variables['foo_item'] = 'foo item';
}
// Specific to 'bar'.
elseif ($hook == 'bar') {
$variables['bar_items'] = 'bar item';
}
}
?>
Weitere HowTo's und Code-Snippets:
- Anmelden oder Registrieren um Kommentare zu schreiben
Neue Kommentare
vor 18 Minuten 22 Sekunden
vor 1 Stunde 29 Minuten
vor 1 Stunde 34 Minuten
vor 3 Stunden 13 Minuten
vor 6 Stunden 36 Minuten
vor 6 Stunden 55 Minuten
vor 7 Stunden 17 Minuten
vor 8 Stunden 21 Minuten
vor 11 Stunden 58 Minuten
vor 12 Stunden 3 Minuten