As regiões podem ser impressas em um modelo de nó?


25

As regiões podem ser impressas em um modelo de nó ou estão estritamente restritas aos modelos de página?

Respostas:


48

Você pode imprimir regiões dentro de qualquer modelo, mas elas não estão disponíveis fora da caixa no node.tpl.phpmodelo. Para disponibilizá-los, você criará uma nova variável para uso em seu node.tpl.phpmodelo que conterá todo o conteúdo da região.

A criação de novas variáveis ​​de modelo é feita usando uma função de pré-processo. No template.phparquivo do seu tema , crie uma função parecida com esta:

function mytheme_preprocess_node(&$variables) {
}

Substituindo mythemepelo nome abreviado do seu tema. Agora, para que o Drupal reconheça essa nova função de pré-processo, você precisa reconstruir o registro de temas do seu site. Isso é tão simples quanto acessar ConfiguraçãoDesenvolvimentoDesempenho e pressionar o botão "Limpar todos os caches" na parte superior.

Agora, a maneira como as funções de pré-processo funcionam é que $variablescontém uma matriz que corresponde às variáveis ​​disponíveis do seu modelo. Por exemplo, em node.tpl.php, $submittedcontém o autor byline. Na função de pré-processo acima, é encontrada em $variables['submitted'].

Para imitar o que você tem page.tpl.php, onde você tem uma matriz chamada $pageque contém todas as regiões, convém preencher $variables['page'].

O problema é que $pagein node.tpl.phpjá está preenchido com um valor verdadeiro / falso que permite saber se você está olhando o nó sozinho ou em uma listagem.

Portanto, para evitar essa colisão de nomes, preencha $region:

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

Em seguida, no node.tpl.phpmodelo do seu tema , você pode renderizar qualquer região fazendo o seguinte:

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

Onde sidebar_firsté o nome da região que você deseja renderizar.


11
Finalmente uma solução de trabalho para Drupal 7 :)
Eduard Luca

4
Há também uma solução rápida e suja que funcionou para mim <?php print render(block_get_blocks_by_region('machine_name_of_your_region'));?>. A partir daqui: webomelette.com/add-region-node-template
Darragh Enright

Esta solução é bacana. Você poderia dar exemplos de quando é mais aplicável imprimir regiões no node.tpl.php em vez de tê-lo no page.tpl.php?
quer

Depende do seu design. Às vezes, o layout pode colocar a barra lateral em um local onde é muito mais fácil criar um tema se estivesse dentro da div do nó, em vez de fora dela.
ROOBY

Não se esqueça dos wrappers de região apropriados! Veja system_page_alter () para referência. Lembre-se de que block_get_blocks_by_region()retorna apenas uma matriz de blocos e, se você quiser renderizá-lo como uma região, precisará adicionar um wrapper de região.
SiliconMind
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.