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?

tim76
fonte

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.


fonte
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