Exposed Sorts для views 2, Grids - простое решение

Главные вкладки

Аватар пользователя Vladimir_VVV Vladimir_VVV 13 июня 2010 в 10:47

Как то меня заказчик попросил вывести сортировку по цене товара рядом с так называемым "Exposed Filters" но проблема заключалась в том что стиль отображения должен быть "Grid" то есть "сетка". И в отличии от стиля "Table"(таблица), в котором предусмотренны поля сортировки в виде ссылок в хидере таблицы, в Grid совершенно отсутствует возможность вывода элементов управления сортировкой.
Поискав готовые решения в интернете, немного опечалился необходимостью:

  1. Убийства котят Патчинга кода вьюс.
  2. Создания несколькух вьюсов с разными критериями сортировки и выводов в виде табов

Немного покурив трубку мира, решил посмотреть, чем же отличаются шаблоны стиля таблицы и сетки.
Оказалось, что с небольшими доработками, можно при указанном во вьюсе стиле "таблица", вывести результат в виде сетки.

И так что мы делаем:

  1. Создаем как обычно вьюс с нужными полями и фильтрами, можно с Exposed Filters, но не добавляем сортировку в Sort Criteria по тем полям, по которым будем делать "Exposed".
  2. Выбираем стиль "Таблица"(там где нам нужен "Grid") и в настройках этого стиля ставим галочку "Sortable" напротив необходимого нам поля, можно так же указать "Default sort" и ниже в выпадающем списке выбрать "Default sort order", если необходимо.
  3. После чего приступаем к темизации:

  4. Нажимаем во вьюсе на ссылку темизации (Точный перевод сказать не могу, у меня это "Тема:Information")
  5. Копируем название шаблона стиля для таблицы, желательно с идентификатором вьюса, что бы не испортить все таблицы, а темезировать только под конкретный вьюс. Например: если Ваш вьюс называется "super_puper" то второе имя файла для стиля будет "views-view-table—super-puper.tpl.php".Для общего развития можно нажать на ссылку "Style output" и сохранить(для изучения) оригинальный код стиля.
  6. Создаем в директории с Вашей темой файл с именем которое Вы выбрали выше("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>';
    ?>
  7. Нажимаем на кнопку "Rescan template files", после чего выбранное имя выделится жирным и при наведении на него будет указан путь к Вашей теме.
  8. Нажимаем "Ок" и сохраняем вьюс.

Все у нас есть "Exposed Filters" и ниже есть что-то типа "Exposed Sorts".

PS: Если вы скопировали код, ничего не меняя, имейте ввиду, что в нем есть русские буквы, поэтому сохранять нужно его как "UTF-8 без BOM"

Комментарии

Аватар пользователя Виктор Степаньков ака RxB Виктор Степаньк... 18 июня 2011 в 2:31

"Vladimir_VVV" wrote:

Неудобно, и не вьюс-стайл.


т.е вы хотите сказать, что

$header = array('бла бла бла', 'бла бла бла 2');
$row = array('somerows');
print theme('table', $header, $rows);

лучше вашего, наглядней и трушней

"Vladimir_VVV" wrote:
print '

';
foreach ($rows as $count => $row)
{
//////////////////
if($count%$columns==0)
{
$row_number++;
print '
';
}
//////////////////
print '

';
//////////////////
if($count%$columns+1==$columns)
{
print '

';
}
//////////////////
}
$last=($row_number*$columns)-$total_count;// смотрим сколько еще пустых ячеек нужно вывести
if($last)
{
while($last)
{
$last=$last-1;
print '

';
}
print '

';
}
print '

';
print '
';
foreach ($row as $field => $content)
{
print '
'.
// Вывод названий полей, берется по ключу $field из заголовка таблицы и удаляются если есть все теги (в т ч )
(!empty($header[$field])?''.strip_tags($header[$field]).':':'')
.$content.'

';
}
print '

';
print '

';

Аватар пользователя NIKS_ArtReaktor NIKS_ArtReaktor 22 сентября 2011 в 14:09

"RxB" wrote:
Ну есть же theme('table').
Зачем лепить то велосипеды?

Так и написали бы, как Вы представляете это сделать...
код в студию Smile

не все знают как это сделать с помощью theme('table')

а попробовали бы и оценили.