Подсказки по Yii. Глава шестнадцатая.
-
rowCssClassExpression.
В GridView необходимо выделить запись в зависимости от установленного флага в таблице БД (например, является объявление "VIP" или "Специальное предложение")?
Используйте rowCssClassExpression:
- $this->widget('zii.widgets.grid.CGridView', array(
- 'dataProvider'=>$model->search(),
- 'filter'=>$model,
- 'rowCssClassExpression' => '$data->getRowCssClass()',
- ...
- )
- );
В модель добавьте метод getRowCssClass():
- public function getRowCssClass(){
- if($this->is_special_offer){
- return 'special_offer_tr';
- }
- if($this->is_vip){
- return 'vip_tr';
- }
- return '';
- }
В файл css-стилей добавьте:
- .special_offer_tr { background-color: #AAAAAA }
- .vip_tr { background-color: #BBBBBB }
-
Дополнительные знания по CActiveRecord.
Все мы знаем, что к модели можно применить scopes и with.
Также можно указать применение дополнительных параметров критерии, отправленных пользователем с формы.
Возможно, не особо понятно написал, но пример должен всё прояснить.
В контроллере запишем:
- $dataProvider = new CActiveDataProvider(
- Users::model()
- ->active()
- ->with(array('posts'))
- ->searchAction(isset($_GET['Users'])?$_GET['Users']:null),
- array(
- 'criteria' => array(
- 'order' => 'id DESC',
- ),
- 'pagination'=>array(
- 'pageSize'=>10,
- 'pageVar'=>'page'
- ),
- )
- );
, где:
"->active()" - это заданная в функции scopes() именованная группа условий:
- public function scopes()
- {
- return array(
- 'active'=>array(
- 'condition'=>'active=1',
- ),
- );
- }
"->with(array('posts'))" - указываем загрузку связанной таблицы posts:
- public function relations() {
- return array(
- 'posts' => array(self::HAS_MANY, 'Posts', 'userId'),
- );
- }
Также можно указать применение дополнительных параметров для выбора записей:
"->searchAction(isset($_GET['Users'])?$_GET['Users']:null),"
Код метода searchAction() в модели Users:
- public function searchAction($condParams = null) {
- if(is_null($condParams)) return $this;
-
- $this->unsetAttributes();
- $this->attributes=$condParams;
-
- $criteria = new CDbCriteria;
-
- $criteria->compare('id', $this->id, true);
- $criteria->compare('name', $this->name, true);
-
- $this->getDbCriteria()->mergeWith($criteria);
-
- return $this;
- }
-
onBeginRequest и onEndRequest.
Необходимо выполнение своей функции при начале выполнения приложения (загрузке сайта)?
Используйте onBeginRequest.
В файл protected\config\main.php добавьте:
- 'onBeginRequest'=>array('BeginRequest', 'onStartSite'),
В папке protected\components создайте файл BeginRequest.php с таким содержимым:
- class BeginRequest {
- public function onStartSite() {
-
- }
-
- public function onStopSite() {
-
- }
- }
Можно выполнять код раз в сутки при помощи задания последнего времени выполнения в Yii::app()->statePersister и дальнейшей проверки времени последнего исполнения.
Пример:
- class BeginRequest {
- const TIME_UPDATE = 86400;
-
- public function onStartSite() {
- $data = Yii::app()->statePersister->load();
-
-
- if (isset($data['next_check_status'])) {
- if ($data['next_check_status'] < time()) {
- $data['next_check_status'] = time() + self::TIME_UPDATE;
-
- $this->myFunction();
-
- Yii::app()->statePersister->save($data);
- }
- } else {
- $data['next_check_status'] = time() + self::TIME_UPDATE;
-
- $this->myFunction();
-
- Yii::app()->statePersister->save($data);
- }
- }
-
- public function myFunction() {
-
- }
-
- public function onStopSite() {
-
- }
- }
Если необходимо выполнять свою функцию после выполнения приложения (после загрузки сайта), то используйте в файле конфигурации (protected\config\main.php):
- 'onEndRequest'=>array('BeginRequest', 'onStopSite'),
Обсудить статью на форуме