Советы по Yii. Глава восьмая.
-
Пример использования CArrayDataProvider.
В некоторых случаях необходимо отобразить в CGridView содержимое массива.;
Для этого на помощь придёт CArrayDataProvider.
Контроллер:
- public function actionViewGrid() {
- $items = array(
- array('id' => 1, 'title'=>'Title1', 'description' => 'Description1'),
- array('id' => 2, 'title'=>'Title2', 'description' => 'Description2'),
- array('id' => 3, 'title'=>'Title3', 'description' => 'Description3'),
- array('id' => 4, 'title'=>'Title4', 'description' => 'Description4')
- );
-
- $itemsProvider = new CArrayDataProvider($items, array(
- 'pagination' => array(
- 'pageSize' => 2,
- ),
- ));
-
- $this->render('viewgrid', array('itemsProvider' => $itemsProvider));
- }
Представление:
- $this->widget('zii.widgets.grid.CGridView', array(
- 'id' => 'itemGrid',
- 'dataProvider' => $itemsProvider,
- 'enablePagination' => true,
- 'columns' => array(
- array(
- 'name' => 'ID',
- 'value' => '$data["id"]',
- 'sortable' => true,
- 'filter' => false,
- ),
- array(
- 'name' => 'Название',
- 'value' => '$data["title"]'
- ),
- array(
- 'name' => 'Описание',
- 'value' => '$data["description"]'
- ),
- )
- ));
В итоге получим обычный GridView с возможностью пагинации:
Но помните, что в каждом массиве обязательно должен быть ключ id со значением. Без него работать не будет.
-
Пара полезных методов.
Для получения id сессии пользователя в Yii используйте Yii::app()->session->sessionId вместо session_id().
Для получения IP адреса пользователя используйте Yii::app()->request->userHostAddress вместо $_SERVER['REMOTE_ADDR'].
-
Флэш сообщения.
Приятно когда на действие пользователя сайт отвечает обратной связью в виде сообщений о результате.
В самом простом случае, в Yii можно воспользоваться методами setFlash (для записи сообщения в сессию пользователя) и getFlash (для получения установленного сообщения из сессии).
Установка одного сообщения:
- Yii::app()->user->setFlash('success', "Успешно сохранено!");
Вывод одного сообщения:
- if(Yii::app()->user->hasFlash('success')) {
- echo '<div>'.Yii::app()->user->getFlash('success').'</div>';
- }
Установка множества сообщений:
- Yii::app()->user->setFlash('success', "Данные успешно сохранены!");
- Yii::app()->user->setFlash('error', "Ошибка. Данные не были сохранены");
Вывод множества сообщений:
- $messages = Yii::app()->user->getFlashes();
- if ($messages) {
- foreach($messages as $key => $message) {
- echo '<div class="flash-' . $key . '">' . $message . "</div>";
- }
- }
После вызова getFlash() по-умолчанию хранимое сообщение удаляется. Если вам необходимо сохранить сообщение, то третий параметр должен быть выставлен в false.
- echo Yii::app()->user->getFlash('success', null, false);
Более подробно код метода getFlash() вы можете увидеть в файле framework/web/auth/CWebUser.php.
-
CDbExpression.
Наверняка, многие используют в SQL запросах встроенные функции NOW(), DATE_FORMAT() и т.д.
Если просто добавить в запрос NOW(), то результат будет не тем, который ожидается.
Так как NOW() будет восприниматься как строка.
- Yii::app()->db->createCommand()->insert('table', array(
- 'title'=> 'title1',
- 'description'=> 'description1',
- 'date_now' => 'NOW()',
- ));
Поэтому необходимо использовать CDbExpression.
- Yii::app()->db->createCommand()->insert('table', array(
- 'title'=> 'title1',
- 'description'=> 'description1',
- 'date_now' => new CDbExpression('NOW()'),
- ));
Ещё один пример, но уже с DATE_FORMAT:
- $dateNow = new CDbExpression("DATE_FORMAT(date_now, '%Y-%m-%d') AS dateNowFormat");
-
- $allRecords = Yii::app()->db->createCommand()
- ->select('title, description, '.$dateNow.'')
- ->from('table')
- ->queryAll();
либо:
- $allRecords2 = Yii::app()->db->createCommand()
- ->select(array('title', 'description', new CDbExpression("DATE_FORMAT(date_now, '%Y-%m-%d') AS dateNowFormat")))
- ->from('table')
- ->queryAll();
либо:
- $criteria = new CDbCriteria();
- $criteria->select = new CDbExpression("DATE_FORMAT(date_now, '%Y-%m-%d') AS dateNowFormat");
Обсудить статью на форуме