yii 使用 AJAX 将Cgridview列中的下拉列表加载到数据库

qvtsj1bj  于 2022-11-09  发布在  其他
关注(0)|答案(1)|浏览(157)

我遇到了一些问题。所以基本上我尝试在CGridView列中创建下拉列表来管理状态。我想在数据库发生变化时加载。下面是网格列:

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();

    }    
    }

那么问题是什么呢?我得到的是last $data-〉id,而不是下拉列表中被更改的元素的id。其他的都正常。
也许这很容易,但我找不到任何解决办法。

zwghvu4y

zwghvu4y1#

首先:如果在模型类中使用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。如果你注册一个代码片段来控制所有按钮,而不是为每个按钮添加一个脚本,那么效率会高得多。你必须监听所有下拉菜单的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选择器,以确保如果通过 AJAX 更新GridView,事件仍然会触发。您可能还需要在ajaxPost()调用中添加一个成功处理程序。
请注意,上面的内容可能会有错别字,所以不要只是复制和粘贴,而是要试着理解它是如何工作的。它应该会让你走上正确的轨道。

相关问题