Табличная темизация многозначных полей 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

С такой задачей я сталкиваюсь, когда приходится использовать многозначное поле 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://www.drupal.ru/node/55728

© 2009 Обзор CMS