Imprimindo regiões em html.tpl.php


10

Eu preciso gerar algumas regiões no modelo html.tpl.php, pois elas não mudam entre page.tpl.php e page-front.tpl.php (apenas para citar dois). Basicamente, quero evitar a duplicação de código.

No entanto, parece não haver nada associado a regiões no html.tpl.php, nem eu consegui recuperar nada usando drupal_get_region_content (com e sem parâmetros, ele retorna apenas uma matriz vazia).

Ideias?


Você usou drupal_set_region_content()para definir o conteúdo da região?
kiamlaluno

2
Não existe essa função. Talvez você quis dizer, drupal_add_region_content()mas não vejo sentido: defino o conteúdo das regiões através da interface de administração dos blocos.
Morpheu5

1
Sim, eu quis dizer drupal_add_region_content().
kiamlaluno

Respostas:


18

Eu resolvi assim:

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

e então eu poderia fazer

<?php print render($region_name) ?>

Por que usar eco? Claro que funciona.
precisa saber é o seguinte

Claro, se eu estivesse implementando um módulo ou tema público, seria obrigado a seguir os padrões da comunidade. Este era um tema personalizado que estava sendo usado exclusivamente por meu cliente.
Morpheu5

Eu sei que este é um post extremamente antigo, mas acho que é de mau julgamento aceitar uma resposta em que o autor da resposta responda preguiçosamente à pergunta. por exemplo, você fornece uma função a ser adicionada, mas assume que todos os leitores saberão magicamente onde esse código deve residir. Essa é a parte preguiçosa e estou votando negativamente nisso, pois não está fornecendo nada para usuários / desenvolvedores drupais novatos.
Skittles

Agradeço sua opinião e o fato de que os novatos podem não estar recebendo uma explicação completa. No entanto, considere que a) a alimentação com colher gera novatos preguiçosos eb) para qualquer um que tenha lido rapidamente os documentos (como qualquer novato não preguiçoso deveria ter) o posicionamento dessa função deve ser relativamente óbvio. Caso contrário, existe um manual por um bom motivo. Minha pergunta (e resposta) lida com um problema em um nível em que um certo conhecimento básico do tema Drupal pode ser assumido. Além disso, este é um site de perguntas e respostas, o site Docs fica ao lado.
Morpheu5

1
@ Skitties Não é possível duplicar aqui a documentação apenas porque os novos usuários não sabiam quais são as funções de pré-processo como a mostrada na pergunta. Isso nem faz parte da questão. Se os usuários tiverem uma pergunta específica sobre as funções de pré-processo, eles farão uma nova pergunta.
Kiamlaluno

2

drupal_get_region_content()retorna o conteúdo que foi definido com as chamadas anteriores para drupal_add_region_content(), mas não inclui o conteúdo dos blocos, que são renderizados na página por meio de block_page_build () .

Se você procurar "drupal_add_region_content" no código fonte do Drupal, notará que a função é chamada por:

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

O que você define para os blocos na página administrativa é em quais regiões os blocos serão renderizados, mas seu conteúdo não será adicionado drupal_add_region_content(); de fato, nenhuma das funções listadas acima (que são as únicas chamadas de funções drupal_add_region_content(), exceto o código para testar uma instalação do Drupal) é para renderizar / adicionar o conteúdo do bloco.

Se você precisar renderizar os blocos em seu próprio código, verifique o código usado no block_page_build(). Em particular, este é o código que provavelmente é mais útil para você:

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

As duas primeiras linhas verificam se a página exibida não é a página de demonstração usada para mostrar onde as regiões temáticas estão localizadas.

Se você precisar renderizar os blocos de uma maneira diferente, é mais provável que você esteja interessado em substituir theme_block () no seu tema ou (ainda mais provavelmente) em criar um arquivo de modelo block.tpl.php personalizado. Outra maneira de alterar a maneira como os blocos são renderizados é usar uma função de pré-processamento para os blocos ( hook_preprocess_block () ).

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.