Les suggestions de modèle de page ne fonctionnent pas

12

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.

Paul Sheldrake
la source
/templates/page/page--node-type.tpl.php cela ne devrait-il pas être page - blog.tpl.php?
Jeremy French

Réponses:

14

Comme indiqué dans Drupal 7 Template Suggestions , la suggestion de modèle utilisée par défaut depuis 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']( $variablesest 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);
kiamlaluno
la source
5

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 contenu

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.
  }
}
?>
Bob Rivers
la source
Merci beaucoup ... montrer la relation entre la suggestion et le nom du modèle a vraiment aidé. Merci encore :)
SGhosh
2

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. Fait intéressant, 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, par exemple / issue / # / front_cover

Daniel
la source
suggestion de modèle pour un type de contenu front_page ce sera sans aucun script de préprocesseur: page - front-cover.tpl.php
sneha.kamble