Валидация Динамических Полей

Здравствуйте.

В Yii я недавно и при изучении столкнулся со следующей проблемой.

Есть форма, в ней используются две модели: Post и Steps. Для вывода полей модели Steps использую табличный ввод, а также есть возможность добавлять динамические поля для модели Steps.

_form.php


<div id="steps">

            <?php echo $form->errorSummary($stepForm); ?>

            <?php foreach ($stepForm as $i => $step): ?>

                <div id="stepRow_<?php echo $i; ?>" class="steps">

                    <h2>Шаг <?php echo $i + 1; ?> </h2>

                    <?php echo $form->textField($step, "[$i]content", array('class' => 'span5', 'maxlength' => 128)); ?>

                </div>

            <?php endforeach; ?>

        </div>


        <?php app()->clientScript->registerScript(

            "addRow", "

            var countRow = $('.steps').length;

            $('#step_2').on('click', '#addStepBtn', function() {

                $('#steps').append('<div id=\"stepRow_'+countRow+'\" class=\"steps\"><h2>Шаг '+parseInt(countRow+1)+'</h2><input id=\"Steps_'+countRow+'_content\" class=\"span5\" type=\"text\" maxlength=\"128\" name=\"Steps['+countRow+'][content]\" ></div>');

                countRow += 1;

            });

        ", CClientScript::POS_READY

        );?>

В контроллере обрабатывается так:

PostController.php


$model      = new Posts;

        $stepForm[] = new Steps();

        $steps      = array();

        $validStep  = true;

        $validPost  = true;

        if (isset($_POST['Posts'])) {

            $model->attributes = $_POST['Posts'];

            $validPost         = $model->validate() && $validPost;

            foreach ($_POST['Steps'] as $value) {

                $step              = new Steps();

                $step->attributes  = $value;

                $validStep         = $step->validate() && $validStep;

                if ($validStep) {

                    $steps[] = $step;

                }

            }

            if ($validStep && $validPost) {

                $model->steps = $steps;

                $transaction  = Yii::app()->db->beginTransaction();

                try {

                    if ($model->withRelated->save(true, array('steps'))) {

                        $transaction->commit();

                        $this->redirect(array('view', 'id' => $model->id));

                    }

                } catch (Exception $e) {

                    $transaction->rollback();

                    Yii::app()->handleException($e);

                }

            } else {

                CActiveForm::validateTabular($stepForm);

            }

        }

        $this->render(

            'create', array(

                'model'    => $model,

                'stepForm' => $stepForm,

            )

        );

Проблема в том, что при сабмите с динамическими полями не прошедших валидацию возвращается форма без сообщений об ошибках и без этих самых динамических полей.

Как сказать CActiveForm, что добавились новые поля и для них тоже следует выводить ошибки или ткните носом где это разбиралось, потому что я облазил форум и ничего не нашел.

Чему у вас равно $model->errors после валидации?

C $models все в порядке, если добавить пару динамических полей и ввести неправильные данные, то в цикле, после валидации, $step->getErrors() будет равен:

Array ( [content] => Array ( [0] => Необходимо заполнить поле Content. ) )

Array ( [content] => Array ( [0] => Content слишком короткий (Минимум: 3 симв.). ) )

Но эти ошибки не отображаются в форме, рендерится та же форма без ошибок и без созданных полей.

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

Вызываете ли хелпер, отображающий все ошибки модели?

Вызываете ли хелпер, отображающий все ошибки модели?

а можно здесь поподробней? что за хелпер?

Вы про это? $form->errorSummary($stepForm);


$form->errorSummary

это список всех ошибок формы.

Я так думаю что имелось ввиду


$form->error($step, "[$i]content");

Попробуйте с аяксом, там можно очень гибко настроить вывод ошибок. Все никак руки не доходят написать про аякс валидацию.

Попробовал добавить строку


$form->error($step, "[$i]content");

никаких изменений.

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

Помогите, а то уже второй день бьюсь об стену.

upd. А может изначально в массиве $stepForm поместить максимальное количество объектов, в табличном выводе показать один, а остальные скрыть? Пользователь нажимая на кнопку добавить поле просто снимает свойство dysplay:none у очередного поля, тогда будет вывод ошибок у всех полей. Но этот метод мягко говоря кривоват.

О! А почему это?

Как бы не пришлось писать свою ajax функцию, которая отправляла бы.

Немного переделал, теперь поля добаляются через аякс, но проблема все та же: Если при сабмите формы динамические поля не проходят валидацию, отображается форма без сообщений об ошибках и без добавленных полей.

@Charger

О каком хэлпере Вы говорили для вывода ошибок?