As sugestões de modelo de página não estão funcionando

12

Eu criei um tema e tenho meus arquivos de modelo nessa estrutura

  • /templates/page/page.tpl.php
  • /templates/page/page--node-type.tpl.php

Eu criei um modelo de página personalizado, mas por algum motivo ele não está sendo escolhido pelo Drupal. Limpei meu cache e também tentei adicionar essa função de pré-processador no arquivo template.php do tema, mas ele ainda não está funcionando.

if (isset($vars['node'])) 
  {
    // If the node type is "blog" the template suggestion will be "page--blog.tpl.php".
    $vars['theme_hook_suggestions'][] = 'page__'. str_replace('_', '--', $vars['node']->type);
  }

Qualquer ajuda seria apreciada.

Paul Sheldrake
fonte
/templates/page/page--node-type.tpl.php não deve ser essa página - blog.tpl.php?
Jeremy French

Respostas:

14

Conforme relatado nas Sugestões de modelos do Drupal 7 , a sugestão de modelo usada por padrão no Drupal 7 para páginas é página - [frente | interno / caminho] .tpl.php.

Para uma página visível em http://www.example.com/node/1/edit , o Drupal procuraria os seguintes arquivos de modelo:

  • página - nó - edit.tpl.php
  • página - nó - 1.tpl.php
  • página - node.tpl.php
  • page.tpl.php

Para adicionar sugestões extras, seu tema deve implementar template_preprocess_page () e adicionar novas sugestões em $variables['theme_hook_suggestions']( $variablesé a variável passada por referência à função).

Se você fez isso, a única razão pela qual o arquivo de modelo sugerido não está sendo usado é porque o arquivo não está nomeado corretamente: no caso de a página mostrar uma página de livro, por exemplo, o arquivo de modelo deve ser page - book.tpl .php. Você pode alterar o código do seu tema e deixá-lo usar a página - modelo node-type.tpl.php, se não encontrar um modelo como a página - book.tpl.php.

Observe também que, em theme_get_suggestions () (que é a função chamada por template_preprocess_page () ), os hífens são substituídos por _, e não vice-versa. O motivo é explicado em um comentário relatado no código de função.

// When we discover templates in drupal_find_theme_templates(),
// hyphens (-) are converted to underscores (_) before the theme hook
// is registered. We do this because the hyphens used for delimiters
// in hook suggestions cannot be used in the function names of the
// associated preprocess functions. Any page templates designed to be used
// on paths that contain a hyphen are also registered with these hyphens
// converted to underscores so here we must convert any hyphens in path
// arguments to underscores here before fetching theme hook suggestions
// to ensure the templates are appropriately recognized.
$arg = str_replace(array("/", "\\", "\0", '-'), array('', '', '', '_'), $arg);
kiamlaluno
fonte
5

Estou usando o Drupal 7.4 e tive o mesmo problema e a única coisa que ajudou foi esta postagem: Como adicionar uma página.tpl personalizada com base nos tipos de conteúdo

Da postagem:

<?php
/**
* Variables preprocess function for the "page" theming hook.
*/
function THEME_NAME_preprocess_page(&$vars) {

  // Do we have a node?
  if (isset($vars['node'])) {

    // Ref suggestions cuz it's stupid long.
    $suggests = &$vars['theme_hook_suggestions'];

    // Get path arguments.
    $args = arg();
    // Remove first argument of "node".
    unset($args[0]);

    // Set type.
    $type = "page__type_{$vars['node']->type}";

    // Bring it all together.
    $suggests = array_merge(
      $suggests,
      array($type),
      theme_get_suggestions($args, $type)
    );

    // if the url is: 'http://domain.com/node/123/edit'
    // and node type is 'blog'..
    //
    // This will be the suggestions:
    //
    // - page__node
    // - page__node__%
    // - page__node__123
    // - page__node__edit
    // - page__type_blog
    // - page__type_blog__%
    // - page__type_blog__123
    // - page__type_blog__edit
    //
    // Which connects to these templates:
    //
    // - page--node.tpl.php
    // - page--node--%.tpl.php
    // - page--node--123.tpl.php
    // - page--node--edit.tpl.php
    // - page--type-blog.tpl.php          << this is what you want.
    // - page--type-blog--%.tpl.php
    // - page--type-blog--123.tpl.php
    // - page--type-blog--edit.tpl.php
    //
    // Latter items take precedence.
  }
}
?>
Bob Rivers
fonte
Muito obrigado ... Mostrar a relação entre a sugestão e o nome do modelo realmente ajudou. Obrigado novamente :)
SGhosh
2

Passei muito tempo tentando seguir o exemplo acima usando a substituição de string no Drupal 7.22. Isso não parece funcionar para mim. Curiosamente, alguns tipos de conteúdo parecem ser sugeridos automaticamente, enquanto outros não. Este é o código que funcionou para mim no final.

if (isset($variables['node'])) {
   // $variables['theme_hook_suggestions'][] = 'page__'. str_replace('_', '--', $variables['node']->type);
   //cannot get above working for some reason?
     $variables['theme_hook_suggestions'][] = 'page__' . $variables['node']->type;
  }

portanto, a sugestão de modelo para um tipo de conteúdo de front_page seria:

página - front_cover.tpl.php

Curiosamente, a sugestão de modelo de código para o tipo de conteúdo 'issue' aparece como page-issue.tpl.php sem a necessidade de um script de pré-processador !? Isso para meus propósitos parece substituir o modelo de exibição que usa um caminho semelhante.

ie

view path = / issue / # sugestão de modelo com base no tipo de conteúdo, por exemplo, / issue / # / front_cover

Daniel
fonte
sugestão de modelo para um tipo de conteúdo front_page este será, sem qualquer script pré-processador: Página - front-cover.tpl.php
sneha.kamble