Yii - 更改数据提供程序后CgridView过滤器停止工作

时间:2014-01-08 14:11:48

标签: php yii filter cgridview

所以,我对Yii有点新鲜。我有一个CGridView,看起来像:

<?php $this->widget('zii.widgets.grid.CGridView', array(
            'id'=>'proposta-grid',
            'dataProvider'=>Yii::app()->session['user']->listPropostas(),
            'filter'=>$model,
                    ...
                    ...

我将dataProvider$model->search()更改为User::model()->listPropostas()。 dataProvider和过滤器由不同的模型提供。

这是listPropostas方法的代码,工作正常:

public function listPropostas()
{
    $criteria = new CDbCriteria;
    $arrFiliais = array();
    $arrPropostas = array();

    $arrGrupos = $this->gruposId();
    foreach ($arrGrupos as $grupo) {
        $objGrupo = GrupoDeAnalistas::model()->findByPk($grupo['id']);
        foreach ($objGrupo->listFiliais() as $arr) {
            if (!in_array($arr['id'], $arrFiliais)) {
                array_push($arrFiliais, $arr['id']);
            }
        }
    }

    foreach ($arrFiliais as $arrFilial) {
        $objFilial = Filial::model()->findByPk($arrFilial['id']);
        foreach ($objFilial->listPropostas($this) as $propId) {
            if (!in_array($propId['id'], $arrPropostas)) {
                array_push($arrPropostas, $propId['id']);
            }
        }
    }

    $proposta = new Proposta;
    $criteria->addInCondition("id", $arrPropostas);
    return new CActiveDataProvider($proposta, array(
        'criteria' => $criteria,
    ));
}

因此,在我更改了dataProvider后,CgridView Filter停止了工作

我缺少什么?我知道在Proposta::model()->search()函数中,有一组标准比较,例如$criteria->compare('id',$this->id)

解决此问题的最佳方法是什么?改变我的过滤器?在listPropostas()函数添加比较?

提前感谢!

干杯

1 个答案:

答案 0 :(得分:1)

我不确定,您必须对其进行测试,但我认为您正在寻找$model->listPropostas()而不是User::model()->listPropostas(),其中应在您的Proposta模型中定义listPropostas()而不是您的用户模型。

这样的事情:

public function listPropostas()
{
    $criteria = new CDbCriteria;
    $arrFiliais = array();
    $arrPropostas = array();

    $arrGrupos = Yii::app()->session['user']->gruposId();
    foreach ($arrGrupos as $grupo) {
        $objGrupo = GrupoDeAnalistas::model()->findByPk($grupo['id']);
        foreach ($objGrupo->listFiliais() as $arr) {
            if (!in_array($arr['id'], $arrFiliais)) {
                array_push($arrFiliais, $arr['id']);
            }
        }
    }

    foreach ($arrFiliais as $arrFilial) {
        $objFilial = Filial::model()->findByPk($arrFilial['id']);
        foreach ($objFilial->listPropostas($this) as $propId) {
            if (!in_array($propId['id'], $arrPropostas)) {
                array_push($arrPropostas, $propId['id']);
            }
        }
    }

    $criteria->addInCondition("id", $arrPropostas);
    return new CActiveDataProvider($this, array(
        'criteria' => $criteria,
    ));
}

注意 CActiveDataProvider中的$ this关键字非常重要,因为$this中会包含数据而新初始化的模型不会