1

我有一个 CGridView,我想在其中搜索。问题是我有一个由模型中的函数修改的列。一切都从 search.php 视图开始,其中包含一个如下所示的 cgridview:

$this->widget('zii.widgets.grid.CGridView', array(
'id'=>'grid-demande',
'summaryText'=>'',
'dataProvider'=>$model->search(),
//'filter'=>$model,
'cssFile'=>Yii::app()->request->baseUrl."/css/my_gridview.css",
'columns'=>array
(
array(            
        'name'=>'id_post',
        'htmlOptions'=>array('width'=>'16%'),
    ),
array(            
        'name'=>'fk_authorid',
        'htmlOptions'=>array('width'=>'16%'),
        'value'=>array($this,'renderNameDmd'),
    ),
)

如您所见,调用函数 renderNameDmd 来呈现作者的姓名。此函数在我的模型中,但从控制器调用:

protected function renderNameDmd($data,$row)
{
$model=$this->loadModelDmd($data->id_post);
return $model->getChAuthor();   
}

在我调用的模型类中:

public function getChAuthor(){ 
    $modelUsr=TUsers::model()->findByPk($this->fk_authorid);
return $this->fk_authorid.', '.$modelUsr->ch_completeName;
}

一切都可以正常显示。我的主要问题是我想通过这个 cgridview 进行搜索,但我无法使用显示的值进行搜索。这是我的模型中包含的搜索功能:

public function search()
{
    // Warning: Please modify the following code to remove attributes that
    // should not be searched.

    $criteria=new CDbCriteria;

            //more criterias

    $criteria->compare('fk_cip',$this->fk_cip,true);

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

目前,我尝试了几件事,但没有任何效果,所以我将代码重置为初始状态。现在,如果我通过我的 cgridview 进行搜索,我只能使用authorid而不是我编写的完整列格式进行过滤。示例:

对于如下所示的一行:

3231,约翰·多伊

我只能搜索:

3231


我想搜索从函数创建的行。感谢您的帮助!

4

1 回答 1

2

嗯,Yii 对这种特性非常方便,但你应该首先重写你的模型以使用关系。

在您的模型中:

// this attribute will be used in search function
private $_authorName;

public function rules()
{
    return array (
        .....
        array('authorName', 'safe', 'on'=>'search'),
        .....
    );
}

public function relations()
{
    return array(
        .....
        'author' => array(self::BELONGS_TO, 'TUsers', 'fk_authorid'),
        .....
    );
}

// authorName getter
public function getAuthorName()
{
    if ($this->scenario=='search')
        return $this->_authorName;

    return $this->fk_authorid.', '.$this->author->ch_completeName;
}

// authorName setter
public function setAuthorName($authorName) { 
    $this->_authorName = $authorName;
}

public function search()
{
    $criteria=new CDbCriteria;

    .....

    // search author name ?
    if ($this->authorName!==null)
    {
        $criteria->with = array('author');
        $criteria->compare('author.ch_completeName', $this->authorName, true);
    }

    .....

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

在您的 CGridView 中,您应该像这样简单地定义您的列:

array(            
    'name'=>'authorName',
    'htmlOptions'=>array('width'=>'16%'),
),

你应该阅读这个: http ://www.yiiframework.com/wiki/281/searching-and-sorting-by-related-model-in-cgridview/

于 2013-04-03T13:21:59.083 回答