Основной файл любой темы оформления – это 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);
}
убрать ее визуально ничего не меняет, но все равно гденибудь всплывет потом