Wie funktioniert hook_theme ()?

8

Mir fällt es schwer zu verstehen, was hook_theme () tut es.

Mein Verständnis ist, dass es etwas damit zu tun hat, Vorlagen zu überschreiben.

Ich schaute:

%Vor%

Können Sie ein Beispiel dafür geben, wie es funktioniert?

    
Chris Muench 12.10.2011, 15:04
quelle

3 Antworten

22

Es bietet einem Modul die Möglichkeit, seine Themen zu definieren, die dann von jedem anderen Modul / Thema überschrieben werden können. Es bietet auch die Möglichkeit für jedes Modul, einen Hook wie mymodule_preprocess_theme_name zu verwenden, um die Variablen zu ändern, die an die endgültige Designfunktion oder Vorlagendatei übergeben werden.

Es gibt grundsätzlich zwei Möglichkeiten, eine Designfunktion zu initialisieren:

%Vor%

und

%Vor%

Beachten Sie, dass Sie vermeiden sollten, theme () direkt aufzurufen (siehe Dokumentation in theme.inc), da es:

  • Umgeht Caching.
  • Umgeht die Standardwerte der in hook_element_info () definierten Typen, einschließlich der angehängten Elemente
  • Umgeht die Phasen pre_render und post_render.
  • Umgeht, dass JavaScript Informationen enthält.

theme () ist in Drupal 8 eine private Funktion, _theme (). Weitere Informationen finden Sie unter www.drupal.org/node/2173655 .

Wenn Sie diese beiden mit dem poll_results -Element in dem oben angegebenen Beispiel vergleichen, können Sie wahrscheinlich herausfinden, was passiert ... Da PHP keine stark typisierte Sprache ist, stellt Drupal 'benannte Argumente' entweder über a Keyed-Array an die Funktion theme übergeben oder als Hash-Schlüssel in einem Render-Array.

Was das "Render-Element" betrifft, teilt das dem Themesystem grundsätzlich mit, dass diese Design-Funktion mit einem Render-Array aufgerufen wird, mit einem benannten Argument (in diesem Fall form ) . Der Code würde ungefähr so ​​aussehen:

%Vor%

Dies übergibt, was in der $form -Variable ist, an die Design-Funktion als einziges Argument.

In Bezug auf den Schlüssel template :

%Vor%

definiert ein Thema mit dem Namen poll_vote , das eine Vorlagendatei (also den Schlüssel template ) mit dem Namen 'poll-vote.tpl.php' verwendet (dies ist per Konvention). Der Pfad zu dieser Vorlagendatei wird über den Pfad zu dem Modul gefunden, das sie implementiert (zB modules / poll / poll-vote.tpl.php). Es ist also in Ordnung, Vorlagendateien in Unterordner des Hauptmodulordners zu legen .

Es gibt zwei Möglichkeiten, die Ausgabe für eine Designfunktion tatsächlich zurückzugeben, indem Sie den Namen der physischen Funktion (in diesem Fall theme_poll_vote ) oder eine Vorlagedatei verwenden. Wenn der Schlüssel template leer ist, nimmt Drupal an, dass Sie eine physische Funktion implementiert haben und versuchen wird, sie aufzurufen.

Vorlagendateien sind vorzuziehen, wenn Sie ein wenig HTML für ein Thema ausgeben müssen oder Sie einfach nicht gerne HTML in Strings innerhalb von PHP schreiben (ich persönlich nicht). In beiden Fällen werden die beim Aufruf des Themas übergebenen Variablen (entweder mit theme() oder einem Render-Array wie oben beschrieben) selbst an die Template-Datei oder die Theme-Funktion übergeben. Also:

%Vor%

Wenn Sie stattdessen eine Vorlagendatei für die gleiche Methode verwenden würden, wären die Variablen als $raw_title , $results usw. verfügbar, da Drupal extract auf der $vars vor der Analyse der Vorlagendatei ausführt.

Ich bin mir sicher, es gibt eine Menge, die ich hier verpasst habe, aber wenn Sie weitere spezifische Fragen haben, fragen Sie, und ich werde versuchen, Ihnen zu helfen.

    
Clive 12.10.2011, 16:52
quelle
3

Drupal 6

Ich war den ganzen Tag damit beschäftigt und jetzt erfolgreich implementiert, also teile ich meinen Fund hier, möge es dabei helfen, hook_theme zu verstehen.

Es gibt 3 Schritte:

  1. hook_theme

    %Vor%
  2. echo / return das Thema in Ihrem .tpl oder einem beliebigen .module

    %Vor%
  3. Nun sind die Variablen in xxx-xxx.tpl.php magisch verfügbar.

    %Vor%

Hinweis: Sie können $ xxx als Array, Objekt oder irgendetwas übergeben:)

    
Serjas 13.03.2012 11:37
quelle
0

Es gibt noch einen anderen Weg: (kann in Bartik Thema gefunden werden)

Das Szenario hier ist, dass wir unser eigenes Modul erstellt haben und die Standardausgabe für beispielsweise einen Knoten mit dem Titel 'zzz überschreiben möchten nur.
Wir wissen es nicht und kümmern uns nicht wirklich darum, wie die Standardausgabe erzeugt wird. Alles, was wir brauchen, ist, Drupal zu sagen, dass wir unsere eigene benutzerdefinierte Vorlagendatei (node ​​- custom - name.tpl.php) verwenden sollen, um diesen spezifischen Knoten zu rendern.

Dies sind die Schritte:

  1. Sagen Sie Drupal, wo unsere Vorlagendatei lebt. (Beachten Sie, dass diese Funktion nur einmal und nach dem Löschen des Drupal-Caches wirksam wird):

    %Vor%
  2. Sagen Sie Drupal, wo und wann Sie es verwenden sollen

    %Vor%

    Nun wird Drupal unsere Vorlagendatei nur für diesen speziellen Fall verwenden, vorausgesetzt, die Datei 'node - custom - name.tpl.php' befindet sich im deklarierten Pfad, andernfalls wird die Suche nach den Namenskonventionen für Vorschläge fortgesetzt eine Fallback-Vorlage.

GrigoreasP 19.11.2013 09:56
quelle