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

С такой задачей я сталкиваюсь, когда приходится использовать многозначное поле 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) ?>:&nbsp;</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

Источник: http://drupal.ru/node/55728

Добавить комментарий к записи "Табличная темизация многозначных полей CCK"

Чтобы комментировать, необходимо войти в систему.

© 2009 Обзор CMS