@oleg_46

Yii2. Как валидировать динамически добавленные яваскриптом поля?

Добавляю в форму много новых полей яваскриптом. Имена полей выглядят примерно так
<input type="text" class="form-control" name="items[0][description]">


новое добавленное поле выглядит
<input type="text" class="form-control" name="items[1][description]">

и т.д.
Эти поля могут быть элементами многомерного массива, после сабмита.
Как их валидировать в модели?
К тому же у меня много полей разного типа и соответственно с разными валидаторами. Как навешивать валидаторы на поля? Составить регулярки по названиям и типам валидаторов и смотреть соответствия в цикле?
  • Вопрос задан
  • 1301 просмотр
Решения вопроса 1
Demetriy
@Demetriy
веб и мобильная разработка
Откройте исходный код полученной вами страницы с формой, я предполагаю, что первое поле у вас уже есть (которое потенциально копируется), далее найдите код с js валидацией, сгенерированной yii, чтобы валидировать динамические поля после каждого добавления поля нужно вешать на него валидацию.

Пример моего кода, код валидации должен быть заменен на ваш.
form.yiiActiveForm(
            'add',
            {
                "id": 'eventoutcomes-' + index + '-comment',
                "name": "[" + index + "]comment",
                "container": '.field-eventoutcomes-' + index + '-comment',
                "input": '#eventoutcomes-' + index + '-comment',
                "validate": function (attribute, value, messages, deferred, $form) {
                    if ((function (attribute, value) {
                            if ($('#plannedoutcome-type').length > 0) {
                                return $('#plannedoutcome-event_type').val() != EVENT_TYPE_STAFF
                                    && $('#plannedoutcome-type').val() == TYPE_EVENT;
                            } else {
                                return $('#outcome-event_type').val() != EVENT_TYPE_STAFF
                                    && $('#outcome-type').val() == TYPE_EVENT;
                            }
                        })(attribute, value)) {
                        yii.validation.required(value, messages, {"message": "Обязательное поле"});
                    }
                }
            }
        );


Для валидации на сервере:
мы исходим из того, что у вас есть модель-родитель и много дочерних моделей

<?php $form = ActiveForm::begin(); ?>

                <?= $form->field($model, 'value')->input(
                    'number',
                    ['pattern' => '\d*']
                ); ?>

                ...

                <div class="event-outcomes-block">
                    <a class="btn btn-success add-event-outcome"><i class="fa fa-plus"></i> Добавить</a>

                    <div class='form-inline'>
                        <?php
                        if(is_array($aEventOutcomes) && count($aEventOutcomes) > 0) :
                            foreach ($aEventOutcomes as $index => $oEventOutcome) :
                                ?>

                                <?= $form->field($oEventOutcome, "[$index]id")->input('hidden')->label(false); ?>

                                <div class="row">
                                    <div class="col-lg-4 value">
                                        <?= $form->field($oEventOutcome, "[$index]value")
                                            ->input('number', ['pattern' => '\d*']); ?>
                                    </div>
                                    <div class="col-lg-7 comment">
                                        <?= $form->field($oEventOutcome, "[$index]comment")
                                            ->textInput(['prompt'=>'Комментарий']); ?>
                                    </div>
                                    <div class="col-lg-1 action-button">
                                        <div class="form-group">
                                            <a class="btn btn-xs btn-danger delete-button"><i class="fa fa-minus"></i></a>
                                        </div>
                                    </div>
                                </div>

                            <?php endforeach; endif; ?>
                    </div>
                </div>

		...

                <div class="form-group">
                    <?= Html::submitButton(
                        'Подтвердить',
                        ['class' => 'btn btn-info']
                    ) ?>
                </div>

                <?php ActiveForm::end(); ?>


Где каждый элемент массива $oEventOutcome это объект дочерней модели.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
EnChikiben
@EnChikiben
www.yiiframework.com/doc-2.0/yii-validators-eachva...
или напишите свой валидатор для этого поля
Ответ написан
Комментировать
@LAV45
Все уже сделано до вас https://github.com/unclead/yii2-multiple-input
multiple-column.gif?raw=true
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы