web-dev-qa-db-fra.com

Les suggestions de modèle de page ne fonctionnent pas

J'ai créé un thème et j'ai mes fichiers de modèles dans cette structure

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

J'ai créé un modèle de page personnalisé mais pour une raison quelconque, il n'est pas récupéré par Drupal. J'ai effacé mon cache et j'ai également essayé d'ajouter cette fonction de préprocesseur dans le fichier theme template.php mais cela ne fonctionne toujours pas.

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

Toute aide serait appréciée.

12
Paul Sheldrake

Comme indiqué dans Drupal 7 Template Suggestions , la suggestion de modèle utilisée par défaut à partir de Drupal 7 pour les pages est page - [front | internal/path] .tpl.php .

Pour une page visible sur http://www.example.com/node/1/edit , Drupal rechercherait les fichiers de modèle suivants:

  • page - nœud - edit.tpl.php
  • page - nœud - 1.tpl.php
  • page - node.tpl.php
  • page.tpl.php

Pour ajouter des suggestions supplémentaires, votre thème doit implémenter template_preprocess_page () et ajouter de nouvelles suggestions dans $variables['theme_hook_suggestions'] ($variables est la variable transmise par référence à la fonction).

Si vous avez fait cela, la seule raison pour laquelle le fichier de modèle suggéré n'est pas utilisé est que le fichier n'est pas correctement nommé: dans le cas où la page affiche une page de livre, par exemple, le fichier de modèle doit être page - book.tpl .php. Vous pouvez modifier le code de votre thème et le laisser utiliser le modèle page - node-type.tpl.php, s'il ne trouve pas de modèle comme page - book.tpl.php.

A noter également que dans theme_get_suggestions () (qui est la fonction appelée par template_preprocess_page () ) les tirets sont remplacés par _, et non l'inverse. La raison de cette opération est expliquée dans un commentaire rapporté dans le code de fonction.

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

J'utilise Drupal 7.4, et j'ai eu le même problème et la seule chose qui a aidé était ce post: Comment ajouter un page.tpl personnalisé basé sur les types de conten =

De la poste:

<?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

J'ai passé trop de temps à essayer de suivre l'exemple ci-dessus en utilisant le remplacement de chaîne dans Drupal 7.22. Cela ne semble pas fonctionner pour moi. Il est intéressant de noter que certains types de contenu semblent être suggérés automatiquement, tandis que d'autres ne le font pas C'est le code qui a fonctionné pour moi à la fin.

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

donc la suggestion de modèle pour un type de contenu front_page ce serait alors:

page - front_cover.tpl.php

Fait intéressant, la suggestion de modèle de code pour le type de contenu "problème" se présente sous la forme d'une page - issue.tpl.php sans avoir besoin d'un script de préprocesseur!? À mes fins, cela semble remplacer le modèle de vue qui utilise un chemin similaire.

c'est à dire.

afficher le chemin =/issue/# suggestion de modèle en fonction du type de contenu, c'est-à-dire/issue/#/front_cover

2
Daniel