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

Блог. Yii. Подсказки по Yii. Глава шестнадцатая

Поиск

Подсказки по Yii. Глава шестнадцатая.

  1. rowCssClassExpression.

    В GridView необходимо выделить запись в зависимости от установленного флага в таблице БД (например, является объявление "VIP" или "Специальное предложение")?

    Используйте rowCssClassExpression:

    1. $this->widget('zii.widgets.grid.CGridView'array(  
    2.         'dataProvider'=>$model->search(),  
    3.         'filter'=>$model,  
    4.         'rowCssClassExpression' => '$data->getRowCssClass()',  
    5.         ...  
    6.     )  
    7. );  

    В модель добавьте метод getRowCssClass():

    1. public function getRowCssClass(){  
    2.     if($this->is_special_offer){  
    3.         return 'special_offer_tr';  
    4.     }  
    5.     if($this->is_vip){  
    6.         return 'vip_tr';  
    7.     }  
    8.     return '';  
    9. }  

    В файл css-стилей добавьте:

    1. .special_offer_tr { background-color#AAAAAA }  
    2. .vip_tr { background-color#BBBBBB }  

     

  2. Дополнительные знания по CActiveRecord.

    Все мы знаем, что к модели можно применить scopes и with.

    Также можно указать применение дополнительных параметров критерии, отправленных пользователем с формы.

    Возможно, не особо понятно написал, но пример должен всё прояснить.

    В контроллере запишем:

    1. $dataProvider = new CActiveDataProvider(    
    2.     Users::model()    
    3.         ->active()    
    4.         ->with(array('posts'))    
    5.         ->searchAction(isset($_GET['Users'])?$_GET['Users']:null),    
    6.     array(    
    7.         'criteria' => array(    
    8.             'order' => 'id DESC',    
    9.         ),    
    10.         'pagination'=>array(    
    11.             'pageSize'=>10,    
    12.             'pageVar'=>'page'    
    13.         ),    
    14.     )    
    15. );   

    , где:

    "->active()" - это заданная в функции scopes() именованная группа условий:

    1. public function scopes()  
    2.     {  
    3.     return array(  
    4.         'active'=>array(  
    5.             'condition'=>'active=1',  
    6.         ),  
    7.     );  
    8. }     

    "->with(array('posts'))" - указываем загрузку связанной таблицы posts:

    1. public function relations() {  
    2.     return array(  
    3.         'posts' => array(self::HAS_MANY, 'Posts''userId'),  
    4.     );  
    5. }  

    Также можно указать применение дополнительных параметров для выбора записей:

    "->searchAction(isset($_GET['Users'])?$_GET['Users']:null),"

    Код метода searchAction() в модели Users:

    1. public function searchAction($condParams = null) {  
    2.     if(is_null($condParams)) return $this;  
    3.   
    4.     $this->unsetAttributes();  
    5.     $this->attributes=$condParams;  
    6.   
    7.     $criteria = new CDbCriteria;  
    8.   
    9.     $criteria->compare('id'$this->id, true);  
    10.     $criteria->compare('name'$this->name, true);  
    11.   
    12.     $this->getDbCriteria()->mergeWith($criteria);  
    13.   
    14.     return $this;  
    15. }  

     

  3. onBeginRequest и onEndRequest.

    Необходимо выполнение своей функции при начале выполнения приложения (загрузке сайта)?

    Используйте onBeginRequest.

    В файл protected\config\main.php добавьте:

    1. 'onBeginRequest'=>array('BeginRequest''onStartSite'),  

    В папке protected\components создайте файл BeginRequest.php с таким содержимым:

    1. class BeginRequest {  
    2.     public function onStartSite() {  
    3.         // здесь некий код  
    4.     }  
    5.   
    6.     public function onStopSite() {  
    7.         // здесь некий код  
    8.     }  
    9. }  

    Можно выполнять код раз в сутки при помощи задания последнего времени выполнения в Yii::app()->statePersister и дальнейшей проверки времени последнего исполнения.

    Пример:

    1. class BeginRequest {  
    2.     const TIME_UPDATE = 86400;  
    3.   
    4.     public function onStartSite() {  
    5.         $data = Yii::app()->statePersister->load();  
    6.   
    7.         // выполняем 1 раз в сутки  
    8.         if (isset($data['next_check_status'])) {  
    9.             if ($data['next_check_status'] < time()) {  
    10.                 $data['next_check_status'] = time() + self::TIME_UPDATE;  
    11.   
    12.                 $this->myFunction();  
    13.   
    14.                 Yii::app()->statePersister->save($data);  
    15.             }  
    16.         } else {  
    17.             $data['next_check_status'] = time() + self::TIME_UPDATE;  
    18.   
    19.             $this->myFunction();  
    20.   
    21.             Yii::app()->statePersister->save($data);  
    22.         }  
    23.     }  
    24.   
    25.     public function myFunction() {  
    26.         // здесь некий код  
    27.     }  
    28.   
    29.     public function onStopSite() {  
    30.         // здесь некий код  
    31.     }  
    32. }  

    Если необходимо выполнять свою функцию после выполнения приложения (после загрузки сайта), то используйте в файле конфигурации (protected\config\main.php):

    1. 'onEndRequest'=>array('BeginRequest''onStopSite'),  

     

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