Czy regiony można wydrukować w szablonie węzła, czy też regiony są ściśle ograniczone do szablonów stron?
Możesz wydrukować regiony w dowolnym szablonie, ale nie są one dostępne od razu w node.tpl.php
szablonie. Aby je udostępnić, utworzysz w node.tpl.php
szablonie nową zmienną, która będzie zawierać całą zawartość regionu.
Tworzenie nowych zmiennych szablonu odbywa się za pomocą funkcji wstępnego przetwarzania. W template.php
pliku motywu utwórz funkcję, która wygląda następująco:
function mytheme_preprocess_node(&$variables) {
}
Zastępowanie mytheme
kró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 Konfiguracja → Programowanie → Wydajność i naciśnięcie przycisku „Wyczyść wszystkie pamięci podręczne” u góry.
Teraz działają funkcje preprocesowania, które $variables
zawierają tablicę odpowiadającą dostępnym zmiennym twojego szablonu. Na przykład, w node.tpl.php
, $submitted
zawiera 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 $page
zawierającą wszystkie regiony, chciałbyś zapełnić $variables['page']
.
Problem polega na tym, że parametr $page
in node.tpl.php
jest już wypełniony wartością true / false, która informuje, czy patrzysz na węzeł sam, czy na liście.
Aby uniknąć kolizji nazw, $region
zamiast 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.php
szablonie motywu możesz renderować dowolny region, wykonując następujące czynności:
<?php print render($region['sidebar_first']); ?>
Gdzie sidebar_first
jest nazwa regionu, który chcesz wyrenderować.
<?php print render(block_get_blocks_by_region('machine_name_of_your_region'));?>
. Stąd: webomelette.com/add-region-node-templateblock_get_blocks_by_region()
zwraca tylko tablicę bloków i jeśli chcesz wyrenderować go jako region, musisz dodać opakowanie regionu.