Простейший способ автоматически отделить CSS-классами самые верхние блоки в регионах для последующей темизации.

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

Аватар пользователя OldWarrior OldWarrior 27 сентября 2009 в 14:32

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

6-ка. Простая задачка: дизайнер сделал градиентный вертикальный фон страницы, и в верхних областях сайдбаров фоновая картинка блоков по его макету отличается от нижележащих (иначе они будут плохо гармонировать с фоном). То есть, для самых верхних блоков в регионе однозначно нужен дополнительный CSS класс.

Можно, конечно использовать модуль BlockClass для ручной привязки дополнительных классов к отдельным блокам, но заказчика пугают вещи вроде идентификаторов блоков и это не самый гибкий подход (тем более, что у него действительно есть необходимость довольно часто перемещать блоки).

Итак, копнул theme.inc, нашёл theme_blocks():

01518 function theme_blocks($region) {
01519   $output = '';
01520
01521   if ($list = block_list($region)) {
01522     foreach ($list as $key => $block) {
01523       // $key == <i>module</i>_<i>delta</i>
01524       $output .= theme('block', $block);
01525     }
01526   }
01527
01528   // Add any content assigned to this region through drupal_set_content() calls.
01529   $output .= drupal_get_content($region);
01530
01531   return $output;
01532 }

Переопределяю эту функцию в своём template.php с добавлением единственной строки:

function phptemplate_blocks($region) {
  $output = '';

  if ($list = block_list($region)) {

  // вот эту самую строчку нужно добавить:
  $list[key($list)] -> top = true;

    foreach ($list as $key => $block) {
      // $key == <i>module</i>_<i>delta</i>
      $output .= theme('block', $block);
    }
  }
 
  // Add any content assigned to this region through drupal_set_content() calls.
  $output .= drupal_get_content($region);
 
  return $output;
}

Топаю в шаблон блока block.tpl.php и нахожу div, открывающий блок:

<div id="block-<?php print $block->module .'-'. $block->delta; ?>" class="block block-<?php print $block->module ?>">
...

Добавляю незаметную капельку кода после class="block block-(module_name)":

<div id="block-<?php print $block->module .'-'. $block->delta; ?>" class="block block-<?php print $block->module ?><?php isset($block->top) ? print ' top' : '' ;?>">

Очищаю кэш темы. Теперь все самые верхние блоки во всех регионах дают вывод:

<div id="block-block-4" class="block block-block top">

В то время, как все нижележащие блоки молча им завидуют, потому что у них такого нет и никогда не будет:

<div id="block-block-4" class="block block-block">

Теперь можно идти в CSS и наряжать верхний блок в соответствии с макетом. В жизни так много приятных вещей.

Комментарии

Аватар пользователя Stutzer Stutzer 27 сентября 2009 в 14:45

Интересное решение.
Как вариант — можно с помощью jQuery селектить вырхний блок и ассигновать ему нужный класс. Проще, но при выкл. js, разумеется, не будет работать )

Аватар пользователя Stutzer Stutzer 27 сентября 2009 в 15:37

Допустим у нас есть сайдбар с некоторым количеством блоков

<div id="sidebar">
 
  <div class="block">
  ...
  </div>
 
  <div class="block">
  ...
  </div>
 
  <div class="block">
  ...
  </div>
 
</div>

Для того, чтоб присвоить к самому верхнему блоку класс «top» добавляем следующий js-код

if (Drupal.jsEnabled) {
  $(document).ready(function(){
 
    $('div#sidebar div.block:first').addClass('top');
 
  });
}
Аватар пользователя Vladimir_VVV Vladimir_VVV 27 сентября 2009 в 20:24

я чет не понял а номер блока в регионе уже не справляется с этой задачей? Поищите файлы tpl.php в ядерных модулях найдете block.tpl.php и еще много других с подробным описанием переменных, так вот в block.tpl.php есть
* - $block_id: Counter dependent on each block region.
Это номер блока в регионе
а теперь дописываете в свой block.tpl.php (после $block->module)

module .'-'. $block->delta; ?>" class="block block-<?php print $block->module ?> num-<?php print $block_id; ?>">

и получается верхний блок каждого региона с классом num-1 ничего при этом в темплейт писать ненада

Аватар пользователя OldWarrior OldWarrior 28 сентября 2009 в 11:46

Vladimir_VVV wrote:
... так вот в block.tpl.php есть
* - $block_id: Counter dependent on each block region.
Это номер блока в регионе ...

В этом месте я хлопаю себя себя по лбу. Smile
Честно: просто не знал про этот счетчик.

Отмечу в посте, что простейшее решение в вашем комментарии.