0

私はいくつかの問題を抱えています。基本的に、ステータスを管理するためにCGridView列にドロップダウンリストを作成しようとしています。onchange をデータベースにロードしたい。グリッド列は次のとおりです。

array(
        'name'=>'status',
        'type'=>'raw',
        'value'=>'CHtml::dropDownlist(\'status\',\'\',array(\'1\'=>\'Complete\',
                        \'2\'=>\'Paid\',
        \'3\'=>\'Not paid\'),array(
                                    \'class\'=>\'status\',
                                    \'options\'=>array($data->status=>array(\'selected\'=>\'selected\')),
                                    \'ajax\'=>array(
                                        \'type\' => \'POST\',
                                        \'url\'=>Yii::app()->createUrl(\'user/orders/status\'),                        
                                        \'data\'=>array(\'status\'=>\'js:this.value\',\'order\'=>$data->id),
        )
        ));',
        ),

これがコントローラーアクションコードです

public function actionStatus()
    {
    if (isset($_POST['order'])){
        $model=$this->loadModel($_POST['order']);
        $model->status=$_POST['status'];        
    $model->save();
      
    }    
    }

それで、問題は何ですか。ドロップダウンが変更された要素の id ではなく、最後の $data->id を取得しています。他のすべては正常に動作します。

多分それは簡単ですが、私は解決策を見つけることができません。

4

1 に答える 1

3

まず、モデル クラスで getter を使用すると、この醜いエスケープ コードをすべて回避できます。

public function getStatusDropdown()
{
    $stats = array(
        1 => 'Complete',
        2 => 'Paid',
        3 => 'Not paid',
    );
    return CHtml::dropDownlist('status',$this->status,$stats, array(
        'class'     => 'status',
        'data-id'   => $this->id,
    ));
}

次のようなグリッド列を追加します

array(
    'name'  => 'Status',
    'type'  => 'raw',
    'value' => '$data->statusDropdown',
),

あとは Javascript を追加するだけです。すべてのボタンにスクリプトを追加する代わりに、1 つのスニペットを登録してすべてを支配する方がはるかに効率的です。changeすべてのドロップダウンのイベントをリッスンする必要があります。したがって、次のように、グリッドビューを使用してページにインライン スニペットを登録できます。

$url = $this->createUrl('user/orders/status');
Yii::app()->clientScript->registerScript('initStatus',
    "$('select.status').on('change','body',function() {
        el = $(this);
        $.ajaxPost('$url', {status: el.val(), id: el.data('id')}
    });",
    CClientScript::POS_READY
);

セレクターを追加してbody、GridView が AJAX を介して更新された場合でもイベントが発生することを確認しました。呼び出しに成功ハンドラーを追加することもできますajaxPost()

上記にはタイプミスが含まれている可能性があるため、コピーして貼り付けるだけでなく、その仕組みを理解するようにしてください。それはあなたを正しい軌道に乗せるはずです。

于 2013-04-17T15:52:19.843 に答える