Добавление полей в form, ajax

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Аватара пользователя
za4me
Сообщения: 152
Зарегистрирован: 2016.06.26, 15:29
Контактная информация:

Добавление полей в form, ajax

Сообщение za4me »

Добрый день.
Подскажите, пожалуйста, как сделать добавление дополнительных полей по клику, с их последующей валидацией на странице на которую они добавляются.

Имею в _form

Код: Выделить всё

<h2>Дополнительные поля.</h2>

<p>
    <?= Html::button("Показать", ['class' => 'add btn btn-success']) ?>
    <?= Html::button("Скрыть", ['class' => 'delete btn btn-warning']) ?>
</p>

<!-- Блок для добавления дополнительных полей. -->
<div class="ap-dap-field"></div>

$js = <<< JS
    $('.add').click(function(){
        $('.ap-dap-field').fadeIn(0, function() {
            $('.ap-dap-field').load('dap-fields');
        });
    });
    
    $('.delete').click(function() {
        $('.ap-dap-field').fadeOut(500, function() {
            $('.ap-dap-field').empty();
        });
    });
JS;

$this->registerJs($js);
В контроллере есть actionDapFields():

Код: Выделить всё

public function actionDapFields()
{
    $dap = new Dap();

    return $this->renderAjax('dap-fields', [
        'dap' => $dap,
        'customer' => User::getArrayValue('username'),
        'complexity' => Ngpv::getArrayMap('gruppa-sloznosti'),
    ]);
}
Файл dap-fields:

Код: Выделить всё

<?php $form = ActiveForm::begin(['options' => ['enctype' => 'multipart/form-data']]) ?>
    <?= $form->field($dap, 'scrabbled')->textInput(['maxlength' => true]) ?>
    // Остальные поля
<?php ActiveForm::end(); ?>
Все хорошо, но не срабатывает валидация на полях. И при переходе на dap-fields action я получаю рендер формы, хотелось бы закрыть его.
Последний раз редактировалось za4me 2017.03.14, 19:01, всего редактировалось 1 раз.
caHek2x
Сообщения: 1242
Зарегистрирован: 2016.04.12, 20:41

Re: Добавление полей в form, ajax

Сообщение caHek2x »

viewtopic.php?f=19&t=42614
ваш случай или ошибаюсь ?
Аватара пользователя
za4me
Сообщения: 152
Зарегистрирован: 2016.06.26, 15:29
Контактная информация:

Re: Добавление полей в form, ajax

Сообщение za4me »

caHek2x писал(а): 2017.03.14, 19:00 viewtopic.php?f=19&t=42614
ваш случай или ошибаюсь ?
Похоже, спасибо, а вы случайно виджет не делали?
caHek2x
Сообщения: 1242
Зарегистрирован: 2016.04.12, 20:41

Re: Добавление полей в form, ajax

Сообщение caHek2x »

я пооборачивал для себя в компоненты ... вечером буду дома могу скинуть что вышло ...
Аватара пользователя
za4me
Сообщения: 152
Зарегистрирован: 2016.06.26, 15:29
Контактная информация:

Re: Добавление полей в form, ajax

Сообщение za4me »

caHek2x писал(а): 2017.03.14, 19:15 я пооборачивал для себя в компоненты ... вечером буду дома могу скинуть что вышло ...
Буду благодарен.
caHek2x
Сообщения: 1242
Зарегистрирован: 2016.04.12, 20:41

Re: Добавление полей в form, ajax

Сообщение caHek2x »

это во вьюшке

Код: Выделить всё

<? //=======================================?>
<?
//генерируем временные названия
$param = new ExerciseParams();
$prefix_name = \app\components\Html::generateInputName([$exercise, $param]);
$prefix_id = \app\components\Html::generateInputId($prefix_name);
$key = "__param_id__";

//генерируем шаблон который будем вставлять через js
$form->enableClientScript = false;
$code_prefix_name = \app\components\Html::generateInputName([$prefix_name, $key]);
$code = $this->render('_param', ['param' => $param, 'form' => $form, 'prefix_name' => $code_prefix_name,]);
$form->enableClientScript = true;
?>
<? //=======================================?>
<? //куда добавлять наши блоки ?>
<div class="form-group">
    <label class="control-label"><?= $exercise->getAttributeLabel("params") ?></label>
    <div class="<?= $prefix_id . "-content" ?>">
        <? foreach ($exercise->params as $n => $param): ?>
            <?= $this->render('_param', ['param' => $param, 'form' => $form, 'prefix_name' => \app\components\Html::generateInputName([$prefix_name, $n])]); ?>
        <? endforeach; ?>
    </div>
    <?= Html::button('+ параметр', ['class' => 'btn btn-primary', 'id' => 'exercise-new-param-btn']) ?>
</div>
<? //=======================================?>
<script>
    <?
    //генерируем js для динамической добавления нашего шаблона
    $fields = ['name', 'description'];
    $content = ".$prefix_id-content";
    $btn = "#exercise-new-param-btn";
    echo \app\components\ActiveForm::scriptAddDynamicBlock($this, $form, $param, $code, $fields, $code_prefix_name, $content, $btn, $key)
    ?>
</script>
<? //=======================================?>
это блок вьюшки, файл _param.php

Код: Выделить всё

<div class="border6 p6 m6-b js_parent">

    <?= $form->field(
        $param, 'name', [
        'addon' => [
            'append' => [
                'content' => Html::button('<span class="glyphicon glyphicon-remove"></span>', ['class' => 'btn btn-danger', 'onclick'=>'removeParent(this)']),
                'asButton' => true
            ]
        ]
    ]
    )->textInput(
        [
            'id' => \app\components\Html::generateInputId([$prefix_name, 'name']),
            'name' => \app\components\Html::generateInputName([$prefix_name, 'name'])
        ]
    ); ?>

    <?= $form->field($param, 'description')->textarea(
        [
            'id' => \app\components\Html::generateInputId([$prefix_name, 'description']),
            'name' => \app\components\Html::generateInputName([$prefix_name, 'description'])
        ]
    ); ?>
    <script>autosize($('[id="<?=\app\components\Html::generateInputId([$prefix_name, 'description'])?>"]'));</script>
</div>
то что раскидал по компонентам
\app\components\Html
\app\components\ActiveForm
\app\components\ActiveField
https://yadi.sk/d/BIKLVKat3FpWvT
Ответить