Yii2 kartik switchinput в одном представлении с несколькими формами не работает

Прежде всего, спасибо за ваше внимание. Я пытаюсь обрабатывать несколько форм в одном представлении, и мне не повезло с этим.

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>

Вот это результат:

введите описание изображения здесь

И консольный вывод (без ошибок)

введите описание изображения здесь

Я думаю, что я выбрал правильный способ визуализации форм для всех моих моделей объектов? А?

0

Решение

РЕДАКТИРОВАТЬ

Согласно нашему обсуждению, OP не пытается инициализировать одно и то же поле, но вместо этого есть несколько моделей с одинаковым именем поля, и вы отображаете их, используя foreachтак что я бы предложил сделать это,

  1. Внутри вашего foreach использовать статический вызов виджета без модели
  2. ввести $counter поле и использовать его внутри вашего цикла, чтобы назвать поля ввода.
  3. Показать switchInput без использования ActiveForm и оригинала 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); }"] ] );
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]