На сайте yii публикуется довольно много расширений от сторонних разработчиков, но не все из них одинаково полезны. Решил писать в блог о тех что понравились, чтобы самому не забыть, а может и ещё кому пригодится.

Сегодня рассмотрим три расширения на примере простой таблички post. Она имеет простейшую структуру:

CREATE TABLE IF NOT EXISTS post (
  id int(11) NOT NULL AUTO_INCREMENT,
  text text NOT NULL,
  date timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (id)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;

С помощью gii сгенерируем модель и CRUD. Приступаем.

yiinfinite-scroll
Страница на сайте yii: http://www.yiiframework.com/extension/yiinfinite-scroll
Репозиторий: https://github.com/davialexandre/yiinfinite-scroll

Это расширение делает один простой, но приятный эффект - вместо разбиения на страницы, аяксом подгружает элементы списка по мере прокручивания страницы вниз.

Для установки просто разархивируйте в папку extensions. В качестве простого примера использования рассмотрим страницу http://localhost/index.php?r=post/index

В actionIndex() контроллера PostController вместо того кода, который был сгенерирован автоматически пишем это:

$criteria = new CDbCriteria;
$total = Post::model()->count();


$pages = new CPagination($total);
$pages->pageSize = 3;
$pages->applyLimit($criteria);


$posts = Post::model()->findAll($criteria);


$this->render('index', array(
    'posts' => $posts,
    'pages' => $pages,
));

В соответствующий шаблон //post/index вместо

$this->widget('zii.widgets.CListView', array(
'dataProvider'=>$dataProvider,
'itemView'=>'_view',
));

Нужно написать

foreach($posts as $post) {
    $this->renderPartial('_view', array('data' => $post));
}


$this->widget('ext.yiinfinite-scroll.YiinfiniteScroller', array(
    'itemSelector' => 'div.view',
    'pages' => $pages,
));

После этого всё прекрасно работает. Важное свойсвто itemSelector, оно определяет селектор по которому можно выбрать все элементы списка. Поскольку используется jQuery, то понятно какие там можно использовать селекторы.

efeed
Страница на сайте yii: http://www.yiiframework.com/extension/efeed/

Следующий на очереди неплохой компонент для генерации rss и atom лент.

Установка как обычно, просто распаковываем в папку extensions.

Всё достаточно просто, в контроллере PostController создаём экшен actionRss() и добавляем в него следующий текст:

public function actionRss() {


        Yii::import('ext.feed.*');


        $feed = new EFeed();


        $feed->title = 'RSS 2.0 feed for posts.';
        $feed->description = 'This is test of creating a RSS 2.0 Feed';


        $feed->setImage('Yii Rock!', 'http://www.yiiframework.com',
            'http://www.yiiframework.com/css/img/logo.png');


        $feed->addChannelTag('language', 'en-us');
        $feed->addChannelTag('pubDate', date(DATE_RSS, time()));


        $posts = Post::model()->findAll();


        foreach($posts as $post) {
            $item = $feed->createNewItem();


            $item->title = "Post #" . $post->id;
            $item->link = Yii::app()->createAbsoluteUrl('post/view', array('id' => $post->id));
            $item->date = time();
            $item->description = $post->text;


            $item->addTag('author', 'admin');


            $feed->addItem($item);
        }


        $feed->generateFeed();
    }

Всё! Думаю, что делает этот код объяснять не нужно)

Чтобы было совсем хорошо, я еще добавлю в экшен actionIndex() небольшой код:

Yii::app()->getClientScript()->registerLinkTag('alternate', 'application/rss+xml',
    Yii::app()->createAbsoluteUrl('post/rss'));

Благодаря этому, когда пользователь зайдёт на страницу списка постов, то у него в адресной строке браузера загорится оранжевая иконка rss и он сможет легко подписаться.

fixturehelper
Страница на сайте yii: http://www.yiiframework.com/extension/fixturehelper/
Репозиторий: https://github.com/sumwai/fixtureHelper

Этот модуль совсем простой - он умеет загружать ваши фикстуры в базу данных. Работает как консольная команда. Устанавливается так же, как и предыдущие расширения.

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

yiic.bat fixture load --tables=post

На сегодня всё.