CListView пример использования

Недавно в конференции были вопросы по CListView. Поэтому решил написать небольшой пример использования данного класса. Он предназначен для вывода сущностей(в частности моделей) в виде списка(упорядоченных блоков). Допустим у нас товары и их надо вывести в категории, по 12штук на странице с возможность сортировки по названию и цене товара. Код моделей опущу, т.к. он прост и не принципиален.
Контроллер отвечающий за вывод категории, ни чего сложно. Принимает параметром $alias — псевдоним категории. Производит простые манипуляции, получает данные от модели и отдает их в отображение. Все остальные значимые пометки сделал в коде.
CategoriesController.php

public function actionView($alias) {
    $category = Category::model()->getByAlias($alias);

    if(!$category)
        throw new CHttpException(404, 'Такой страницы не существует.');

    // заполняем заголовок страницы, хлебные крошки,
    // устанавливаем различные значения для СЕО и т.п.
    ...
    // формируем критерий для выборки товаров
    $criteria = new CDbCriteria();
    $criteria->condition = 'category_id = :categoryId';
    $criteria->params = array(':categoryId'=>$category->id);
    // создаем экземпляр CSort для сортировки в CGridView,
    // можно так же описать простым массивом
    $sort = new CSort();
    // имя $_GET параметра для сортировки,
    // по умолчанию ModelName_sort
    $sort->sortVar = 'sort';
    // сортировка по умолчанию 
    $sort->defaultOrder = 'good.final_price ASC';
    // включает поддержку мультисортировки, 
    // т.е. можно отсортировать сразу и по названию и по цене
    $sort->multiSort = true;
    // здесь описываем аттрибуты, по которым будет сортировка
    // ключ может быть произвольный, это будет $_GET параметр
    $sort->attributes = array(
                    'title'=>array(
                        'label'=>'названию',
                        'asc'=>'good.title ASC',
                        'desc'=>'good.title DESC',
                        'default'=>'desc',
                    ),
                    'price'=>array(
                        'asc'=>'good.final_price ASC',
                        'desc'=>'good.final_price DESC',
                        'default'=>'desc',
                        'label'=>'цене',
                    ),
                );
    $dataProvider = new CActiveDataProvider(Good::model()->active()->with('category'), 
            array(
                'criteria'=>$criteria,
                'sort'=>$sort,
                'pagination'=>array(
                    'pageSize'=>12,
                ),
            )
    );
    $this->render('view', array('model'=>$category, 'dataProvider'=>$dataProvider));
}

Представление view.php:

<?php $this->widget('zii.widgets.CListView', array(
    'dataProvider'=>$dataProvider,
    'itemView'=>'_good', // представление для одной записи
    'ajaxUpdate'=>false, // отключаем ajax поведение
    'emptyText'=>'В данной категории нет товаров.',
    'summaryText'=>"{start}&mdash;{end} из {count}",
    'template'=>'{summary} {sorter} {items} <hr> {pager}',
    'sorterHeader'=>'Сортировать по:',
    // ключи, которые были описаны $sort->attributes
    // если не описывать $sort->attributes, можно использовать атрибуты модели
    // настройки CSort перекрывают настройки sortableAttributes
    'sortableAttributes'=>array('title', 'price'),
    'pager'=>array(
        'class'=>'CLinkPager',
        'header'=>false,
        'cssFile'=>'/css/pager.css', // устанавливаем свой .css файл
        'htmlOptions'=>array('class'=>'pager'),
    ),
)); ?>

Представление _good.php не буду приводить, т.к. в нем нет ни чего сложно. В нем доступен объект $data. Вот и весь пример использования.