Drukowanie regionów w pliku html.tpl.php

10

Muszę wypisać niektóre regiony z szablonu html.tpl.php, ponieważ nie zmieniają się one między page.tpl.php i page-front.tpl.php (żeby wymienić tylko dwa). Zasadniczo chcę uniknąć duplikacji kodu.

Jednak wydaje się, że nic nie jest powiązane z regionami w html.tpl.php, ani nie mogłem niczego odzyskać za pomocą drupal_get_region_content (zarówno z parametrami, jak i bez parametrów, po prostu zwraca pustą tablicę).

Pomysły?

Morpheu5
źródło
Czy drupal_set_region_content()ustawiłeś zawartość regionu?
kiamlaluno
2
Nie ma takiej funkcji. Może miałeś na myśli, drupal_add_region_content()ale nie widzę w tym sensu: ustawiam zawartość regionów poprzez interfejs administratora bloków.
Morpheu5,
1
Tak, miałem na myśli drupal_add_region_content().
kiamlaluno

Odpowiedzi:

18

Rozwiązałem w ten sposób:

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

i wtedy mógłbym zrobić

<?php print render($region_name) ?>
Morpheu5
źródło
Dlaczego warto korzystać z echa? Oczywiście, że działa.
SDMulroy
Jasne, gdybym wdrożył moduł lub temat publiczny, byłbym zmuszony do przestrzegania standardów społeczności. To był niestandardowy motyw, który był używany wyłącznie przez mojego klienta.
Morpheu5,
Wiem, że jest to bardzo stary post, ale myślę, że źle jest przyjąć odpowiedź, na którą autor odpowiedzi leniwie odpowiada na pytanie. np. udostępniasz funkcję dodawania, ale zakładasz, że wszyscy czytelnicy będą magicznie wiedzieć, gdzie powinien znajdować się ten kod. To jest leniwa część i głosuję za tym, ponieważ nie zapewnia niczego początkującym użytkownikom / deweloperom drupal.
Skittles,
Doceniam twój wkład i fakt, że nowicjusze mogą nie uzyskać pełnego wyjaśnienia. Należy jednak wziąć pod uwagę, że a) karmienie łyżką jest leniwym nowicjuszem, i b) każdemu, kto nawet szybko przeczytał dokumenty (jak powinien mieć każdy nie leniwy nowicjusz), umieszczenie tej funkcji powinno być względnie oczywiste. Jeśli tak nie jest, to nie bez powodu jest instrukcja. Moje pytanie (i odpowiedź) dotyczy problemu na poziomie, na którym można założyć pewną podstawową wiedzę na temat Drupala. Ponadto jest to strona z pytaniami i odpowiedziami, a witryna Dokumentów znajduje się obok.
Morpheu5,
1
@Skitties Nie możemy powielić tutaj dokumentacji tylko dlatego, że nowi użytkownicy nie mogli wiedzieć, jakie są funkcje preprocesowania, takie jak pokazane w pytaniu. To nawet nie jest częścią pytania. Jeśli użytkownicy mają określone funkcje przetwarzania wstępnego pytania, zadają nowe pytanie.
kiamlaluno
2

drupal_get_region_content()zwraca treść ustawioną przy użyciu poprzednich wywołań drupal_add_region_content(), ale nie obejmuje treści bloków, które są renderowane na stronie za pomocą block_page_build () .

Jeśli szukasz „drupal_add_region_content” w kodzie źródłowym Drupal, zauważysz, że funkcja jest wywoływana przez:

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

Dla bloków na stronie administracyjnej ustawia się regiony, w których bloki będą renderowane, ale ich zawartość nie jest dodawana drupal_add_region_content(); w rzeczywistości żadna z wymienionych powyżej funkcji (które są jedynymi wywoływanymi funkcjami drupal_add_region_content(), z wyjątkiem kodu do testowania instalacji Drupal) nie służy do renderowania / dodawania zawartości bloku.

Jeśli chcesz wyrenderować bloki we własnym kodzie, powinieneś sprawdzić kod użyty w block_page_build(). W szczególności jest to kod, który prawdopodobnie jest dla Ciebie bardziej przydatny:

  // 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;
      }
    }
    // …
  }

Pierwsze dwa wiersze potwierdzają, że wyświetlana strona nie jest stroną demonstracyjną służącą do pokazania, gdzie znajdują się regiony tematyczne.

Jeśli chcesz wyrenderować bloki w inny sposób, bardziej prawdopodobne jest, że chcesz zastąpić theme_block () w swoim motywie lub (co bardziej prawdopodobne) utworzyć niestandardowy plik szablonu block.tpl.php. Innym sposobem zmiany sposobu renderowania bloków jest użycie funkcji wstępnego przetwarzania dla bloków ( hook_preprocess_block () ).

kiamlaluno
źródło