С такой задачей я сталкиваюсь, когда приходится использовать многозначное поле 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 потребуется изменить:
<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).
Код функции:
// Считаем количество непустых полей
$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
Комментарии
спс, в закладки