Yii Cgridview列中的Dropdownlist,使用ajax加载到数据库

Yii Cgridview列中的Dropdownlist,使用ajax加载到数据库,yii,Yii,我有点问题。所以基本上,我试图在CGridView列中创建dropdownlist来管理状态。我想把onchange加载到数据库。这是网格列: array( 'name'=>'status', 'type'=>'raw', 'value'=>'CHtml::dropDownlist(\'status\',\'\',array(\'1\'=>\'Complete\', \'2\'

我有点问题。所以基本上,我试图在CGridView列中创建dropdownlist来管理状态。我想把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();
      
    }    
    }
那么问题是什么呢。我得到的是下拉列表更改的元素的最后$data->id而不是id。其他都可以


也许这很简单,但我找不到任何解决方案。

首先:如果在模型类中使用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
事件。因此,您可以在gridview页面上注册一个内联代码段,如下所示:

$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()
调用中


请注意,上面可能包含打字错误,因此不要只是复制和粘贴,而是尝试了解它是如何工作的。首先,如果在模型类中使用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
事件。因此,您可以在gridview页面上注册一个内联代码段,如下所示:

$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()
调用中


请注意,上面可能包含打字错误,因此不要只是复制和粘贴,而是尝试了解它是如何工作的。这会让你走上正确的道路。

你为什么不利用这条路呢。它应该能很好地解决你的问题,去掉你的“意大利面代码”:我明天会试试。但我很希望还有别的办法。谢谢你。你为什么不利用这张桌子呢。它应该能很好地解决你的问题,去掉你的“意大利面代码”:我明天会试试。但我很希望还有别的办法。谢谢你,谢谢你的帮助,但这没用。我以前使用过getter和ajax onchange。
echochtml::dropDownlist('status',$this->status,$status,array('class'=>'status','ajax'=>array('type'=>'POST','url'=>Yii::app()->createUrl('user/orders/status'),'data'=>array('status'=>'js this.value','order'=>this->id');}
但是
$this->id
给我最后一个id,而不是当前id。这是我唯一的问题。我知道它确实有效——我在我的应用程序中一直使用类似的技术。你真的试过我上面贴的吗?使用
ajax
属性时,您描述的内容仍然不同。在这种情况下,我会避免使用它,因为您最终会得到几十个几乎相同的js代码段,而上面这样的一个代码段就足够了。调试也更容易:您可以检查源代码,查看是否为
数据id
属性中的每个下拉列表设置了正确的
id
。您可以在
change
处理程序中设置断点,查看
el
的值。非常感谢Michael。这是我的错误。这个解决方案非常有效。还有1个片段要收集。非常有效的解决方案。谢谢你的帮助,但这不起作用。我以前使用过getter和ajax onchange。
echochtml::dropDownlist('status',$this->status,$status,array('class'=>'status','ajax'=>array('type'=>'POST','url'=>Yii::app()->createUrl('user/orders/status'),'data'=>array('status'=>'js this.value','order'=>this->id');}
但是
$this->id
给我最后一个id,而不是当前id。这是我唯一的问题。我知道它确实有效——我在我的应用程序中一直使用类似的技术。你真的试过我上面贴的吗?使用
ajax
属性时,您描述的内容仍然不同。在这种情况下,我会避免使用它,因为您最终会得到几十个几乎相同的js代码段,而上面这样的一个代码段就足够了。调试也更容易:您可以检查源代码,查看是否为
数据id
属性中的每个下拉列表设置了正确的
id
。您可以在
change
处理程序中设置断点,查看
el
的值。非常感谢Michael。这是我的错误。这个解决方案非常有效。还有1个片段要收集。非常有效的解决方案。干杯