Druckbereiche in html.tpl.php

10

Ich muss einige Regionen in der Vorlage html.tpl.php ausgeben, da sich diese nicht zwischen page.tpl.php und page-front.tpl.php ändern (um nur zwei zu nennen). Grundsätzlich möchte ich Codeduplizierungen vermeiden.

Es scheint jedoch nichts mit Regionen in html.tpl.php zu tun zu haben, und ich konnte mit drupal_get_region_content nichts abrufen (sowohl mit als auch ohne Parameter wird nur ein leeres Array zurückgegeben).

Ideen?

Morpheu5
quelle
Haben Sie drupal_set_region_content()den Regionsinhalt festgelegt?
Kiamlaluno
2
Es gibt keine solche Funktion. Vielleicht haben Sie das gemeint, drupal_add_region_content()aber ich sehe keinen Sinn darin: Ich setze den Inhalt von Regionen über die Blockadministrationsoberfläche.
Morpheu5
1
Ja, ich meinte drupal_add_region_content().
Kiamlaluno

Antworten:

18

Ich habe so gelöst:

function mytheme_preprocess_html(&$variables) {
    $variables['region_name'] = block_get_blocks_by_region('region_name');
}

und dann könnte ich tun

<?php print render($region_name) ?>
Morpheu5
quelle
Warum Echo verwenden? Natürlich funktioniert es.
SDMulroy
Klar, wenn ich ein Modul oder ein öffentliches Thema implementieren würde, wäre ich gezwungen, Community-Standards zu befolgen. Dies war ein benutzerdefiniertes Thema, das ausschließlich von meinem Kunden verwendet wurde.
Morpheu5
Ich weiß, dass dies ein extrem alter Beitrag ist, aber ich denke, dass es ein schlechtes Urteilsvermögen ist, eine Antwort zu akzeptieren, bei der der Autor der Antwort die Frage träge beantwortet. Beispiel: Sie stellen eine Funktion zum Hinzufügen bereit, gehen jedoch davon aus, dass alle Leser auf magische Weise wissen, wo dieser Code leben soll. Das ist der faule Teil, und ich stimme dem ab, da es unerfahrenen Drupal-Benutzern / Entwicklern nichts bietet.
Kegeln
Ich schätze Ihren Beitrag und die Tatsache, dass Anfänger möglicherweise keine vollständige Erklärung erhalten. Beachten Sie jedoch bitte, dass a) Löffelfüttern zu faulen Anfängern führt und b) für jeden, der die Dokumente sogar schnell gelesen hat (wie es jeder nicht faule Anfänger haben sollte), die Platzierung dieser Funktion relativ offensichtlich sein sollte. Wenn nicht, gibt es aus gutem Grund ein Handbuch. Meine Frage (und Antwort) befasst sich mit einem Problem auf einer Ebene, auf der bestimmte Grundkenntnisse des Drupal-Themas vorausgesetzt werden können. Darüber hinaus handelt es sich um eine Q & A-Site. Die Docs-Site befindet sich nebenan.
Morpheu5
1
@Skitties Wir können die Dokumentation hier nicht duplizieren, nur weil neue Benutzer nicht wissen konnten, welche Vorverarbeitungsfunktionen wie die in der Frage gezeigte funktionieren. Das ist nicht einmal Teil der Frage. Wenn Benutzer eine bestimmte Frage haben, um Vorverarbeitungsfunktionen auszuführen, werden sie eine neue Frage stellen.
Kiamlaluno
2

drupal_get_region_content()Gibt den Inhalt zurück, der bei früheren Aufrufen an festgelegt drupal_add_region_content()wurde, enthält jedoch nicht den Inhalt der Blöcke, die auf der Seite über block_page_build () gerendert werden .

Wenn Sie im Drupal-Quellcode nach "drupal_add_region_content" suchen, werden Sie feststellen, dass die Funktion wie folgt aufgerufen wird:

  • drupal_get_region_content()
  • install_display_output()
  • template_preprocess_maintenance_page()
  • update_task_list()

Was Sie für die Blöcke auf der Verwaltungsseite festlegen, ist, in welchen Regionen die Blöcke gerendert werden, deren Inhalt jedoch nicht hinzugefügt wird drupal_add_region_content(). Tatsächlich dient keine der oben aufgeführten Funktionen (die einzigen Funktionen, die aufgerufen werden drupal_add_region_content(), mit Ausnahme des Codes zum Testen einer Drupal-Installation) zum Rendern / Hinzufügen des Blockinhalts.

Wenn Sie die Blöcke in Ihrem eigenen Code rendern müssen, sollten Sie den in verwendeten Code überprüfen block_page_build(). Dies ist insbesondere der Code, der für Sie wahrscheinlich nützlicher ist:

  // Fetch a list of regions for the current theme.
  $all_regions = system_region_list($theme);

  $item = menu_get_item();
  if ($item['path'] != 'admin/structure/block/demo/' . $theme) {
    // Load all region content assigned via blocks.
    foreach (array_keys($all_regions) as $region) {
      // Assign blocks to region.
      if ($blocks = block_get_blocks_by_region($region)) {
        $page[$region] = $blocks;
      }
    }
    // …
  }

In den ersten beiden Zeilen wird überprüft, ob die angezeigte Seite nicht die Demoseite ist, auf der angezeigt wird, wo die Themenbereiche platziert sind.

Wenn Sie die Blöcke auf andere Weise rendern müssen, ist es wahrscheinlicher, dass Sie theme_block () in Ihrem Design überschreiben oder (noch wahrscheinlicher) eine benutzerdefinierte block.tpl.php-Vorlagendatei erstellen möchten. Eine andere Möglichkeit, die Art und Weise zu ändern, in der die Blöcke gerendert werden, besteht darin, eine Vorverarbeitungsfunktion für die Blöcke zu verwenden ( hook_preprocess_block () ).

kiamlaluno
quelle