Können Regionen innerhalb einer Knotenvorlage gedruckt werden?

25

Können Regionen innerhalb einer Knotenvorlage gedruckt werden oder sind Regionen streng auf Seitenvorlagen beschränkt?

tim76
quelle

Antworten:

48

Sie können Bereiche in jeder Vorlage drucken, diese sind jedoch nicht sofort in der node.tpl.phpVorlage verfügbar . Um sie verfügbar zu machen, erstellen Sie eine neue Variable zur Verwendung in Ihrer node.tpl.phpVorlage, die den gesamten Regionsinhalt enthält.

Das Erstellen neuer Vorlagenvariablen erfolgt mithilfe einer Vorverarbeitungsfunktion. template.phpErstellen Sie in der Datei Ihres Themas eine Funktion, die folgendermaßen aussieht:

function mytheme_preprocess_node(&$variables) {
}

Ersetzen mythemedurch den Kurznamen Ihres Themas. Damit Drupal diese neue Vorverarbeitungsfunktion erkennt, müssen Sie die Themenregistrierung Ihrer Site neu erstellen. Dies ist so einfach, wie Sie zu KonfigurationEntwicklungLeistung gehen und oben auf die Schaltfläche "Alle Caches löschen" klicken.

Die Funktionsweise von Vorverarbeitungsfunktionen besteht nun darin, dass sie $variablesein Array enthalten, das den verfügbaren Variablen Ihrer Vorlage entspricht. Zum Beispiel in node.tpl.php, $submittedenthält den Autor rechte Seite durch . In der obigen Vorverarbeitungsfunktion befindet sie sich in $variables['submitted'].

Um nachzuahmen, was Sie in haben page.tpl.php, wo Sie ein Array mit dem Namen haben $page, das alle Regionen enthält, möchten Sie auffüllen $variables['page'].

Das Problem ist, dass $pagein node.tpl.phpbereits mit einem True / False-Wert gefüllt ist, mit dem Sie wissen, ob Sie den Knoten alleine oder in einer Auflistung betrachten.

Um diese Namenskollision zu vermeiden, füllen Sie $regionstattdessen Folgendes aus:

function mytheme_preprocess_node(&$variables) {

  // Get a list of all the regions for this theme
  foreach (system_region_list($GLOBALS['theme']) as $region_key => $region_name) {

    // Get the content for each region and add it to the $region variable
    if ($blocks = block_get_blocks_by_region($region_key)) {
      $variables['region'][$region_key] = $blocks;
    }
    else {
      $variables['region'][$region_key] = array();
    }
  }
}

Anschließend können Sie in der node.tpl.phpVorlage Ihres Themas einen beliebigen Bereich rendern, indem Sie folgende Schritte ausführen:

<?php print render($region['sidebar_first']); ?>

Wo sidebar_firstist der Name der Region, die Sie rendern möchten?


quelle
1
Endlich eine funktionierende Lösung für Drupal 7 :)
Eduard Luca
4
Es gibt auch eine schnelle und schmutzige Lösung, die für mich funktioniert hat <?php print render(block_get_blocks_by_region('machine_name_of_your_region'));?>. Von hier aus: webomelette.com/add-region-node-template
Darragh Enright
Diese Lösung ist geschickt. Können Sie Beispiele nennen, wann es am besten für das Drucken von Regionen in node.tpl.php geeignet ist, anstatt es in page.tpl.php zu haben?
Randell
Das hängt von Ihrem Design ab. Manchmal kann es vorkommen, dass das Layout die Seitenleiste an einer Stelle platziert, an der es viel einfacher ist, Themen zu erstellen, wenn sie sich innerhalb des Node Div und nicht außerhalb des Node Div befinden.
Rooby
Vergessen Sie nicht, geeignete Regions-Wrapper zu verwenden! Siehe system_page_alter () als Referenz. Denken Sie daran, dass block_get_blocks_by_region()nur ein Array von Blöcken zurückgegeben wird. Wenn Sie es als Region rendern möchten, müssen Sie einen Regionswrapper hinzufügen.
SiliconMind