[РЕШЕНО] Динамическое изменение верстки, если регион пустой

Главные вкладки

Аватар пользователя drup-drop drup-drop 10 сентября 2011 в 13:38

Ситуация следующая.
Имеется подтема Genesis. Двуколоночная верстка: шапка, кастомный регион для слайд-шоу,основной контент и сайдбар(справа), футер. На страницах с нодами(форум, статьи и т.п.) сайдбар пуст и необходимо, чтобы блок(в css смысле)с основным контентом занимал освободившееся место справа, т.е. растягивался на всю ширину.

Вижу такие решения проблемы:
1) в page.tpl.php динамически добавлять к контейнеру, который нужно растянуть css-класс, если сайдбар пуст
<div class="content-inner <?php if (!$page['sidebar_second']): print "content-inner-not-sidebar"; endif;>">
2) использовать разные шаблоны для страниц с сайдбаром и без.

Какой из них более корректен? Возможно есть более правильное и изящное решение? Ситуация, я думаю, тривиальная, возможно она вообще решается через настройки алминки, но чет я ничего другого придумать не могу.

Спасибо.

Комментарии

Аватар пользователя thezoom thezoom 10 сентября 2011 в 13:53

Более корректно будет, в настройках блока задать отображение: "Исключая перечисленные страницы". В которые вбить "форум, статьи и т.п."

Аватар пользователя drup-drop drup-drop 10 сентября 2011 в 14:27

Ага, только контейнер с основным содержимым сам себе width=100% не поставит:) Посмотрела: например, в Bartik, динамически меняется ширина контейнера(480-720px). Пока,правда, не вижу каким образом.

UPD Нашла класс

 
.one-sidebar #content {
width: 720px;
}
.two-sidebars #content {
  width: 480px;
}
.no-sidebars #content {
  width: 960px;
  float: none;
}

Непонятно только, где он вешается на контейнер.

Аватар пользователя v1adimir@drupal.org v1adimir@drupal.org 10 сентября 2011 в 14:30

За Genesis не скажу, но в Zen данная ситуация отрабатывается автоматически. Если блок пустой, то он не выводиться и его регион не выводится, а в body добавляется класс, условно говоря, without-sidebars. И соответственно контент растягивается на всю страницу.

Сильно удивлюсь, если в других продвинутых темах нет аналогичного механизма.

Аватар пользователя drup-drop drup-drop 10 сентября 2011 в 14:51

"<a href="mailto:v1adimir@drupal.org">v1adimir@drupal.org</a>" wrote:
добавляется класс, условно говоря, without-sidebars

Каким образом?

"<a href="mailto:v1adimir@drupal.org">v1adimir@drupal.org</a>" wrote:
Сильно удивлюсь, если в других продвинутых темах нет аналогичного механизма.

Я тоже так думаю. Но я переопределила layout.css, само ядро темы не трогала. Вот хочу разобраться, как же все-таки добавляется этот класс. Думаю, да, алгоритм у всех тем один.

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

Аватар пользователя v1adimir@drupal.org v1adimir@drupal.org 10 сентября 2011 в 15:34

drup-drop wrote:
"<a href="mailto:v1adimir@drupal.org">v1adimir@drupal.org</a>" wrote:
добавляется класс, условно говоря, without-sidebars

Каким образом?

Думаю, что задание переменной типа $classes во время отработки всех темизатора. Блоки же раньше чем page.tpl.php генерируются и соответственно к моменту сбора страницы у нас есть информация какой из блоков/регионов пустой.

Аватар пользователя natbampo natbampo 10 сентября 2011 в 15:40

"drup-drop" wrote:
Вот хочу разобраться, как же все-таки добавляется этот класс

в функциях препроцесса.
Посмотри в теме гарланд в файле template.php использование и саму функцию phptemplate_body_class

Аватар пользователя Orion76 Orion76 10 сентября 2011 в 15:41

Сейчас не скажу в какой теме, помоему в template.php preprocess_page проводился анализ наличия контента в сайlебарах и для body добавлялся класс или ид , что-то вроде no-sidebar, one-sidebar, two-sidebar

Аватар пользователя drup-drop drup-drop 10 сентября 2011 в 15:55

Спасибо, Михаил. Теперь понятен принцип: как это делается в 6-ке. Вот только у меня 7-ка. И в Гарланде уже нет этой функции в template.php. Как же здесь дело обстоит?

Аватар пользователя drup-drop drup-drop 10 сентября 2011 в 17:02

Спасибо большое. Получилось.

<?php

  

function subgenesis_preprocess_html(&$variables) {
 
    if (empty(
$variables['page']['sidebar_second'])) {
    
      
$variables['classes_array'][] =drupal_html_class('not-sidebar'); 
    
    }
  }

?>
Аватар пользователя vinta vinta 14 октября 2012 в 15:43

drup-drop wrote:
Спасибо большое. Получилось.

<?php

  

function subgenesis_preprocess_html(&$variables) {
 
    if (empty(
$variables['page']['sidebar_second'])) {
    
      
$variables['classes_array'][] =drupal_html_class('not-sidebar'); 
    
    }
  }

?>

А можно по подробнее, куда этот код вставить в Bartik

Аватар пользователя SergO SergO 14 октября 2011 в 23:43

"<a href="mailto:v1adimir@drupal.org">v1adimir@drupal.org</a>" wrote:
... но в Zen данная ситуация отрабатывается автоматически. Если блок пустой, то он не выводиться ...

Скажите, пожалуйста, в каком месте это обрабатывается? Например, хочу отобразить пустой регион "highlighted", без контента.

UPD: Придумал путь "в обход": создал пустой блок (в поле контента - пробел), засунул в регион "highlighted", и из шаблона для этого блока выбросил всё, на выходе получил пустой div региона.

Аватар пользователя SergO SergO 15 октября 2011 в 1:44

Нет, вы меня не так поняли. Моя вина, надо было процитировать не кусок предложения, а всё целиком. block.tpl.php вызывается, если в регионе есть блок. Но как мне получить в браузере пустой регион?

<div class="region region-highlighted"> </div>

Ведь, если нет контента, не добавлен какой-нибудь блок, то и регион не будет отображён.