Vorschläge für Seitenvorlagen funktionieren nicht

12

Ich habe ein Thema erstellt und meine Vorlagendateien in dieser Struktur

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

Ich habe eine benutzerdefinierte Seitenvorlage erstellt, die jedoch aus irgendeinem Grund nicht von Drupal übernommen wird. Ich habe meinen Cache geleert und auch versucht, diese Präprozessorfunktion in die Datei theme template.php einzufügen, aber sie funktioniert immer noch nicht.

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

Jede Hilfe wäre dankbar.

Paul Sheldrake
quelle
/templates/page/page--node-type.tpl.php sollte das nicht page - blog.tpl.php sein?
Jeremy French

Antworten:

14

Wie in Drupal 7-Vorlagenvorschlägen angegeben , lautet der von Drupal 7 standardmäßig für Seiten verwendete Vorlagenvorschlag page - [front | internal / path] .tpl.php.

Für eine Seite, die unter http://www.example.com/node/1/edit angezeigt wird, sucht Drupal nach den folgenden Vorlagendateien:

  • page - node - edit.tpl.php
  • Seite - Knoten - 1.tpl.php
  • page - node.tpl.php
  • page.tpl.php

Um zusätzliche Vorschläge hinzuzufügen, sollte Ihr Design template_preprocess_page () implementieren und neue Vorschläge hinzufügen $variables['theme_hook_suggestions']( $variablesist die Variable, die als Verweis auf die Funktion übergeben wird).

Wenn Sie dies getan haben, liegt der einzige Grund dafür, dass die vorgeschlagene Vorlagendatei nicht verwendet wird, darin, dass die Datei nicht korrekt benannt ist: Wenn die Seite eine Buchseite enthält, sollte die Vorlagendatei beispielsweise page - book.tpl sein .php. Sie können den Code für Ihr Thema ändern und die Vorlage page - node-type.tpl.php verwenden, wenn keine Vorlage wie page - book.tpl.php gefunden wird.

Zu beachten ist auch, dass in theme_get_suggestions () (das ist die Funktion, die von template_preprocess_page () aufgerufen wird ) Bindestriche durch _und nicht umgekehrt ersetzt werden. Der Grund dafür wird in einem im Funktionscode angegebenen Kommentar erläutert.

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

Ich verwende Drupal 7.4, und ich hatte das gleiche Problem und das einzige, was geholfen hat, war dieser Beitrag: Wie man eine benutzerdefinierte page.tpl basierend auf Inhaltstypen hinzufügt

Von der Post:

<?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
quelle
Vielen Dank ... die Beziehung zwischen dem Vorschlag und dem Vorlagennamen zu zeigen hat wirklich sehr geholfen.
Nochmals vielen
2

Ich habe zu lange versucht, dem obigen Beispiel mit String Replace in Drupal 7.22 zu folgen. Das scheint bei mir nicht zu funktionieren. Interessanterweise scheinen einige Inhaltstypen automatisch vorgeschlagen zu werden, während andere dies nicht tun. Dies ist der Code, der am Ende für mich funktioniert hat.

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

Der Vorlagenvorschlag für einen front_page-Inhaltstyp wäre dann:

Seite - front_cover.tpl.php

Interessanterweise wird der Codevorlagenvorschlag für den Inhaltstyp "Problem" als page - issue.tpl.php ohne Präprozessorskript ausgegeben !? Dies scheint für meine Zwecke die Ansichtsvorlage zu überschreiben, die einen ähnlichen Pfad verwendet.

dh

view path = / issue / # Vorlagenvorschlag basierend auf dem Inhaltstyp, dh / issue / # / front_cover

Daniel
quelle
Vorlagenvorschlag für einen front_page-Inhaltstyp ohne Präprozessorskript: page - front-cover.tpl.php
sneha.kamble