Ситуация следующая.
Имеется подтема Genesis. Двуколоночная верстка: шапка, кастомный регион для слайд-шоу,основной контент и сайдбар(справа), футер. На страницах с нодами(форум, статьи и т.п.) сайдбар пуст и необходимо, чтобы блок(в css смысле)с основным контентом занимал освободившееся место справа, т.е. растягивался на всю ширину.
Вижу такие решения проблемы:
1) в page.tpl.php динамически добавлять к контейнеру, который нужно растянуть css-класс, если сайдбар пуст
<div class="content-inner <?php if (!$page['sidebar_second']): print "content-inner-not-sidebar"; endif;>">
2) использовать разные шаблоны для страниц с сайдбаром и без.
Какой из них более корректен? Возможно есть более правильное и изящное решение? Ситуация, я думаю, тривиальная, возможно она вообще решается через настройки алминки, но чет я ничего другого придумать не могу.
Спасибо.
Комментарии
Более корректно будет, в настройках блока задать отображение: "Исключая перечисленные страницы". В которые вбить "форум, статьи и т.п."
Ага, только контейнер с основным содержимым сам себе width=100% не поставит:) Посмотрела: например, в Bartik, динамически меняется ширина контейнера(480-720px). Пока,правда, не вижу каким образом.
UPD Нашла класс
.one-sidebar #content {
width: 720px;
}
.two-sidebars #content {
width: 480px;
}
.no-sidebars #content {
width: 960px;
float: none;
}
Непонятно только, где он вешается на контейнер.
За Genesis не скажу, но в Zen данная ситуация отрабатывается автоматически. Если блок пустой, то он не выводиться и его регион не выводится, а в body добавляется класс, условно говоря, without-sidebars. И соответственно контент растягивается на всю страницу.
Сильно удивлюсь, если в других продвинутых темах нет аналогичного механизма.
Каким образом?
Я тоже так думаю. Но я переопределила layout.css, само ядро темы не трогала. Вот хочу разобраться, как же все-таки добавляется этот класс. Думаю, да, алгоритм у всех тем один.
Т.е. как бы мою проблему решают оба указанные мной варианты, но хочется соблюсти все тонкости идеологии и стандарты Drupal.
Думаю, что задание переменной типа $classes во время отработки всех темизатора. Блоки же раньше чем page.tpl.php генерируются и соответственно к моменту сбора страницы у нас есть информация какой из блоков/регионов пустой.
в функциях препроцесса.
Посмотри в теме гарланд в файле template.php использование и саму функцию phptemplate_body_class
Сейчас не скажу в какой теме, помоему в template.php preprocess_page проводился анализ наличия контента в сайlебарах и для body добавлялся класс или ид , что-то вроде no-sidebar, one-sidebar, two-sidebar
Спасибо, Михаил. Теперь понятен принцип: как это делается в 6-ке. Вот только у меня 7-ка. И в Гарланде уже нет этой функции в template.php. Как же здесь дело обстоит?
логика та же. Посмотри zen_preprocess_html, там где формируется $variables['classes_array']
Спасибо большое. Получилось.
<?php
function subgenesis_preprocess_html(&$variables) {
if (empty($variables['page']['sidebar_second'])) {
$variables['classes_array'][] =drupal_html_class('not-sidebar');
}
} ?>
А можно по подробнее, куда этот код вставить в Bartik
Скажите, пожалуйста, в каком месте это обрабатывается? Например, хочу отобразить пустой регион "highlighted", без контента.
UPD: Придумал путь "в обход": создал пустой блок (в поле контента - пробел), засунул в регион "highlighted", и из шаблона для этого блока выбросил всё, на выходе получил пустой div региона.
block.tpl.php, наверное
<?php
if ($content) {
blah_blah;
}?>
Нет, вы меня не так поняли. Моя вина, надо было процитировать не кусок предложения, а всё целиком. block.tpl.php вызывается, если в регионе есть блок. Но как мне получить в браузере пустой регион?
Ведь, если нет контента, не добавлен какой-нибудь блок, то и регион не будет отображён.