【问题标题】:how can add a filter to my CGridView when i send a result of some findAll当我发送一些 findAll 的结果时,如何向我的 CGridView 添加过滤器
【发布时间】:2014-07-02 06:48:11
【问题描述】:

我将一些 findAll() 组合的结果发送到 CGridView ,如何向我的 CGridView 添加过滤器

控制器

$model1=mymodel::model->finAll($criteria1);
$model2=mymodel::model->finAll($criteria2);
$model3=mymodel::model->finAll($criteria3);
///**   
$data=some foreach and combine molde1,model2,model3


**///
$provider = new CArrayDataProvider( $data );
        $this->render('list2', array(
            'model' => $provider
        ));

【问题讨论】:

    标签: yii filter cgridview


    【解决方案1】:

    您应该在您的模型中实现方法(可能基于model::search() 方法),它会返回您的搜索条件:

    public function getSearchCriteria()
    {
        $criteria=new CDbCriteria;
        $criteria->compare('attribute_1',$this->attribute_1,true);
        $criteria->compare('attribute_2',$this->attribute_2);
        // Other attributes here
    
        return $criteria
    }
    

    您还应该将您的$criteria1$criteria2$criteria3 与此标准合并:

    $myModel = new MyModel('search');
    $myModel ->unsetAttributes();
    if(isset($_GET['MyModel']))
       $myModel->attributes=$_GET['MyModel'];
    
    $criteria1->mergeWith($myModel->getSearchCriteria(), 'AND');
    $criteria2->mergeWith($myModel->getSearchCriteria(), 'AND');
    $criteria3->mergeWith($myModel->getSearchCriteria(), 'AND');
    
    $model1=mymodel::model->finAll($criteria1);
    $model2=mymodel::model->finAll($criteria2);
    $model3=mymodel::model->finAll($criteria3);
    ///**   
    $data=some foreach and combine molde1,model2,model3
    **///
    
    $provider = new CArrayDataProvider( $data );
    
    $this->render('list2', array(
       'model' => $provider
    ));
    

    并且在视图中:

    function getFilterParam($modelName, $attributeName, $default = ''){
        $value = Yii::app()->request->getParam($modelName);
        if(is_array($value) && isset($value[$attributeName])){
            return $value[$attributeName];
        }
        else{
            return $default;
        }
    }
    
    $this->widget('zii.widgets.grid.CGridView', array(
        'dataProvider' => $dataProvider,
        'сolumns'=>array(
            'attribute_1' => array(
                'header' => 'Attribute_1',
                'filter' => CHtml::textField('MyModel["attribute_1"]', getFilterParam('MyModel', 'attribute_1')),
                'name' => 'attribute_1',
            ),
            'attribute_2' => array(
                'header' => 'Attribute_2',
                'filter' => CHtml::textField('MyModel["attribute_2"]', getFilterParam('MyModel', 'attribute_2')),
                'name' => 'attribute_2',
            ),
        )
    );
    

    【讨论】:

    • getSearchCriteria() 是搜索方法还是不同?
    • 我是否从 $mymodel 获得了 dataprovider?类似:$dataProvider = new CArrayDataProvider($mymodel);
    • @maryam CArrayDataProvider 只接受数组。合并标准后,您所做的一切都与您的示例一样(组合 Molde1、model2、model3 并创建新的 CArrayDataProvider)。
    • 行 $myModel = new MyModel('search');什么是“搜索”? '搜索为真或'getSearchCriteria',
    • @maryam 这是一个设置模型场景的字符串。 yiiframework.com/doc/api/1.1/CModel#scenario-detail
    猜你喜欢
    • 1970-01-01
    • 2014-08-21
    • 2018-02-15
    • 2019-09-20
    • 2013-10-06
    • 2018-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多