Czy regiony można wydrukować w szablonie węzła?

25

Czy regiony można wydrukować w szablonie węzła, czy też regiony są ściśle ograniczone do szablonów stron?

tim76
źródło

Odpowiedzi:

48

Możesz wydrukować regiony w dowolnym szablonie, ale nie są one dostępne od razu w node.tpl.phpszablonie. Aby je udostępnić, utworzysz w node.tpl.phpszablonie nową zmienną, która będzie zawierać całą zawartość regionu.

Tworzenie nowych zmiennych szablonu odbywa się za pomocą funkcji wstępnego przetwarzania. W template.phppliku motywu utwórz funkcję, która wygląda następująco:

function mytheme_preprocess_node(&$variables) {
}

Zastępowanie mythemekrótką nazwą motywu. Teraz, aby Drupal rozpoznał tę nową funkcję wstępnego przetwarzania, musisz odbudować rejestr motywów witryny. Jest to tak proste, jak przejście do KonfiguracjaProgramowanieWydajność i naciśnięcie przycisku „Wyczyść wszystkie pamięci podręczne” u góry.

Teraz działają funkcje preprocesowania, które $variableszawierają tablicę odpowiadającą dostępnym zmiennym twojego szablonu. Na przykład, w node.tpl.php, $submittedzawiera autora wiersza autora. W powyższej funkcji preprocess znajduje się w $variables['submitted'].

Aby naśladować to, co masz page.tpl.php, gdzie masz tablicę o nazwie $pagezawierającą wszystkie regiony, chciałbyś zapełnić $variables['page'].

Problem polega na tym, że parametr $pagein node.tpl.phpjest już wypełniony wartością true / false, która informuje, czy patrzysz na węzeł sam, czy na liście.

Aby uniknąć kolizji nazw, $regionzamiast tego wypełnij :

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();
    }
  }
}

Następnie w node.tpl.phpszablonie motywu możesz renderować dowolny region, wykonując następujące czynności:

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

Gdzie sidebar_firstjest nazwa regionu, który chcesz wyrenderować.


źródło
1
Wreszcie działające rozwiązanie dla Drupala 7 :)
Eduard Luca
4
Jest też szybkie i brudne rozwiązanie, które zadziałało dla mnie <?php print render(block_get_blocks_by_region('machine_name_of_your_region'));?>. Stąd: webomelette.com/add-region-node-template
Darragh Enright
To rozwiązanie jest fajne. Czy możesz podać przykłady, kiedy ma on największe zastosowanie do drukowania regionów w node.tpl.php zamiast umieszczania go w page.tpl.php?
Randell
To zależy od twojego projektu. Czasami układ może umieścić pasek boczny w miejscu, w którym o wiele łatwiej jest utworzyć motyw, gdyby znajdował się wewnątrz div węzła zamiast na zewnątrz.
rooby
Nie zapomnij o odpowiednich opakowaniach dla regionu! Zobacz referencje dla system_page_alter () . Pamiętaj, że block_get_blocks_by_region()zwraca tylko tablicę bloków i jeśli chcesz wyrenderować go jako region, musisz dodać opakowanie regionu.
SiliconMind 16.04.15