CGridview使用相关模型按下拉列表进行过滤

时间:2013-09-20 05:30:46

标签: php ajax jquery yii cgridview

我有两个表:User和UserProfile都处于关系中。即UserProfile属于User。用户表具有列“is_active”,它以0和1格式存储特定用户的活动/非活动记录。

现在我有一个下拉字段,其中包含Active(值1)和Inactive(值0)选项,我想根据活动和非活动用户列表过滤CGridview小部件。

以下是我正在做的事情:

<?php echo CHtml::dropDownList('UserProfile[is_active]', $model->user->is_active, 
  array(
    '1'=>"Active",
    '0'=>"Inactive",
  ), array('onchange'=>"$.fn.yiiGridView.update('yw0', {data: $(this).serialize()});") ); ?>

<?php
$this->widget('bootstrap.widgets.TbGridView', array(    
    'type' => 'striped bordered condensed',
    'dataProvider' => $model->search(),
    'filter' => $model,
    'template' => '{pager}{items}',
    'enableSorting' => true,
    'columns' => array(
        'title.name',
        array(
            'name' => 'first_name',
            'type' => 'raw',
            'value' => 'CHtml::link($data->first_name,"/userProfile/$data->user_profile_id")'
        ),
        'last_name',
        'user.username',
        'user.email',        
        array(
            'class' => 'bootstrap.widgets.TbButtonColumn',
            'template' => '{update}&nbsp;&nbsp;&nbsp;&nbsp;{delete}',
        ),
    ),
    'pager' => array(
        'header' => '',
        'hiddenPageCssClass' => 'disabled',
        'maxButtonCount' => 3,
        'cssFile' => false,
        'class' => 'CLinkPager',
        'prevPageLabel' => '<i class="icon-chevron-left"></i>',
        'nextPageLabel' => '<i class="icon-chevron-right"></i>',
        'firstPageLabel' => 'First',
        'lastPageLabel' => 'Last',
    ),
    'pagerCssClass' => 'pagination',
));
?>

控制器:

public function actionManage() {

        $model = new UserProfile('search');        
        $model->unsetAttributes();  // clear any default values

        if (isset($_GET['UserProfile'])) {            
            $model->attributes = $_GET['UserProfile'];
        }

        $this->render('manage', array(
            'model' => $model,
        ));
    }

这是我的搜索方法:

public function search() {

        $criteria = new CDbCriteria;
        $criteria->compare('first_name', $this->first_name, true);
        $criteria->compare('middle_name', $this->middle_name, true);
        $criteria->compare('last_name', $this->last_name, true);
        $criteria->with = array('user');
        $criteria->join = 'LEFT JOIN AuthAssignment ON AuthAssignment.userid=user_id';
        if (isset($_GET['employee'])):
            $criteria->addCondition("AuthAssignment.itemname <> 'Customer'");
            $criteria->addCondition("user.is_active='$status'");
        else:
            $criteria->addCondition("AuthAssignment.itemname = 'Customer'");
            $criteria->addCondition("user.is_active='$status'");
        endif;

        //Rights::getAssignedRoles(Yii::app()->session['user_id']);

        return new CActiveDataProvider($this, array(
            'criteria' => $criteria,
            'pagination' => array(
                'pageSize' => 10,
            ),
        ));
    }

在这里,我希望$status变量值是动态的,因为下拉字段更改为活动或非活动状态。

当更改下拉选项时,显示以下错误:

TypeError: settings is undefined
$grid.addClass(settings.loadingClass);

我是Yii的新手,需要帮助。

由于

1 个答案:

答案 0 :(得分:2)

首先在个人资料模型中声明属性user_status

喜欢

public $user_status;

然后在配置文件模型的搜索方法

$criteria->with = array( 'user' );
$criteria->compare( 'user.is_active', $this->user_status, true );

return new CActiveDataProvider($this, array(
      'criteria'=>$criteria,
      'sort'=>array(
        'attributes'=>array(
          'user_status'=>array(
            'asc'=>'user.is_active',
            'desc'=>'user.is_active DESC',
          ),
          '*',
        ),
      )
    ));

然后在列数组

中的配置文件gridview中

添加

array(
      'name'=>'user_status',
      'header' => 'Status',
      'value'=>'$data->user->is_active',
      'filter' => array( '1'=>"Active",'0'=>"Inactive" )
      'type' => 'raw',
    ),

无需使用chtml下拉列表