我遇到了一些问题。所以基本上我正在尝试在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。所有其他工作正常。
Maube很容易,但我找不到任何解决方案。 谢谢你的帮助。
答案 0 :(得分: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。如果您注册一个片段来统治所有按钮,而不是向每个按钮添加一个脚本,效率会更高。您必须收听所有下拉列表中的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
选择器以确保,如果您的GridView通过AJAX更新,事件仍然会触发。您可能还想在ajaxPost()
电话中添加成功处理程序。
注意,上面可能包含拼写错误,所以不要只是复制和粘贴,而是试着理解它是如何工作的。它应该让你走上正确的轨道。