Меняю местами строки и колонки таблицы во вюсах в 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.
Теперь что конкретно было сделано для достижения нужного эффекта:
- Строки таблиц были заменены колонками
- Заголовки таблицы перекочевали в сами поля
- Непосредственные заголовки были изведены как класс
Собственно код шаблона моей таблицы:
<?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: Через некоторое время полёта было замечено пара-тройка багов, которые я успешно и пофиксил.


