1

私は CGridView を持っていて、それを検索したいと思っています。問題は、モデルの関数によって変更される列があることです。すべては、次のような cgridview を含む search.php ビューから始まります。

$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 に答える