Изменения в Yii 1.1: CActiveDataProvider

Владимир | | MySQL, PHP, Web разработка, Yii.

yii data provider

Я всё-таки решил продолжить обсуждение фреймворка Yii. Но на этот раз затяжных циклов я не планирую 🙂 , просто хочу рассказать о некоторых нововведениях в версиии 1.1.

Как вы, наверное, знаете, версия 1.1 довольно сильно отличается от 1.0.х. Есть и инструкция по переходу на новую версию.

Но есть момент, который может вызвать вопросы у тех, кто начинает знакомство с фреймворком с версии 1.1. Речь о классе CActiveDataProvider. Как несложно догадаться по названию, он предназначен для работы с базой данных. И если вы создадите сайт с помощью консольной утилиты yiic, то этот класс будет использован в методах actionIndex и actionAdmin контроллеров.

Класс очень удобный и позволяет сократить объём кода. Проблема в том, что документация немного отстаёт от жизни. В разделе о работе с базой данных подробно рассказывается об использовании классов CActiveRecord, CDbCriteria и других, но информация о CActiveDataProvider есть только в API.

Итак, что представляет собой этот класс.

По большому счёту это обёртка вокруг четырёх классов CActiveRecord, CDbCriteria, CPagination и CSort. Именно с их помощью выполняется основная работа с базой данных и очень часто все эти классы используются одновременно. Поэтому вполне логично, что разработчики решили создать общую оболочку для работы с ними.

Рассмотрим небольшой пример.

В версиях 1.0.х для вывода записей какой-нибудь таблицы с разбивкой на страницы (пагинацией) использовался следующий код.

$criteria=new CDbCriteria;

$pages=new CPagination(Screenshots::model()->count($criteria));
$pages->pageSize=self::PAGE_SIZE;
$pages->applyLimit($criteria);

$sort=new CSort('Screenshots');
$sort->applyOrder($criteria);

$models=Screenshots::model()->findAll($criteria);

$this->render('admin',array(
	'models'=>$models,
	'pages'=>$pages,
	'sort'=>$sort,
));

Обратите внимание, что здесь создаются экземпляры CDbCriteria, CPagination и CSort. При этом с помощью CDbCriteria мы можем изменять SQL запросы, которые создаёт модель (Screenshots). CPagination используется для настройки пагинации, а CSort – сортировки записей. Массив с объектами CActiveRecord возвращает метод findAll модели. Обратите внимание, что для настройки, которые хранятся в CDbCriteria используются всеми остальными классами.

Теперь взгляните на то, как решается эта же задача в версии 1.1.

$dataProvider=new CActiveDataProvider('Screenshots', array(
	'pagination'=>array(
		'pageSize'=>self::PAGE_SIZE,
	),
));

$this->render('admin',array(
	'dataProvider'=>$dataProvider,
));

Правда, значительно лучше выглядит? 😉 Хотя, на самом деле, работает код точно также. Просто все экземпляры объектов CPagination, CSort и CDbCriteria находятся внутри CActiveDataProvider.

Обратите внимание, что в первом параметре конструктора мы передаём название модели, данные которой нужно получить. CActiveDataProvider сам вызовет соответствующие методы find() или findAll().

Тут возникает вполне резонный вопрос: «Каким образом настраивать поиск, разбивку на страницы и т.п.?» Всё очень просто, нужно передать массив с соответствующими параметрами в конструкторе. Например.

$dataProvider=new CActiveDataProvider('Post', array(
	'criteria'=>array(
		'condition'=>'status=1 AND tags LIKE :tags',
		'params'=>array(':tags'=>$_GET['tags']),
		'with'=>array('author'),
	),
	'pagination'=>array(
		'pageSize'=>20,
	),
));

Как видите, настройки указываются точно так же, как и в предыдущих версиях (по большому счёту это они и есть). Т.е. вы можете спокойно использовать документацию по CDbCriteria при настройке CActiveDataProvider.

Кроме того, если возникнет необходимость, можно использовать методы getCriteria(), setCriteria(), getSort(), setSort() для чтения и установки соответствующих объектов.

Передача данных в представление.

Как несложно заметить по листингам, в версиях 1.0.х необходимо было передавать три параметра: с данными, настройками пагинации и сортировки. В новом варианте передаётся только один – сам объект CActiveDataProvider.

При этом если вы будете вручную вытягивать из него данные, код получится довольно объёмным. Но в версию 1.1 входят компоненты zii, один из которых (zii.widgets.grid.CGridView) специально разработан для использования вместе с CActiveDataProvider. Т.е. вы передаёте ему экземпляр CActiveDataProvider и заголовки столбцов, а он на основе этих данных формирует таблицу.

Как видите, CActiveDataProvider принципиально новых возможностей не добавляет, но количество кода, который вы должны написать, сокращается значительно. И при этом не нужно привыкать к новой библиотеке.

Интересно почитать

Раскрутка сайта занятие увлекательное, но ошибки обойдутся недёшево.