编辑
根据我们的讨论,OP 并没有尝试在同一个字段上进行初始化,而是有多个具有相同字段名称的模型,并且您正在使用 显示它们foreach
,所以我建议做的是,
- 在您
foreach
使用没有模型的小部件的静态调用
- 引入一个
$counter
字段并在循环中使用它来命名输入字段。
- 在不使用 ActiveForm 的情况下显示,
switchInput
原始active
状态字段应作为隐藏字段添加到form
.
- 然后使用
switchChange.bootstrapSwitch
事件保持字段的值与hidden
字段同步switchInput
。
通过这种方式,您不必担心在提交表单并验证然后将数据保存到数据库表时手动将值加载到模型字段,但是当您必须编辑时,您可能必须手动加载字段,只需使用 的value
选项switchInput
来加载相应的模型字段值。
foreach
如果现在不使用,您可能已经在循环中使用某些东西作为计数器。如果这对您有帮助,请参见下文。我将添加一个简单$counter
的内容来向您展示我在说什么,您可以根据需要进行修改。
这是示例代码,以便您了解我的建议
//the counter
$counter = 1;
//the foreach loop
foreach(...){
//your form
$form = ActiveForm::begin(['id' => 'form_' . $counter]);
//call the switchInput without activeform or model
echo SwitchInput::widget([
'name' => 'fake_status_' . $counter,
'pluginOptions' => [
'onColor' => 'success',
'offColor' => 'danger',
], 'pluginEvents' => [
"switchChange.bootstrapSwitch" => "function(item) {
if($(item.currentTarget).is(':checked')){
$('#status_" . $counter . "').val(1)
}else{
$('#status_" . $counter . "').val(0)}
}"
]
]);
//the original status field
$form->field($model, 'status', ['inputOptions' => ['id' => 'status_' . $counter]])->hiddenInput();
ActiveForm::end();
$counter++;
}
您不能使用相同的多个开关,input
或者model field
这就是您遇到此问题的原因,因为switchInput
通过分配 初始化脚本id
,并且您尝试在相同的字段名称 3 不同时间对其进行初始化,不能有多个相同的元素id
所以javascript/jquery
本质上会在第一个匹配的元素上初始化插件,尝试不model
使用不同的names
.
echo SwitchInput::widget([
'name' => 'status',
'pluginOptions' => [
'size' => 'medium' ,
'onColor' => 'success' ,
'offColor' => 'danger' ,
],'pluginEvents' => [
"switchChange.bootstrapSwitch" => "function(item) { console.log(item); }"
]
]);
echo SwitchInput::widget([
'name' => 'status2',
'pluginOptions' => [
'size' => 'medium' ,
'onColor' => 'success' ,
'offColor' => 'danger' ,
],'pluginEvents' => [
"switchChange.bootstrapSwitch" => "function(item) { console.log(item); }"
]
]);
或者在模型中声明自定义字段,名称不同$status
,$status2
然后使用它们进行初始化model
。
echo $form->field ( $model , 'status' )->widget ( SwitchInput::classname () , [
'pluginOptions' => [
'size' => 'medium' ,
'onColor' => 'success' ,
'offColor' => 'danger' ,
] ,
'pluginEvents' => [
"switchChange.bootstrapSwitch" => "function(item) { console.log(item); }"
] ] );
echo $form->field ( $model , 'status2' )->widget ( SwitchInput::classname () , [
'pluginOptions' => [
'size' => 'medium' ,
'onColor' => 'success' ,
'offColor' => 'danger' ,
] ,
'pluginEvents' => [
"switchChange.bootstrapSwitch" => "function(item) { console.log(item); }"
] ] );