AmiSEO Drupal Хитрости Различные шаблоны page.tpl.php для разных типов материалов
Печать PDF

Различные шаблоны page.tpl.php для разных типов материалов

+ 13
+ 0

По умолчанию в Drupal 7 имена шаблонов для page.tpl.php имеют вид page--[front|internal/path].tpl.php

То есть для главной страницы page--front.tpl.php, для страницы node/1 — page--node--1.tpl.php, для страницы редактирования — page--node--edit.tpl.php
Для views так же сработает вариант, если указать путь в имени шаблона. Например, для страницы views, доступной по адресу catalog, шаблон будет иметь имя page--catalog.tpl.php

Почитать подробнее можно на Drupal.org

Но, к сожалению, для конкретных типов материала возможность задать свой шаблон page.tpl не предусмотрена. Решается данная проблема внедрением хука в файл template.php

function имятемы_preprocess_page(&$vars, $hook) {
 if (isset($vars['node'])) {
 $vars['theme_hook_suggestions'][] = 'page__'. str_replace('_', '--', $vars['node']->type);
 }
}

Теперь для типа материала product вы сможете создавать шаблон с именем page--product.tpl.php

Еще один более продвинутый хук для шаблонизации приведу ниже

function mytheme_preprocess_page(&$vars) {
 if (isset($vars['node']->type)) { // Проверяем, что это не термин таксономии и не страница views
 // Это настройки по умолчанию. Измените их если вам понадобится.
 array_splice($vars['theme_hook_suggestions'], -1, 0, 'page__'.$vars['node']->type);
 // Берем текущий адрес в переменную url_alias и делаем каждую состоявляющюю url частью массива
 $url_alias = drupal_get_path_alias($_GET['q']);
 $split_url = explode('/', $url_alias);
 // Добавляем использование шаблона с указанием полного пути
 $cumulative_path = '';
 foreach ($split_url as $path) {
 $cumulative_path .= '__' . $path;
 $path_name = 'page' . $cumulative_path;
 array_splice($vars['theme_hook_suggestions'], -1, 0, str_replace('-','_',$path_name));
 }
 // Добавляем использование шаблона по имени ноды
 if (count($split_url) > 1) {
 $page_name = end($split_url);
 array_splice($vars['theme_hook_suggestions'], -1, 0, 'page__'.str_replace('-','_',$page_name));
 }
 }
}

Пояснения

page.tpl.php — все страницы, включая главную, таксономию, views и обычные страницы, если ничего не переопределяет их.
page–node–%.tpl.php — это тоже самое, что и использование page.tpl.php и переопределяет его.
page–[content-type].tpl.php — все страницы указаного типа контента.

За описанное выше отвечает часть кода

array_splice($vars['theme_hook_suggestions'], -1, 0, 'page__'.$vars['node']->type);

page–[path-1].tpl.php — переопределяет конкретный путь.
page–[path-1]–[path-2].tpl.php — здесь переопределяем все пути, указанные в имени шаблона, их может быть сколько угодно, пока позволяет файловая система сервера.
page–[path-1]–[path-2]–[node-name].tpl.php — Последний и наиболее точный (отменяет все предыдущие, так как является более конкретным) включает в себя название ноды.

За описанное выше отвечает часть кода

$cumulative_path = '';
foreach ($split_url as $path) {
  $cumulative_path .= '__' . $path;
  $path_name = 'page' . $cumulative_path;
  array_splice($vars['theme_hook_suggestions'], -1, 0, str_replace('-','_',$path_name));
}

page–[node-name].tpl.php — примерно тоже самое, что и page–[path-1]–[path-2]–[page-name].tpl.php — оперирует названием ноды для подстановки шаблона, для русского языка наверное не сгодится, поэтому лучше использовать page–node–[nid].tpl.php. К тому же при смене названия ноды шаблон перестанет работать и за этим нужно тщательно следить.

За описанное выше отвечает часть кода

if (count($split_url) > 1) {
  $page_name = end($split_url);
  array_splice($vars['theme_hook_suggestions'], -1, 0, 'page__'.str_replace('-','_',$page_name));
}

Вот еще одно пояснение, в каком порядке подключаются шаблоны. Нижестоящий шаблон переопределяет вышестоящий:

page–node.tpl.php
page–node–%.tpl.php
page–article.tpl.php
page–path-1.tpl.php
page–path-1–path-2.tpl.php
page–path-1–path-2–my-article.tpl.php
page–my-article.tpl.php
page–node–5.tpl.php

Комментарии 

 
0 #2 AmiGator 26.02.2014 13:07
могу разве что посоветовать поставить модуль devel, помогает в разработке. больше не знаю, чем помочь
Цитировать
 
 
0 #1 Вадим 25.02.2014 06:25
Здравствуйте...

Когда что-то не срабатывает или не работает...

как по кусками проверить работу кода?

шаблон не изменяется...
Цитировать