Sugestie szablonów stron nie działają

12

Utworzyłem motyw i mam pliki szablonów w tej strukturze

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

Stworzyłem niestandardowy szablon strony, ale z jakiegoś powodu Drupal go nie odbiera. Wyczyściłem pamięć podręczną, a także próbowałem dodać tę funkcję preprocesora do pliku szablonu theme.php, ale nadal nie działa.

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

Każda pomoc będzie mile widziana.

Paul Sheldrake
źródło
/templates/page/page--node-type.tpl.php czy to nie powinna być strona - blog.tpl.php?
Jeremy French

Odpowiedzi:

14

Jak podano w Propozycjach szablonów Drupal 7 , domyślną propozycją szablonów z Drupal 7 dla stron jest strona - [przód | wewnętrzny / ścieżka] .tpl.php.

W przypadku strony widocznej pod adresem http://www.example.com/node/1/edit Drupal szuka następujących plików szablonów:

  • page - node - edit.tpl.php
  • page - node - 1.tpl.php
  • strona - node.tpl.php
  • page.tpl.php

Aby dodać dodatkowe sugestie, twój motyw powinien implementować template_preprocess_page () i dodać nowe sugestie w $variables['theme_hook_suggestions']( $variablesjest to zmienna przekazywana przez odwołanie do funkcji).

Jeśli to zrobiłeś, jedynym powodem, dla którego sugerowany plik szablonu nie jest używany, jest to, że plik nie ma prawidłowej nazwy: w przypadku, gdy strona pokazuje stronę książki, na przykład plik szablonu powinien mieć postać page - book.tpl .php. Możesz zmienić kod swojej kompozycji i pozwolić jej używać szablonu strony - node-type.tpl.php, jeśli nie znajdzie szablonu takiego jak page - book.tpl.php.

Zauważ też, że w theme_get_suggestions () (która jest funkcją wywoływaną przez template_preprocess_page () ) łączniki są zastępowane przez _, a nie odwrotnie. Powód, dla którego to zostało zrobione, wyjaśniono w komentarzu zgłoszonym w kodzie funkcji.

// 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
źródło
5

Korzystam z Drupal 7.4 i miałem ten sam problem, a jedyną rzeczą, która pomogła, był ten post: Jak dodać niestandardowy page.tpl na podstawie typów treści

Z postu:

<?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
źródło
Dzięki bardzo ... pokazanie związku między sugestią a nazwą szablonu naprawdę pomogło.
Jeszcze
2

Spędziłem zbyt długo próbując podążać za powyższym przykładem przy użyciu metody zamiany ciągów w Drupal 7.22. Wydaje mi się, że to nie działa. Co ciekawe, niektóre typy treści wydają się sugerowane automatycznie, a inne nie. To jest kod, który w końcu zadziałał dla mnie.

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

więc propozycja szablonu dla typu zawartości front_page to:

strona - front_cover.tpl.php

Co ciekawe, sugestia szablonu kodu dla typu zawartości „problem” pojawia się jako strona - problem.tpl.php bez potrzeby korzystania ze skryptu preprocesora !? Wydaje mi się, że to zastępuje szablon widoku, który używa podobnej ścieżki.

to znaczy

wyświetl ścieżkę = / problem / # sugestia szablonu na podstawie typu zawartości, tj. / issue / # / front_cover

Daniel
źródło
propozycja szablonu dla typu zawartości front_page będzie to bez skryptu preprocesora: page - front-cover.tpl.php
sneha.kamble