Wie erstelle ich eine Variable, auf die meine page.tpl.php-Datei zugreifen kann?

7

In Drupal 7 habe ich ein Modul, das hook_node_load implementiert. Es wird eine Variable erstellt, die ich in meiner Datei page.tpl.php verwenden möchte. Stellen wir uns vor, es ist die Anzahl der Knoten, die vom gleichen Typ sind wie der aktuell geladene Knoten. Ab sofort mache ich die Variable nur so global:

global $node_count;
$node_count = db_query("SELECT count FROM {node} WHERE type = :type", array(":type" => $node->type"))->fetchAll()[0]->count;

Dann muss ich in meiner page.tpl.php-Datei Folgendes tun:

global $node_count;
echo "<p>$node_count</p>";

Ich weiß, dass es eine Möglichkeit gibt, meine $node_countVariable im Umfang zu machen , genauso wie $nodeoder $user. Die Tutorials, die ich zu diesem Thema finde, scheinen das Umschreiben der gesamten Themenfunktion zu beinhalten - ich versuche nicht, etwas so Kompliziertes zu tun. Gibt es eine einfache Möglichkeit, diese Variable in meinen .tpl.php-Dateien in den Gültigkeitsbereich aufzunehmen? So etwas wie eine Funktion?

Rybosom
quelle

Antworten:

6

In Drupal-Themen sind Vorlagenvorverarbeitungsfunktionen die Funktionen, die die Variablen vorbereiten, die in einer bestimmten Vorlage verwendet werden können. Vorlagenvorverarbeitungsfunktionen werden nacheinander ausgeführt und durchlaufen ein Array mit allen Variablen. Sie können Ihre eigene in der template.php Ihres Themas in Form von hinzufügen function THEMENAME_preprocess_TEMPLATENAME(&$variables) { // Your code here. }.

Wenn Sie einem Knotenobjekt in einer hook_node_load-Implementierung einen Wert hinzufügen, sieht das wahrscheinlich folgendermaßen aus:

function mymodule_node_load($nodes, $types) {
  foreach ($nodes as $node) {
    $node->myvariable = 'somevalue';
  }
}

Jetzt möchten Sie auf $ node-> myvariable in Ihrer page.tpl.php zugreifen. Dazu müssen Sie nicht einmal eine Vorverarbeitungsfunktion schreiben, da Drupal den Variablen standardmäßig bereits das aktuelle Knotenobjekt hinzufügt. (Dies geschieht in template_prepocess_page .) Dies bedeutet, dass Sie dies einfach zu Ihrer page.tpl.php hinzufügen können:

<?php if ($node->myvariable): ?>
  <div class="myvariable">
    <?php print $node->myvariable; ?>
  </div>
<?php endif; ?>
Marcvangend
quelle
Ich verstehe das vielleicht nicht richtig, aber ich bin mir nicht ganz sicher, ob ich das will. Die Sache ist, ich möchte die Variable innerhalb einer hook_node_load () -Funktion erstellen. Dies würde in meinem Modul leben, nicht in meinem Thema. Kann ich das mit themename_preprocess_page machen? Wenn ja, könnten Sie ein Beispiel geben? Vielen Dank.
Rybosom
OK, ich verstehe, ich werde meine Antwort aktualisieren.
Marcvangend
Antwort aktualisiert. Ich hoffe, das hilft!
Marcvangend
0

Variablen, auf die über eine Vorlagendatei zugegriffen werden kann, können in ihrer Vorverarbeitungsfunktion festgelegt werden, die auch in einem Modul implementiert werden kann.

In Ihrem Fall sollte Ihr Modul Code ähnlich dem folgenden implementieren (ersetzen Sie "mymodule" durch den Kurznamen Ihres Moduls):

function mymodule_preprocess_page(&$variables) {
  if (!empty($variables['node'])) {
    $variables['node_count'] = db_query("SELECT count FROM {node} WHERE type = :type", array(":type" => $variables['node']->type"))->fetchField();
  }
}

Ich überprüfe, dass $variables['node']es nicht leer ist, da die Seitenvorlage auch für Seiten verwendet wird, die keinem Knoten zugeordnet sind.
In page.tpl.php greifen Sie über die Vorverarbeitungsfunktion mit auf denselben Variablensatz zu $node_count.

kiamlaluno
quelle