Talha Malik
Talha Malik

Reputation: 1559

Yii: Filter with CActiveDataProvider in grid view gives error

I am trying to use filters in cGridview with cActiveDataProvider but it gives following exception

CActiveDataProvider and its behaviors do not have a method or closure named "getValidators"

Please check following code

Controller

public function actionAdmin()
{
    $admin_type=Yii::app()->user->isAdmin;
    if($admin_type==1)
    {
        $admin_batches=WebHelper::getAllAdminBatchesInArray(Yii::app()->user->getId());
        if(!empty($admin_batches))
        {
            $batch_list=implode(",",$admin_batches);
        }
         $batch_criteria="group_id IN ( ".$batch_list." ) and status!=-1";
    }
    else
        $batch_criteria="1 and status!=-1";

     $model=new CActiveDataProvider('Users',array('criteria'=>array(
                'condition'=>$batch_criteria,
            )));
   // print_r($model);die;

    //$model->unsetAttributes();  // clear any default values
    if(isset($_GET['Users']))
        $model->attributes=$_GET['Users'];

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

View

<?php $this->widget('zii.widgets.grid.CGridView', array(
'id'=>'users-grid',
'dataProvider'=>$model,
'filter'=>$model,
'columns'=>array(
    array(
        'class'=>'CButtonColumn',
        'htmlOptions'=>array('width'=>'70px'),
        'buttons' => array(
                            'view' => array(
                                'imageUrl' => Yii::app()->baseUrl . '/themes/gamify/images/view-image.png'
                            ),
                            'update' => array(
                                'imageUrl' => Yii::app()->baseUrl . '/themes/gamify/images/Edit-icon.png'
                            ),
                            'delete' => array(
                                'imageUrl' => Yii::app()->baseUrl . '/themes/gamify/images/Delete-icon.png'
                            )
                        )
    ),
    first_name',
    'last_name',
    'user_name',
    'group.group_title',
    //'password',
    'email_id',
    array(
        'type'=>'raw',
        'name'=>'Status',
        'value'=>'($data->status==0)?"<a href=\'\' id=\'$data->user_id\' class=\'user_status Active\'>Active</a>":"<a href=\'\' id=\'$data->user_id\' class=\'user_status Inactive\'>Inactive</a>"'
    ),



),));?>

Upvotes: 2

Views: 1119

Answers (1)

hamed
hamed

Reputation: 8043

I generated a new yii project and made a company table in my db, Then I generated a CRUD in gii for testing. This is the default structure for actionAdmin in every generated yii controller:

public function actionAdmin() {
   $model = new Company('search');
   $model->unsetAttributes();  // clear any default values
   if (isset($_POST['Company']))
     $model->attributes = $_POST['Company'];

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

And in the default admin view for every generated CRUD, yii passes $model to the CGridView filter attribute. This means that, CGridView's filter accepts only Model's Object, but you pass instance of CActiveDataProvider to it. Suppose $model is a model object(For example, Users in your case), You should pass $model to filter of CGridView and pass $model->search() to dataProvider of CGridView. Then you can build your Criteria inside of $model->search() method. I recommend you to generate a sample CRUD in yii and see generated code.

Upvotes: 1

Related Questions