Drupal 7. Какая переменная в template.php определяет, какой шаблон страницы использовать?

Хорошо, вот в чем дело: я создаю веб-сайт Drupal, который имеет несколько разных разделов. Каждый раздел представляет собой представление, отображающее тип контента. (Каждый раздел имеет свой собственный тип контента). Например, у меня есть представление, указывающее на ?q=blog, которое отображает тип контента blog.

Все разделы немного отличаются друг от друга. Не как «веб-сайт внутри веб-сайта», но достаточно разные, чтобы все они не могли использовать один и тот же файл шаблона, и каждый из них мог быть изменен с помощью CSS. Каждому разделу нужен свой page.tpl.php.

К сожалению, файлы .info темы Drupal AFAIK могут либо назначать один page.tpl.php для всей темы, либо назначать page-node-####.tpl.php для каждого узла. На этом веб-сайте будет много контента, поэтому настройка Drupal для создания нового идентичного page-node-####.tpl.php для каждого созданного узла очень быстро станет неуправляемой.

Чтобы решить эту проблему, я собираюсь использовать pathauto для создания псевдонима для каждого типа контента. Например, всем узлам с типом контента blog присваивается псевдоним ?q=blog/[post title]. Измените template.php, чтобы использовать page-blog.tpl.php для любой страницы, псевдоним которой начинается со слова «блог».

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

function basic_preprocess_page(&$vars, $hook) {
    ...

    if( module_exists('path') ) {
        $alias = drupal_get_path_alias( $_GET['q'] );
        $site_section = "blog";
        if( strpos( $alias, $site_section ) === 0 ) {
            $VARIABLE_THAT_TELLS_THE_PAGE_WHAT_TEMPLATE_TO_USE = "/path/to/page-blog.php";
        }
    }
}

Я не могу найти $VARIABLE_THAT_TELLS_THE_PAGE_WHAT_TEMPLATE_TO_USE кто-нибудь знает, что это такое?

Возможно, мой сайт плохо структурирован. Если кто-нибудь знает, как реструктурировать мой сайт, чтобы мне было легче сделать тему с отдельными разделами, поделитесь, пожалуйста, как!

Бесконечно благодарен! (c:

РЕДАКТИРОВАТЬ: Возможно, мне нужно вместо этого использовать предложения шаблонов. Кто-нибудь знает функцию или переменную для установки этого?


person Christian Chapman    schedule 11.04.2011    source источник


Ответы (2)


Они изменили имя этого ключа массива в D7, и я нигде не видел, чтобы это было задокументировано. Я наконец понял это после хорошей отладки. Вы можете переопределить шаблон темы в template.php с помощью hook_preprocess_page() следующим образом:

function myTheme_preprocess_page(&$vars) {
global $node;

if ($node->type == 'blog') {
     $vars['theme_hook_suggestions'] = array('my__blog_template'); // use my--blog-template.tpl.php, note '-' = '_'
}
elseif ($node->type == 'articles') {
    $vars['theme_hook_suggestions'] = array('article__node_template'); // use article--node-template.tpl.php
}
}

Да, и не забудьте очистить кеш Drupal после внесения изменений в ваш template.php.

person mattacular    schedule 13.04.2011

Хорошо, я нашел это: http://drupal.org/node/223440#comment-991840

$alias = drupal_get_path_alias($_GET['q']);
  if ($alias != $_GET['q']) {
    $template_filename = 'page';
    foreach (explode('/', $alias) as $path_part) {
      $template_filename = $template_filename . '-' . $path_part;
      $variables['template_files'][] = $template_filename;
    }
  }

Кредит на эту функцию принадлежит пользователю mfb.

У меня было много проблем с этим, поэтому я объясню это здесь, если кто-то найдет это полезным.

Эта функция входит в ваш template.php. Это должно быть частью функции <theme name>_preprocess_page. Что он делает, так это берет псевдоним, а затем разбивает его на кучу разных компонентов. Например, если вы находитесь на странице с псевдонимом ?q=blog/blog-post-title, она будет разделена на blog и blog-post-title. Затем он превращает каждый компонент в имя для предложения по шаблону. Он помещает каждое предложение шаблона в массив template_files[] (внутри массива $variables[]), так что теперь на странице есть два новых предложения шаблона:

page-blog и page-blog-blog-post-title

Предлагаемые шаблоны представляют собой альтернативные файлы шаблонов. В данном случае они предназначены для страниц, но не обязательно. У вас могут быть предложения шаблонов для всего, что вы можете придумать, включая блоки, узлы и тому подобное. Не позволяйте названию «предложение шаблона» одурачить вас. Предлагаемые шаблоны будут использоваться вместо шаблонов по умолчанию, пока они существуют. Я не знаю, почему его так назвали. Думаю, надо переименовать.

Теперь, когда вы настроили Drupal для поиска предложения шаблона, указывающего на ваш псевдоним, вам нужно создать новый файл шаблона, где все остальное находится в вашей теме. В этом случае, скажем, я хочу создать тему для всего раздела блога. В папке шаблонов я должен создать файл с именем page--blog.tpl.php (обратите внимание на --двойные дефисы--) с нужным мне макетом.

Drupal будет использовать самый конкретный шаблон, который он может найти, поэтому, если вы хотите, вы можете сделать один пост в блоге, который будет выглядеть совершенно иначе, чем остальная часть сайта, если вы создадите для него шаблон с именем page--blog--blog-post-title и поместите его в каталог шаблонов вашей темы. (опять же, обратите внимание на двойные дефисы.)

person Christian Chapman    schedule 12.04.2011