Как то меня заказчик попросил вывести сортировку по цене товара рядом с так называемым "Exposed Filters" но проблема заключалась в том что стиль отображения должен быть "Grid" то есть "сетка". И в отличии от стиля "Table"(таблица), в котором предусмотренны поля сортировки в виде ссылок в хидере таблицы, в Grid совершенно отсутствует возможность вывода элементов управления сортировкой.
Поискав готовые решения в интернете, немного опечалился необходимостью:
Убийства котятПатчинга кода вьюс.- Создания несколькух вьюсов с разными критериями сортировки и выводов в виде табов
Немного покурив трубку мира, решил посмотреть, чем же отличаются шаблоны стиля таблицы и сетки.
Оказалось, что с небольшими доработками, можно при указанном во вьюсе стиле "таблица", вывести результат в виде сетки.
И так что мы делаем:
- Создаем как обычно вьюс с нужными полями и фильтрами, можно с Exposed Filters, но не добавляем сортировку в Sort Criteria по тем полям, по которым будем делать "Exposed".
- Выбираем стиль "Таблица"(там где нам нужен "Grid") и в настройках этого стиля ставим галочку "Sortable" напротив необходимого нам поля, можно так же указать "Default sort" и ниже в выпадающем списке выбрать "Default sort order", если необходимо.
- Нажимаем во вьюсе на ссылку темизации (Точный перевод сказать не могу, у меня это "Тема:Information")
- Копируем название шаблона стиля для таблицы, желательно с идентификатором вьюса, что бы не испортить все таблицы, а темезировать только под конкретный вьюс. Например: если Ваш вьюс называется "super_puper" то второе имя файла для стиля будет "views-view-table—super-puper.tpl.php".Для общего развития можно нажать на ссылку "Style output" и сохранить(для изучения) оригинальный код стиля.
- Создаем в директории с Вашей темой файл с именем которое Вы выбрали выше("views-view-table—super-puper.tpl.php") и вставляем в него код:
<?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
*/
$columns=3; // !!! указываем здесь всего колонок для вывода в виде grid
if (!empty($title))
{
print '<h3>'.$title.'</h3>';
}
$sort='';
foreach ($header as $field => $label)
{
if(!(strpos($label,'<a ')===FALSE))// очень важная проверка
{// сделано для вывода !Только! названий полей которые являются сортируемыми то есть тегами <a>
$sort .='<span class="views-field views-field-'.$fields[$field].'">'.$label.'</span>';
}
}
if(!empty($sort))
{
print '<div class="views-header-sort"><label class="views-label-sort">Сортировка:</label>'.$sort.'</div>';
} $total_count=count($rows);// всего для вывода $row_number=0;
print '<table class="views-view-grid"><tbody>';
foreach ($rows as $count => $row)
{
//////////////////
if($count%$columns==0)
{
$row_number++;
print '<tr class="row-'.$row_number.'">';
}
//////////////////
print '<td class="col-'.(($count%$columns)+1).'">';
print '<div class="views-row views-row-'.($count+1).' views-row-'. implode(' ', $row_classes[$count]).'">';
foreach ($row as $field => $content)
{
print '<div class="views-field views-field-'.$fields[$field].'">'.
// Вывод названий полей, берется по ключу $field из заголовка таблицы и удаляются если есть все теги (в т ч <a>)
(!empty($header[$field])?'<label class="views-label-'.$fields[$field].'">'.strip_tags($header[$field]).':</label>':'')
.$content.'</div>';
}
print '</div>';
print '</td>';
//////////////////
if($count%$columns+1==$columns)
{
print '</tr>';
}
//////////////////
}
$last=($row_number*$columns)-$total_count;// смотрим сколько еще пустых ячеек нужно вывести
if($last)
{
while($last)
{
$last=$last-1;
print '<td class="col-'.($columns-$last).'"> </td>';
}
print '</tr>';
}
print '</tbody></table>';
?> - Нажимаем на кнопку "Rescan template files", после чего выбранное имя выделится жирным и при наведении на него будет указан путь к Вашей теме.
- Нажимаем "Ок" и сохраняем вьюс.
После чего приступаем к темизации:
Все у нас есть "Exposed Filters" и ниже есть что-то типа "Exposed Sorts".
PS: Если вы скопировали код, ничего не меняя, имейте ввиду, что в нем есть русские буквы, поэтому сохранять нужно его как "UTF-8 без BOM"
Комментарии
Огрооооооомнейшее спасибо!!!!
Единственное пейджера нет)
Файл назвал файл так :
views-view-table--catalog--page-1.tpl.php
Пардон, пейджер есть)
спасибо за рашение
С чего бы это вдруг? Вьюс ненастроен?
Ну есть же theme('table').
Зачем лепить то велосипеды?
Неудобно, и не вьюс-стайл.
т.е вы хотите сказать, что
$row = array('somerows');
print theme('table', $header, $rows);
лучше вашего, наглядней и трушней
Я хочу сказать что наглядней скопировать код из вьюса чем писать самому.
Так и написали бы, как Вы представляете это сделать...
код в студию
не все знают как это сделать с помощью theme('table')
а попробовали бы и оценили.
Таким личностям принципиальный совет сходить в гугл, так как выше пример кода есть
Спасибо, очень помогло!