Yii2 kartik switchinput在一个视图中,多个表单不起作用

时间:2018-01-10 19:46:28

标签: php yii2 kartik-v multiple-forms

首先感谢您的关注。我试图在一个视图中处理多个表单,并且没有运气。

view.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>

这是结果:

enter image description here

和控制台输出(无错误)

enter image description here

我认为我已经选择了正确的方式为我的所有模型对象渲染表单?咦?

2 个答案:

答案 0 :(得分:1)

修改

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

  1. foreach内部使用静态调用不带模型的小部件
  2. 引入$counter字段并在循环中使用它来命名输入字段。
  3. 在不使用ActiveForm的情况下显示switchInput,原始active状态字段应添加为form内的隐藏字段。
  4. 然后使用switchChange.bootstrapSwitch事件保持hidden字段的值与switchInput字段同步。
  5. 通过这种方式,您不必担心在提交表单并验证然后将数据保存到数据库表时手动将值加载到模型字段,但您可能必须在必要时手动加载字段编辑,只需使用value的{​​{1}}选项加载相应的模型字段值。

    如果现在不使用某个东西,你可能已经在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来初始化脚本,并且你试图在3个不同的时间在相同的字段名称上初始化它,不能有多个具有相同id的元素,所以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

答案 1 :(得分: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 widget page的答案的来源,希望对问题的作者有帮助,但如果不是对问题的作者有所帮助,则可以帮助找到该问题的其他人(正如我在寻找该问题的解决方案时所发现的) / p>