Создание и сопровождение сайтов

Блог. Yii. Подсказки по yii. Глава восьмая.

Поиск

Советы по Yii. Глава восьмая.

  1. Пример использования CArrayDataProvider.

    В некоторых случаях необходимо отобразить в CGridView содержимое массива.;

    Для этого на помощь придёт CArrayDataProvider.

    Контроллер:

    1. public function actionViewGrid() {  
    2.     $items = array(  
    3.             array('id' => 1, 'title'=>'Title1''description' => 'Description1'),  
    4.             array('id' => 2, 'title'=>'Title2''description' => 'Description2'),  
    5.             array('id' => 3, 'title'=>'Title3''description' => 'Description3'),  
    6.             array('id' => 4, 'title'=>'Title4''description' => 'Description4')  
    7.     );  
    8.       
    9.     $itemsProvider = new CArrayDataProvider($itemsarray(  
    10.         'pagination' => array(  
    11.             'pageSize' => 2,  
    12.         ),  
    13.     ));  
    14.       
    15.     $this->render('viewgrid'array('itemsProvider' => $itemsProvider));  
    16. }  

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

    1. $this->widget('zii.widgets.grid.CGridView'array(  
    2.     'id' => 'itemGrid',  
    3.     'dataProvider' => $itemsProvider,  
    4.     'enablePagination' => true,  
    5.     'columns' => array(  
    6.         array(  
    7.             'name' => 'ID',  
    8.             'value' => '$data["id"]',  
    9.             'sortable' => true,  
    10.             'filter' => false,  
    11.         ),  
    12.         array(  
    13.             'name' => 'Название',  
    14.             'value' => '$data["title"]'  
    15.         ),  
    16.         array(  
    17.             'name' => 'Описание',  
    18.             'value' => '$data["description"]'  
    19.         ),  
    20.     )  
    21. ));  

    В итоге получим обычный GridView с возможностью пагинации:

    logging ff small 

    logging ff small 

    Но помните, что в каждом массиве обязательно должен быть ключ id со значением. Без него работать не будет.

     

  2. Пара полезных методов.

    Для получения id сессии пользователя в Yii используйте Yii::app()->session->sessionId вместо session_id().

    Для получения IP адреса пользователя используйте Yii::app()->request->userHostAddress вместо $_SERVER['REMOTE_ADDR'].

     

  3. Флэш сообщения.

    Приятно когда на действие пользователя сайт отвечает обратной связью в виде сообщений о результате.

    В самом простом случае, в Yii можно воспользоваться методами setFlash (для записи сообщения в сессию пользователя) и getFlash (для получения установленного сообщения из сессии).

    Установка одного сообщения:

    1. Yii::app()->user->setFlash('success'"Успешно сохранено!");  

    Вывод одного сообщения:

    1. if(Yii::app()->user->hasFlash('success')) {  
    2.     echo '<div>'.Yii::app()->user->getFlash('success').'</div>';  
    3. }  

    Установка множества сообщений:

    1. Yii::app()->user->setFlash('success'"Данные успешно сохранены!");  
    2. Yii::app()->user->setFlash('error'"Ошибка. Данные не были сохранены");  

    Вывод множества сообщений:

    1. $messages = Yii::app()->user->getFlashes();  
    2. if ($messages) {  
    3.     foreach($messages as $key => $message) {  
    4.         echo '<div class="flash-' . $key . '">' . $message . "</div>";  
    5.     }  
    6. }  

    После вызова getFlash() по-умолчанию хранимое сообщение удаляется. Если вам необходимо сохранить сообщение, то третий параметр должен быть выставлен в false.

     

    1. echo Yii::app()->user->getFlash('success', null, false);   

     

    Более подробно код метода getFlash() вы можете увидеть в файле framework/web/auth/CWebUser.php.

     

  4. CDbExpression.

    Наверняка, многие используют в SQL запросах встроенные функции NOW(), DATE_FORMAT() и т.д.

    Если просто добавить в запрос NOW(), то результат будет не тем, который ожидается.

    Так как NOW() будет восприниматься как строка.

    1. Yii::app()->db->createCommand()->insert('table'array(    
    2.     'title'=> 'title1',    
    3.     'description'=> 'description1',  
    4.     'date_now' => 'NOW()',  
    5. ));  

    Поэтому необходимо использовать CDbExpression.

    1. Yii::app()->db->createCommand()->insert('table'array(    
    2.     'title'=> 'title1',    
    3.     'description'=> 'description1',  
    4.     'date_now' => new CDbExpression('NOW()'),  
    5. ));  

    Ещё один пример, но уже с DATE_FORMAT:

    1. $dateNow = new CDbExpression("DATE_FORMAT(date_now, '%Y-%m-%d') AS dateNowFormat");  
    2.   
    3. $allRecords = Yii::app()->db->createCommand()    
    4.     ->select('title, description, '.$dateNow.'')   
    5.     ->from('table')     
    6.     ->queryAll();   

    либо:

    1. $allRecords2 = Yii::app()->db->createCommand()    
    2.     ->select(array('title''description'new CDbExpression("DATE_FORMAT(date_now, '%Y-%m-%d') AS dateNowFormat")))   
    3.     ->from('table')     
    4.     ->queryAll();   

    либо:

    1. $criteria = new CDbCriteria();    
    2. $criteria->select = new CDbExpression("DATE_FORMAT(date_now, '%Y-%m-%d') AS dateNowFormat");   

     

Обсудить статью на форуме