it-swarm-es.com

Las sugerencias de plantilla de página no funcionan

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á recogiendo. 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.

12
Paul Sheldrake

Como se informa en Drupal 7 Template Suggestions , la sugerencia de plantilla utilizada de forma predeterminada desde Drupal 7 para páginas es page - [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'] ($variables es 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 que, 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 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);
14
kiamlaluno

Estoy usando Drupal 7.4, y tuve el mismo problema y lo único que ayudó fue esta publicación: Cómo agregar un page.tpl personalizado basado en 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.
  }
}
?>
5
Bob Rivers

He pasado demasiado tiempo tratando de seguir el ejemplo anterior usando el reemplazo de cadena 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

2
Daniel