Табличная темизация многозначных полей CCK

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

Аватар пользователя direqtor direqtor 17 января 2011 в 13:56

С такой задачей я сталкиваюсь, когда приходится использовать многозначное поле imagefield для построения фотогалерей. Вывод иконок изображений в таблице лучше заполняет пространство веб-страницы да и выглядит аккуратнее, чем какой-либо другой способ. Конечно, есть и CSS-правила, позводляющие отображать любой тег HTML, как табличный, но работают они не во всех браузерах. И чем пытаться написать кроссбраузерный CSS, иногда проще вывести поля CCK в таблицу явно.

Для этого нам понадобиться переписать один шаблон для вывода поля и добавить в файл template.php вашей темы одну функцию.

Нам потребуется файл шаблона theme/content-field.tpl.php из модуля cck. Скопируйте его дважды в папку вашей темы (пусть она называется mytheme). У первую копии файла оставьте оригинальное название content-field.tpl.php, а вторую назовите content-field-ИМЯ_ПОЛЯ.tpl.php, где ИМЯ_ПОЛЯ – системное название того поля, которое вы хотите видеть в табличном виде.

Исходный код второго файла content-field-ИМЯ_ПОЛЯ.tpl.php потребуется изменить:

<?php if (!$field_empty) : ?>
<div class="field field-type-<?php print $field_type_css ?> field-<?php print $field_name_css ?>">
  <?php if ($label_display == 'above') : ?>
    <div class="field-label"><?php print t($label) ?>: </div>
  <?php endif;?>
  <?php
    $attributes = array('class'=>'field-items');
    $caption = $label_display == 'inline' ? t($label) : NULL;
    print theme('table', array(), mytheme_fields2table($items, 3, NULL, TRUE), $attributes, $caption); ?>
</div>
<?php endif; ?>

Как видите, изменения коснулись вывода заголовка поля (в случае настройки inline он выводится в caption таблицы), добавилась также дополнительная функция, которая преобразует набор значений поля $items в вид пригодный для прямого вывода в таблицу из трех столбцов.
Главная задача функции mytheme_fields2table() состоит в том, чтобы преобразовать список полей $items в массив, подходящий для функции theme_table(). Её код надо разместить в файле 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 - по столбцам.

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

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

Источники:

Табличная темизация многозначных полей CCK
Модуль CCK
Исходный код файла content-field.tpl.php

Комментарии