0

首先感谢您的关注。我试图在一个视图中处理多种形式,但没有运气。

视图.php

use kartik\form\ActiveForm;
use kartik\widgets\SwitchInput;

$this->title = Yii::t('app', 'Links');
$this->params['breadcrumbs'][] = $this->title;
?>
<div class="link-index">
    <div class="row">
        <?php foreach ($links as $link):?>
            <div class="col-md-2">
                <?php
                $form = ActiveForm::begin([
                    'id' => $link->_id,
                    'type' => ActiveForm::TYPE_VERTICAL
                ]); ?>
                <?= $form->field($link, 'url') ?>
                <?= $form->field($link, 'active')->widget(SwitchInput::classname(), [
                    'pluginOptions' => [
                        'size' => 'medium',
                        'onColor' => 'success',
                        'offColor' => 'danger',
                    ],
                    'pluginEvents'=>[
                        "switchChange.bootstrapSwitch" => "function(item) { console.log(item); }"
                    ]]); ?>

                <?php ActiveForm::end(); ?>
            </div>
        <?php endforeach; ?>
    </div>
</div>

这是结果:

在此处输入图像描述

和控制台输出(没有错误)

在此处输入图像描述

我认为我选择了正确的方法来为我的所有模型对象呈现表单?嗯?

4

3 回答 3

1

编辑

根据我们的讨论,OP 并没有尝试在同一个字段上进行初始化,而是有多个具有相同字段名称的模型,并且您正在使用 显示它们foreach,所以我建议做的是,

  1. 在您foreach使用没有模型的小部件的静态调用
  2. 引入一个$counter字段并在循环中使用它来命名输入字段。
  3. 在不使用 ActiveForm 的情况下显示,switchInput原始active状态字段应作为隐藏字段添加到form.
  4. 然后使用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); }"
] ] );
于 2018-01-10T21:11:37.173 回答
1

面临与该主题的作者相同的问题。这是解决方案:

<?= $form->field($link, 'active')->widget(SwitchInput::classname(), [
    'pluginOptions' => [
        'size' => 'medium',
        'onColor' => 'success',
        'offColor' => 'danger',
     ],
     'options' => [
         'id' => $link->_id // !!!
     ],
 ]); ?>

SwitchInput 小部件必须具有各种 id,因为在渲染小部件时会使用 id。

于 2021-08-27T08:40:50.570 回答
0

实际上,您不能仅使用一个模型属性创建此小部件的多个实例。

示例:1)不起作用:

<?= $form->field($link, 'active')->widget(SwitchInput::classname()
<?= $form->field($link, 'active')->widget(SwitchInput::classname()

2)如果你想让它工作,你需要与模型不同的独特属性:

<?= $form->field($link, 'active0')->widget(SwitchInput::classname()
<?= $form->field($link, 'active1')->widget(SwitchInput::classname()

但是要为每个独特的字段生成独特的模型属性 - 这根本不是交易 - 通过无模型版本的 kartik 小部件更好地解决这个问题:

echo '<label class="control-label">Status</label>';
echo SwitchInput::widget(['name'=>'status_1', 'value'=>true]);
echo '<label class="control-label">Status</label>';
echo SwitchInput::widget(['name'=>'status_2', 'value'=>true]);

来自kartik switchinput小部件页面的答案来源,希望,如果不是问题的作者,而是下一个会找到这个问题的人,它会有所帮助(正如我在搜索这个问题的解决方案时发现的那样)

于 2019-11-04T11:57:02.653 回答