1

同様の質問が寄せられていることは承知していますが、申し訳ありませんが、私の人生では何が間違っているのかわかりません。どんな助けでも大歓迎です。私がやりたいことは、データベースに合計 2 つの値を表示する CGridView に余分な列を追加することだけです。

これらは私が取ったステップです:

Database
User(forename, surname, part1, part2)

class User extends Controller:
    protected function getTotal($data,$row,$dataColumn){
            return $data->getAttribute('part1')+$data->getAttribute('part2');
    } 

    public function actionIndex(){
            $dataProvider=new CActiveDataProvider('User');
            $this->render('index',array(
                    'dataProvider'=>$dataProvider,
            ));
    }

class Stadium extends CActiveRecord:
    public function rules(){
            return array(
                    array('forename, surname', 'required'),
                    array('forename', 'surname', 'max'=>50),
                    array('part1, part2', 'numerical', 'integerOnly'=>true),

                    array('forename, surname, part1, part2, total', 'safe', 'on'=>'search'),
            );
    }

    public function attributeLabels()
    {
            return array(
                    'forename' => 'forename',
                    'surname' => 'surname',
                    'part1' => 'part1',
                    'part2' => 'part2',
                    'total' => array(
                            'asc'=>'part1 + part2',
                            'desc'=>'part1 + part2 desc',
                    ),
            );
    }

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

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

            $criteria->compare('part1',$this->part1);
            $criteria->compare('part2',$this->part2);

            $criteria->compare('total',$this->part1 + $this->part2,true);

            $sort = new CSort();
            $sort->attributes = array(
                'total'=>array(
                    'asc'=>'part1 + part2 ASC',
                    'desc'=>'part1 + part2 DESC',
                ),
                '*',
            );

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

view/User/index.php
    <?php $this->widget('zii.widgets.grid.CGridView', array(
                    'itemsCssClass'=>'table table-hover',
                    'dataProvider'=>$dataProvider,
                    'template'=>"{items}",
                    'columns'=>array(
                            array('name'=>'forename', 'header'=>'Forename'),
                            array('name'=>'surname', 'header'=>'Surname'),
                            array('name'=>'total', 'header'=>'Total', 'value'=>array($this, 'getTotal')),
                    ),
            )); ?>
<?php $this->endWidget();?>

アドバイスありがとうございます。

4

2 に答える 2

1

解決策: では、次のことを行う必要があります。

class Stadium extends CActiveRecord:
    public $total; //add this line

    //your rules should be fine

    //don't know if you need the asc and desc on attribute labels i just have one
    'total' => 'Total',

    $criteria->compare('total',$this->total); //change this line

    //i didn't use a Csort you might be able to but this is they way i did it
    return new CActiveDataProvider(User', array(
        'criteria'=>$criteria,
        'sort'=> array(
            'attributes' => array(
                'total'=>array(
                    'asc'=>'(part1 + part2) ASC',
                    'desc'=>'(part1 + part2) DESC',
                ),
                '*',
            ),
        ),
    ));

    //add this inside your model also
    public function afterFind() {
        parent::afterFind();
        $this->total = $this->part1+ $this->part2;
        return;
    }

モデルの他のすべては問題ありません。次に、CGridView で次の 1 行を変更します。

array('name'=>'total', 'header'=>'Total'), //don't need to set value it is part of the model like other columns now

http://www.yiiframework.com/forum/index.php/topic/21114-create-now-model-variable/


元の回答:

オブジェクトを使用する場合は、それをusingCSortに追加する必要があるか、作成する必要がない場合は、DataProvider に直接入れることができます。CActiveDataProvidersetSort()CSort

オプション1:

    $sort = new CSort();
    $sort->attributes = array(
        'total'=>array(
            'asc'=>'part1 + part2 ASC',
            'desc'=>'part1 + part2 DESC',
        ),
        '*',
    );

    $data = new CActiveDataProvider(User', array(
            'criteria'=>$criteria,
    ));
    $data->setSort($sort);
    return $data;

オプション 2:

return new CActiveDataProvider(User', array(
    'criteria'=>$criteria,
    'sort'=> array(
        'attributes' => array(
            'total'=>array(
                'asc'=>'part1 + part2 ASC',
                'desc'=>'part1 + part2 DESC',
            ),
            '*',
        ),
    ),
));

これは役立つかもしれません http://www.yiiframework.com/wiki/381/cgridview-clistview-and-cactivedataprovider/#hh11 http://www.yiiframework.com/doc/api/1.1/CDataProvider#setSort-detail

于 2013-03-27T20:46:36.043 に答える
0

Pitchinnate の回答が参考になるかもしれません。また、コンマが存在してはならない場所にコンマを配置する傾向があることに気付きました。例えば

それ以外の:

        $sort->attributes = array(
            'total'=>array(
                'asc'=>'part1 + part2 ASC',
                'desc'=>'part1 + part2 DESC',
            ),
            '*',
        );

必要なもの:

        $sort->attributes = array(
            'total'=>array(
                'asc'=>'part1 + part2 ASC',
                'desc'=>'part1 + part2 DESC'
            ),
            '*'
        );

最後の要素の後に置かれたすべてのコンマを取り除く必要があります。

于 2013-03-27T20:53:06.257 に答える