Я всё-таки решил продолжить обсуждение фреймворка 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
принципиально новых возможностей не добавляет, но количество кода, который вы должны написать, сокращается значительно. И при этом не нужно привыкать к новой библиотеке.
Интересно почитать
Раскрутка сайта занятие увлекательное, но ошибки обойдутся недёшево.