Отдельный файл page.tpl.php для каждого типа материала

06.08.2009

Основной файл любой темы оформления – это page.tpl.php. Именно в нем размещается макет сайта, общая структура, которая отображается на всех страницах сайта. Но что делать, если для определенного типа материалов (например, для новостей), макет, структура должна быть совсем другая. А если в принципе для каждого типа материала должен быть свой уникальный макет. Для решения этого вопроса надо использовать следующий сниппет. В файл template.php поместите следующий код:

function phptemplate_preprocess_page(&$variables) {
if  ($node = menu_get_object()) {
    $variables['node'] = $node;
    $suggestions = array();
    $template_filename = 'page';
    $template_filename = $template_filename . '-' . $variables['node']->type;
    $suggestions[] = $template_filename;
    $variables['template_files'] = $suggestions;
   }
}

Теперь Вы с легкостью можете изменить макет, просто создав файл page-nodetype.tpl.php. Например, для стандартного типа – «статьи» - надо будет создать файл page-story.tpl.php.

Добавить в блог:

Для вставки в блог анонса данной статьи, скопируйте нижеприведенный код.

Комментарии (4)

У меня версия Drupal 6.16
Этот способ почему-то не работает.
После того, как добавил в template.php этот код, при загрузке сайта появляется страница с текстом:

"Fatal error: Cannot redeclare phptemplate_preprocess_page() (previously declared in /sites/all/themes/premier/template.php:4) in /sites/all/themes/premier/template.php on line 62"

Помогите, пожалуйста, решить проблему.

Все заработало!
запустил update php
и перезапустил cron

Спасибо за изящное решение. Однако, при этом крашится главная страница, которая работает по шаблону page-front.tpl.php.

Посему предлагаю вот такую добавку:

function phptemplate_preprocess_page(&$variables) {
if ($node = menu_get_object()) {
$variables['node'] = $node;
$suggestions = array();
$template_filename = 'page';
$template_filename = $template_filename . '-' . $variables['node']->type;
$suggestions = $variables['template_files'];
$suggestions[] = $template_filename;
$variables['template_files'] = $suggestions;
}
}

То есть, предыдущие кандидаты в шаблоны тоже учитываются. Ну и главная страница не крашится :)

Критикуйте?

а что делать если такая функция уже есть в теме?

function phptemplate_preprocess_page(&$vars, $hook) {
$vars['comments'] = comment_render($vars['node'], $vars['node']->cid);
}

убрать ее визуально ничего не меняет, но все равно гденибудь всплывет потом