xandeadx.ru Блог музицирующего веб-девелопера

Drupal → Различные page.tpl.php в зависимости от условий

Опубликовано в

Иногда необходимо, чтобы некоторые страницы имели свой уникальный основной шаблон (layout, он же page.tpl.php).

Самый простой способ добиться этого, это создать в папке темы файл с именем на основе url. Например при генерации страницы mysite.ru/search Drupal будет искать в папке темы файл с именем page--search.tpl.php и если он существует, то будет использовать его, вместо стандартного. По такому принципу можно создавать свои layout-ы для определённых нод (например page--node--223.tpl.php для темизации страницы mysite.ru/node/223) или терминов таксономии (page--taxonomy--term--85.tpl.php для темизации страницы mysite.ru/taxonomy/term/85). Подробнее в официальном руководстве.

Но что делать если основной шаблон нужно использовать больше одного раза, и в зависимости от каких-нибудь условий, например для нод с nid равным 1 или 99.

На помощь приходит функция предварительной обработки страницы. В template.php добавляем:

/**
 * Preprocess vars for page.tpl.php.
 */
function THEMENAME_preprocess_page(&$vars) {
  // page--someword.tpl.php для нод с nid равным 1 или 99
  if (isset($vars['node']) && in_array($vars['node']->nid, array(1, 99))) {
    $vars['theme_hook_suggestions'][] = 'page__someword';
  }
}

Дальше в папке темы создаём файл page--someword.tpl.php, очищаем кэш, и смотрим результат.

Написанное актуально для Drupal 7
Похожие записи

Комментарии RSS

Почему-то сниппет при вставке в template.php выдает ошибку Fatal error: Cannot redeclare phptemplate_preprocess_page()... Был бы ОЧЕНЬ признателен за помощь в решении проблемы

у вас два раза определена функция phptemplate_preprocess_page, одну нужно удалить, либо обе совместить в одну

ОГРОМНОЕ СПАСИБО! Совместил, все получилось!

А если есть необходимость вывести по типу ноды - что нужно переделать в вашем коде?

вместо nid проверять тип ноды $vars['node']->type

Спасибо.

А что-то подобное есть для Drupal 8?

Здравствуйте! Прошу высказать мнение.

Как идеологически правильно реализовать использование различных шаблонов для одного и того же материала в зависимости от устройства и разрешения экрана посетителя?

Применить метод, описанный в статье (создать, например, page--mobile.tpl.php) или прописать простынёй все условия в основном шаблоне?

Спасибо!

Правильней не использовать различные шаблоны. Темизируйте с помощью css.

Приведу пример. Для мобильной версии требуется отображать посетителю другой набор данных: упрощённо, не 10 картинок, а 3. При этом скрыть остальные картинки средствами css не проблема, а я их хочу даже не загружать для увеличения скорости загрузки страницы. Как быть в такой ситуации?

Сказано просто, но запутано!

Но что делать если основной шаблон нужно использовать больше одного раза, и в зависимости от каких-нибудь условий, например для нод с nid равным 1 или 99.

А что если нужно вновь созданный шаблон использовать только для определённых страниц?
Меня устраивает основной шаблон, но нужно темизировать с десяток страниц...
Поделитесь как это сделать?

if (определённые_страницы) {
  $vars['theme_hook_suggestions'][] = 'page__someword';
}

Спасибо за оперативный ответ!
Мне это никак не помогло. Пытался оба способа использовать, но не срабатывает ничего.
Вы уж меня простите за настойчивость.
Пытался подключить к типу материала fish--page.tpl.php

function mytblog_preprocess_page(&$vars, $hook) {
if (isset($vars['node'])) {
$vars['theme_hook_suggestions'][] = 'page__'. str_replace('_', '--', $vars['node']->type);
}
}

Использовал просто вашу конструкцию, чтобы увидеть, что это работает, ни и дальше, чтобы понять как.

function THEMENAME_preprocess_page(&$vars) {
// page-someword.tpl.php для нод с nid равным 1 или 99
if (isset($vars['node']) && in_array($vars['node']->nid, array(1, 10))) {
$vars['theme_hook_suggestions'][] = 'page__someword';
}
} подключая page--someword.tpl.php

А

if (определённые_страницы) {
$vars['theme_hook_suggestions'][] = 'page__someword';
}Я просто не впишу её куда нужно)))) Простите ещё раз)))

Но никаких изменений, ничего не происходит.
Направите на мысль, где я совершаю ошибку?

Напишите нормально какой код у вас не работает и какой результат вы хотите получить.

Сработало.
Правильно я понимаю, что page__someword в своей статье вы назвали основным шаблоном?
Это меня и запутало, потому что основным шаблоном я посчитал файл page.tpl.php
Потому что подключая
function myblog_preprocess_page(&$vars) {
// page-someword.tpl.php для нод с nid равным 1 или 99
if (isset($vars['node']) && in_array($vars['node']->nid, array(1, 5))) {
$vars['theme_hook_suggestions'][] = 'page__someword';
}
}Он сработал именно на 1,5 ноде, а я смотрел по всем страницам, кроме этих! Потому что невнимательно прочёл комментарий для нод с nid равным 1 или 99.
Получается это как раз то, что было и нужно, подключить определённый шаблон к определённым страничкам! С чего и начался весь этот разговор.
Просто моя невнимательность, а точнее запарка.

А что именно я хочу.
У меня есть стандартный шаблон page.tpl.php который выводит всё что возможно, так как используется тема. Я хотел подключить свой шаблон, чтобы легче было темизировать файлы css и подключить тип материала который отличается по стилям от основного содержимого сайта. Искал подходящий вариант.
В итоге как подключить свой тип материала? function myblog_preprocess_page(&$vars, $hook) {
if (isset($vars['node'])) {
$vars['theme_hook_suggestions'][] = 'page__'. str_replace('_', '--', $vars['node']->type);
}
} Эта функция не срабатывает.

И как подключить ко всему сайту свой шаблон?

Спасибо за вашу помощь!

Основной шаблон это page.tpl.php, всё что с суффиксами "--" это дополнительные шаблоны.

Эта функция не срабатывает

Должна срабатывать.

И как подключить ко всему сайту свой шаблон?

Скопировать его в папку темы.

Спасибо! Все работает как часы, так же, как и ваша поддержка в комментариях.
Скажите, есть ли такая функция, которая присваивает один шаблон к двум, трём типам материала?
Просто конопатить тысячи страниц не представляется возможным, чтобы их конвертировать.

if (два_три_типа_материала) {
  $vars['theme_hook_suggestions'][] = 'page__someword';
}

Оставить комментарий

Содержимое этого поля является приватным и не будет отображаться публично. Если у вас есть аккаунт в Gravatar, привязанный к этому e-mail адресу, то он будет использован для отображения аватара.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Доступные HTML теги: <a> <i> <b> <strong> <code> <ul> <ol> <li> <blockquote> <em> <s>
  • Строки и параграфы переносятся автоматически.
  • Подсветка кода осуществляется с помощью тегов: <code>, <css>, <html>, <ini>, <javascript>, <sql>, <php>. Поддерживаемые стили выделения кода: <foo>, [foo].

Подробнее о форматировании