Las sugerencias de plantilla de página no funcionan

12

He creado un tema y tengo mis archivos de plantilla en esta estructura

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

He creado una plantilla de página personalizada pero, por alguna razón, Drupal no la está utilizando. He borrado mi caché y también he intentado agregar esta función de preprocesador en el archivo template.php del tema pero todavía no funciona.

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

Cualquier ayuda sería apreciada.

Paul Sheldrake
fuente
/templates/page/page--node-type.tpl.php ¿no debería ser page - blog.tpl.php?
Jeremy French

Respuestas:

14

Como se informa en las Sugerencias de plantillas de Drupal 7 , la sugerencia de plantilla utilizada de forma predeterminada desde Drupal 7 para las páginas es página - [front | internal / path] .tpl.php.

Para una página visible en http://www.example.com/node/1/edit , Drupal buscaría los siguientes archivos de plantilla:

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

Para agregar sugerencias adicionales, su tema debe implementar template_preprocess_page () y agregar nuevas sugerencias en $variables['theme_hook_suggestions']( $variableses la variable pasada por referencia a la función).

Si lo hizo, entonces la única razón por la que el archivo de plantilla sugerido no se está utilizando es porque el archivo no tiene un nombre correcto: en el caso de que la página muestre una página de libro, por ejemplo, el archivo de plantilla debería ser page - book.tpl .php. Puede cambiar el código de su tema y dejar que use la plantilla page - node-type.tpl.php, si no encuentra una plantilla como page - book.tpl.php.

Para notar también eso, en theme_get_suggestions () (que es la función llamada por template_preprocess_page () ) los guiones se reemplazan por _, y no al revés. La razón por la que se hace se explica en un comentario informado en el código de función.

// 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
fuente
5

Estoy usando Drupal 7.4, y tuve el mismo problema y lo único que me ayudó fue esta publicación: Cómo agregar un page.tpl personalizado según los tipos de contenido

De la publicación:

<?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
fuente
Muchas gracias ... mostrar la relación entre la sugerencia y el nombre de la plantilla realmente ayudó mucho. Gracias de nuevo :)
SGhosh
2

He pasado demasiado tiempo tratando de seguir el ejemplo anterior usando el reemplazo de cadenas en Drupal 7.22. Esto no parece funcionar para mí. Curiosamente, algunos tipos de contenido parecen sugerirse automáticamente, mientras que otros no. Este es el código que funcionó para mí al 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;
  }

entonces la sugerencia de plantilla para un tipo de contenido de front_page sería:

página - front_cover.tpl.php

Curiosamente, la sugerencia de plantilla de código para el tipo de contenido de 'problema' aparece como page - issue.tpl.php sin necesidad de un script de preprocesador. Esto para mi propósito parece anular la plantilla de vista que usa una ruta similar.

es decir

view path = / issue / # sugerencia de plantilla basada en el tipo de contenido, es decir / issue / # / front_cover

Daniel
fuente
sugerencia de plantilla para un tipo de contenido de front_page, esto será sin ningún script de preprocesador: page - front-cover.tpl.php
sneha.kamble