Иногда необходимо, чтобы некоторые страницы имели свой уникальный основной шаблон (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
, очищаем кэш, и смотрим результат.
- Создание сравнительной таблицы с значениями из EAV Field
- Тест оверхеда Layout Builder и Paragraphs
- Темизация группы чекбоксов или радио-кнопок (#type=>checkboxes, #type=>radios)
- Как в Views программно изменить view mode выводимых сущностей по данным из cookie?
- Добавляем на страницу управления отображением материала поля "Заголовок" и "Дата создания"
Комментарии
Почему-то сниппет при вставке в template.php выдает ошибку Fatal error: Cannot redeclare phptemplate_preprocess_page()... Был бы ОЧЕНЬ признателен за помощь в решении проблемы
у вас два раза определена функция phptemplate_preprocess_page, одну нужно удалить, либо обе совместить в одну
ОГРОМНОЕ СПАСИБО! Совместил, все получилось!
А если есть необходимость вывести по типу ноды - что нужно переделать в вашем коде?
вместо
nid
проверять тип ноды$vars['node']->type
Спасибо.
А что-то подобное есть для Drupal 8?
Антон, https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Render%2…
Здравствуйте! Прошу высказать мнение.
Как идеологически правильно реализовать использование различных шаблонов для одного и того же материала в зависимости от устройства и разрешения экрана посетителя?
Применить метод, описанный в статье (создать, например, page--mobile.tpl.php) или прописать простынёй все условия в основном шаблоне?
Спасибо!
Правильней не использовать различные шаблоны. Темизируйте с помощью css.
Приведу пример. Для мобильной версии требуется отображать посетителю другой набор данных: упрощённо, не 10 картинок, а 3. При этом скрыть остальные картинки средствами css не проблема, а я их хочу даже не загружать для увеличения скорости загрузки страницы. Как быть в такой ситуации?
Сказано просто, но запутано!
А что если нужно вновь созданный шаблон использовать только для определённых страниц?
Меня устраивает основной шаблон, но нужно темизировать с десяток страниц...
Поделитесь как это сделать?
Спасибо за оперативный ответ!
Мне это никак не помогло. Пытался оба способа использовать, но не срабатывает ничего.
Вы уж меня простите за настойчивость.
Пытался подключить к типу материала fish--page.tpl.php
Использовал просто вашу конструкцию, чтобы увидеть, что это работает, ни и дальше, чтобы понять как.
А
Но никаких изменений, ничего не происходит.
Направите на мысль, где я совершаю ошибку?
Напишите нормально какой код у вас не работает и какой результат вы хотите получить.
Сработало.
Правильно я понимаю, что 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, всё что с суффиксами "--" это дополнительные шаблоны.
Должна срабатывать.
Скопировать его в папку темы.
Спасибо! Все работает как часы, так же, как и ваша поддержка в комментариях.
Скажите, есть ли такая функция, которая присваивает один шаблон к двум, трём типам материала?
Просто конопатить тысячи страниц не представляется возможным, чтобы их конвертировать.
Добавить комментарий