Меняю местами строки и колонки таблицы во вюсах в Drupal

Во время создания таблицы сравнения товаров стала задача развернуть на pi/2 стандартную таблицу во избежание неровностей при отображении товаров.

На входе было примерно такое:

Название товара Параметр 1 Параметр 2 Параметр 3 Параметр 4
Товар 1 Значение 1-1 Значение 1-2 Значение 1-3 Значение 1-4
Товар 2 Значение 2-1 Значение 2-2 Значение 2-3 Значение 2-4

А требовалось что-то похожее на это:

Товар 1 Товар 2
Параметр 1
Значение 1-1
Параметр 1
Значение 2-1
Параметр 2
Значение 1-2
Параметр 2
Значение 2-2
Параметр 3
Значение 1-3
Параметр 3
Значение 2-3
Параметр 4
Значение 1-4
Параметр 4
Значение 2-4

Для реализации такой фичи я воспользовался стандартными возможностями views, а именно слегка переписал базовый шаблон Page: Theming information (style)

<?php
// $Id: views-view-table.tpl.php,v 1.8 2009/01/28 00:43:43 merlinofchaos Exp $
/**
 * @file views-view-table.tpl.php
 * Template to display a view as a table.
 *
 * - $title : The title of this group of rows. May be empty.
 * - $header: An array of header labels keyed by field id.
 * - $fields: An array of CSS IDs to use for each field id.
 * - $class: A class or classes to apply to the table, based on settings.
 * - $row_classes: An array of classes to apply to each row, indexed by row
 * number. This matches the index in $rows.
 * - $rows: An array of row items. Each row is an array of content.
 * $rows are keyed by row number, fields within rows are keyed by field ID.
 * @ingroup views_templates
 */
?>
<table class="<?php print $class; ?>">
<?php if (!empty($title)) : ?>
<caption><?php print $title; ?></caption>
<?php endif; ?>
<thead>
<tr>
<?php foreach ($header as $field => $label): ?>
<th class="views-field views-field-<?php print $fields[$field]; ?>">
<?php print $label; ?>
</th>
<?php endforeach; ?>
</tr>
</thead>
<tbody>
<?php foreach ($rows as $count => $row): ?>
<tr class="<?php print implode(' ', $row_classes[$count]); ?>">
<?php foreach ($row as $field => $content): ?>
<td class="views-field views-field-<?php print $fields[$field]; ?>">
<?php print $content; ?>
</td>
<?php endforeach; ?>
</tr>
<?php endforeach; ?>
</tbody>
</table>

Немного теории: для подключения своего шаблона нужно взять стандартный и положить его под специфическим именем в папку с темой. Имя зависит от ваших конкретных требований и подсмотреть его можно во views'е в Basic settings -> Theme -> Style output. Если таких шаблонов планируется довольно приличное колличество, то лучше их сложить в папку views в папке темы, что-бы они не мешали под ногами.

Для того, что-бы шаблон подхватился нужно ему нужно потом сделать "Rescan template files" во вьюсе в разделе Basic settings -> Theme.

 

Теперь что конкретно было сделано для достижения нужного эффекта:

  1. Строки таблиц были заменены колонками
  2. Заголовки таблицы перекочевали в сами поля
  3. Непосредственные заголовки были изведены как класс

Собственно код шаблона моей таблицы:

<?php
$aNormalRows=$rows;
$rows=array();
foreach($fields as $key=>$value){
    $aNewRow=array();
    foreach($aNormalRows as $count=>$row){
        if(empty($header[$key])){
            $aNewRow[$key.'.'.$count]=$row[$key];
        }else{
            $aNewRow[$key.'.'.$count]='<h4 class="header">'.$header[$key].'</h4>'.$row[$key];
        }
    }
    $rows[]=$aNewRow;
}
unset($aNormalRows);
unset($header);
?>
<table class="<?php print $class; ?>">
<?php if (!empty($title)) : ?>
<caption><?php print $title; ?></caption>
<?php endif; ?>
<tbody>
<?php foreach ($rows as $count => $row): ?>
<tr class="<?php print implode(' ', $row_classes[$count]); ?>">
<?php foreach ($row as $field => $content):
            $field=preg_replace('/\.\d+$/','',$field);
            ?>
<td class="views-field views-field-<?php print $fields[$field]; ?>">
<?php print $content; ?>
</td>
<?php endforeach; ?>
</tr>
<?php endforeach; ?>
</tbody>
</table>

 

Урра!! Работает. Комментарии, как всегда, приветствуются.

PS: Через некоторое время полёта было замечено пара-тройка багов, которые я успешно и пофиксил.

RSSAdd to Google

Обсуждение:

Как вам материальчик? *



















Тема:

Мысль:

Как звать-то:

Почта:

PS: Комментарии публикуются только после проверки модератором.

PPS: E-mail'ы не публикуются.

* обязательные поля