Предложения шаблона страницы не работают


12

Я создал тему и у меня есть файлы шаблонов в этой структуре

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

Я создал собственный шаблон страницы, но по какой-то причине он не был загружен Drupal. Я очистил свой кеш, а также попытался добавить эту функцию препроцессора в файл theme.php темы, но она все еще не работает.

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

Любая помощь будет оценена.


/templates/page/page--node-type.tpl.php не должно ли это быть page - blog.tpl.php?
Джереми Френч,

Ответы:


14

Как сообщалось в шаблонных предложениях Drupal 7 , шаблонным предложением, используемым по умолчанию из Drupal 7 для страниц, является страница - [front | internal / path] .tpl.php.

Для страницы, видимой по адресу http://www.example.com/node/1/edit , Drupal будет искать следующие файлы шаблонов:

  • страница - узел - edit.tpl.php
  • страница - узел - 1.tpl.php
  • страница - node.tpl.php
  • page.tpl.php

Чтобы добавить дополнительные предложения, ваша тема должна реализовать template_preprocess_page () и добавить новые предложения в $variables['theme_hook_suggestions']( $variablesэто переменная, переданная по ссылке в функцию).

Если вы это сделали, то единственная причина, по которой предложенный файл шаблона не используется, заключается в том, что файл имеет неправильное имя: например, в случае, когда на странице отображается страница книги, файл шаблона должен быть page - book.tpl .php. Вы можете изменить код вашей темы и позволить ему использовать шаблон page - type-type.tpl.php, если он не находит такой шаблон, как page - book.tpl.php.

Отметим также, что в theme_get_suggestions () (которая является функцией, вызываемой template_preprocess_page () ) дефисы заменяются _, а не наоборот. Причина, по которой это делается, объясняется в комментарии, приведенном в коде функции.

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

5

Я использую Drupal 7.4, и у меня возникла та же проблема, и единственное, что мне помогло, это сообщение: Как добавить пользовательский page.tpl на основе типов контента

Из поста:

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

Большое спасибо ... показать, что связь между предложением и именем шаблона действительно очень помогло.
Еще

2

Я слишком долго пытался следовать приведенному выше примеру, используя замену строк в Drupal 7.22. Это не похоже на работу для меня. Интересно, что некоторые типы контента предлагаются автоматически, а другие нет. Это код, который работал для меня в конце концов.

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

поэтому предложение шаблона для типа контента front_page будет тогда:

страница - front_cover.tpl.php

Интересно, что предложение шаблона кода для типа контента 'Issue' выполняется как page - issue.tpl.php без необходимости использования скрипта препроцессора !? Это для моих целей, кажется, переопределить шаблон представления, который использует аналогичный путь.

т.е.

путь просмотра = / проблема / # шаблонное предложение, основанное на типе контента, т.е. / проблема / # / front_cover


предложение шаблона для типа контента front_page, это будет без какого-либо скрипта препроцессора: page - front-cover.tpl.php
sneha.kamble
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.