Темизация CCK поля в Drupal

Например, имеем тип материала Галерея, со списком cck-полей Изображение(field_images).
В стандарте при просмотре материала картинки отображаются списком, что не очень-то красиво.
Для отображения картинок в таблице используем Темизацию CCK поля в Drupal.
Все cck поля по дефолту выводятся с использованием шаблона sites/all/modules/cck/theme/content-field.tpl.php. Чтобы выводить одно из полей в своей разметке, нужно:
1. Скопировать файл content-field.tpl.php в папку с темой.
2. Создать дубликат скопированного файла с именем в виде content-field-FIELD_NAME.tpl.php, где вместо FIELD_NAME указать имя поля. Например если поле называется field_images, то файл будет иметь имя content-field-field_images.tpl.php.
3. Отредактировать этот файл (content-field-FIELD_NAME.tpl.php) по своему желанию.
Просто заменяем тот код на этот:


 
'field-items'); $caption = $label_display == 'inline' ? t($label) : NULL; print theme('table', array(), mytheme_fields2table($items, 3, NULL, TRUE), $attributes, $caption); ?>

Функцию mytheme_fields2table Заменяем на Имя_Нашей_Темы_fields2table.
Главная задача функции mytheme_fields2table() состоит в том, чтобы преобразовать список полей $items в массив, подходящий для функции theme_table().

4. Код функции mytheme_fields2table() надо разместить в файле tempalte.php вашей темы (если файла нет, создайте его). Название функции должно начинаться с системного названия вашей темы (например, mytheme).

Код функции:

function mytheme_fields2table($items, $width=NULL, $height=NULL, $by_strings=TRUE){
// Считаем количество непустых полей
   $count = 0;
   $tmp = array();
   foreach ($items as $delta => $item) 
     if (!$item['empty']) {
       $tmp[] = $item;
           $count++;
     }
// Вычисляем размер таблицы на основании числа полей и принятых параметров высоты и/или ширины
   if(!$width && !$height && !$by_strings) {
     $sqrt = sqrt((float) $count);
     $height = ceil($sqrt);
     $width = ceil($count/$height);
   } elseif(!$width && !$height && $by_strings) {
     $sqrt = sqrt((float) $count);
     $width = ceil($sqrt);
     $height = ceil($count/$width);
   } elseif($width && $height && !$by_strings) {
     $max_count = $width*$height;
         $width = $max_count > $count ? ceil($count/$height) : $width;
   } elseif($width && $height && $by_strings) {
     $max_count = $width*$height;
         $height = $max_count > $count ? ceil($count/$width) : $height;
   } elseif($width) {
     $height = ceil($count/$width);
   } else {
     $width = ceil($count/$height);
   }
// Заполняем строки таблицы при необходимости добавляя пустые ячейки или отбразывая лишние поля
     $rows = array();
         $empty = array('data'=>'', 'class'=>'field-item-empty');
     for ($i=0;$i<$height;$i++){
           $line = array();
       for ($j=0;$j<$width;$j++){
             $index = $by_strings ? $i*$width+$j : $j*$height+$i;
         $line[] = empty($tmp[$index]) ? $empty : array('data'=>$tmp[$index]['view'], 'class'=>'field-item');
           }
           $rows[] = $line;
         }
   return $rows;
}

Параметры функции:
$items - исходные массив значений поля. Часто он содержит больше элементов, чем есть полей на самом деле, поэтому их количество отдельно считается в начале функции.
$width - ширина таблицы или количество ячеек в строке.
$height - высота таблицы или количество ячеек в столбце.
$by_strings - способ заполнения таблицы. TRUE - заполняется по строкам, FALSE - по столбцам.

Если задан один из параметров - высота или ширина, то таблица будет ограничена этой высотой или шириной, второй параметр будет вычисляться в зависимости от количества элементов поля. Если не задан ни один, то таблица будет максимально близкой к квадратной. Если же задать оба параметра, то таблица не превысит указанного размера, при этом лишние элементы поля будут отброшены.

5. Сбросить кэш тут: admin/settings/performance

Способ подходит для любых полей CCK.

Рекомендовать в Социальных сетях:
 

Один комментарий на “Темизация CCK поля в Drupal

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *