Валидация аякс. Не отображает ошибки.

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
Ответить
Shappy
Сообщения: 86
Зарегистрирован: 2013.09.19, 12:31

Валидация аякс. Не отображает ошибки.

Сообщение Shappy »

Добрый день... Провожу аякс-валидацию при сабмитте, в отвер получаю список ошибок, но они не ставятся на места где они должны быть... Это надо руками писать? Если ручками можно пример какой-нибудь...?
CActiveForm

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

            $form = $this->beginWidget('CActiveForm', array(
            'id' => 'AdvertForm',
            'htmlOptions' => array('enctype' => 'multipart/form-data'),
            'enableAjaxValidation'=>true,
            'enableClientValidation'=>false,
            'action' => Yii::app()->createUrl('/user/addAdvert'),
            'clientOptions'=>array(
                'validateOnSubmit'=>true,
                'validateOnChange'=>false,
)));
Во вьюхе и такой тип присутствует

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

 <?php $form->error($model, 'title') ?>
, и такой:

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

<?php echo CHtml::activeDropDownList($model,'action_id', array(''=>'Выберите','1'=>'Купить', '2'=>'Продать',
Кнопка обычная:

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

 <?php echo CHtml::submitButton('Подать объявление'); ?>
При сабмитте сначала отправляется аякс проверка, если проходит, то отправляется постом форма, если не проходит, то возвращается JSON с ошибками, и еще раз вопрос:) Как ошибки расставить, они попросту не отображаются...
П.С. Я извиняюсь если где-то есть уже ответ, искал, но ничего толкового не нашел...
Nafania
Сообщения: 1227
Зарегистрирован: 2011.01.31, 13:12

Re: Валидация аякс. Не отображает ошибки.

Сообщение Nafania »

Для всех полей, у которых может отображаться ошибка, должно быть написано $form->error...
Shappy
Сообщения: 86
Зарегистрирован: 2013.09.19, 12:31

Re: Валидация аякс. Не отображает ошибки.

Сообщение Shappy »

Nafania писал(а):Для всех полей, у которых может отображаться ошибка, должно быть написано $form->error...
У меня где-то так написано:

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

<?php echo CHtml::error($model, 'verifyCode');?>
а где-то так:

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

<?php $form->error($model, 'title') ?>
Или обязательно привести к одному виду все?
П.с. у каждого поля есть вывод ошибки, но не выводится ни одна из них...
Nafania
Сообщения: 1227
Зарегистрирован: 2011.01.31, 13:12

Re: Валидация аякс. Не отображает ошибки.

Сообщение Nafania »

Покажите код экшена и код вью.
Shappy
Сообщения: 86
Зарегистрирован: 2013.09.19, 12:31

Re: Валидация аякс. Не отображает ошибки.

Сообщение Shappy »

Nafania писал(а):Покажите код экшена и код вью.
Экшен

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

... Проверки
if(Yii::app()->request->isAjaxRequest){
                $model = new AdvertForm;
                $model->attributes = $_POST['AdvertForm'];
                echo CActiveForm::validate($model);
                Yii::app()->end();
            }
... Проверки...
$this->layout='search';
Yii::app()->bootstrap->register();
Yii::app()->clientScript->registerScriptFile('/js/addAdvert.js');
$model = new AdvertForm;
Yii::import( "xupload.models.XUploadForm" );
$photos = new XUploadForm;
// Если пришли данные для сохранения
if(isset($_POST['AdvertForm']))
{
    $model->attributes = $_POST['AdvertForm'];
    // Проверка данных
    if($model->validate())
{ // Далее запись.
 
Вьюха тоже очень большая...

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

<div class="row-fluid">
    <br>
    <div class="form">
        <?php
            $form = $this->beginWidget('CActiveForm', array(
            'id' => 'AdvertForm',
            'htmlOptions' => array('enctype' => 'multipart/form-data'),
            'enableAjaxValidation'=>true,
            'enableClientValidation'=>false,
            'action' => Yii::app()->createUrl('/user/addAdvert'),
            'clientOptions'=>array(
                'validateOnSubmit'=>true,
                'validateOnChange'=>false,



            )));
        ?>

        <!-- first step -->
        <div class="accordion" id="accordion1">
        <div class="accordion-group">
            <div class="accordion-heading">
                <a class="accordion-toggle" data-toggle="collapse" data-parent="#accordion1" href="#collapseOne">
                    Шаг 1 из 6
                </a>
            </div>
            <div id="collapseOne" class="accordion-body collapse">
                <div class="accordion-inner">
                    <div class="row-fluid urp_parent">
                        <?php echo CHtml::activeLabel($model,'title'); ?>
                        <i class="icon-asterisk asterisk aA_asterisk"></i>
                        <?php echo CHtml::activeTextField($model,'title', array('class' => 'aA_title_textField')); ?>
                        <i class="icon-asterisk asterisk aA_asterisk"></i>
                        <?php $form->error($model, 'title') ?>
                        <div class="urp_form_tag aA_tag">
                            <?php if($form->error($model, 'title'))
                            { ?>
                                <div class="label label-important">

                                    <?php $form->error($model, 'title') ?>
                                </div>
                            <?php } ?>
                        </div>
                    </div>
                    <div class="row-fluid urp_parent">
                        <?php echo CHtml::activeLabel($model,'action_id'); ?>
                        <i class="icon-asterisk asterisk aA_asterisk"></i>
                        <?php echo CHtml::activeDropDownList($model,'action_id', array(''=>'Выберите','1'=>'Купить', '2'=>'Продать',
                            '3'=>'Снять', '5'=>'Сдать', '6'=>'Сдать на часы, сутки'), array('id'=>'action_id')) ?>

                        <div class="urp_form_tag aA_tag">
                            <?php if($form->error($model, 'action_id'))
                            { ?>
                                <div class="label label-important">

                                    <?php echo $form->error($model, 'action_id');?>
                                </div>
                            <?php } ?>
                        </div>
                    </div>
                    <div class="row-fluid urp_parent">
                        <?php echo CHtml::activeLabel($model,'object_id'); ?>
                        <i class="icon-asterisk asterisk aA_asterisk"></i>
                        <?php echo CHtml::activeDropDownList($model,'object_id', array(''=>'Выберите', '1'=>'Квартиру',
                            '2'=>'Комнату или гостинку','3'=>'Дом или коттедж', '4'=>'Дачу или земельный участок',
                            '5'=>'Коммерческую недвижимость', '6'=>'Гараж или машино-место '), array('id'=>'object_id')) ?>

                        <div class="urp_form_tag aA_tag">
                            <?php if(CHtml::error($model, 'object_id'))
                            { ?>
                                <div class="label label-important">

                                    <?php echo CHtml::error($model, 'object_id');?>
                                </div>
                            <?php } ?>
                        </div>
                        <?php if(isset($_POST['AdvertForm']['object_id']))
                        { ?>
                            <script>
                                var selectedObject = "<?php echo $_POST['AdvertForm']['object_id'] ?>";
                            </script>
                        <?php } ?>
                    </div>
                       <div class="row-fluid">
                            <div class="submit">
                                <?php echo CHtml::submitButton('Подать объявление'); ?>
                            </div>
                        </div>
Привел малую часть... Если нужно могу кинуть полностью...
Shappy
Сообщения: 86
Зарегистрирован: 2013.09.19, 12:31

Re: Валидация аякс. Не отображает ошибки.

Сообщение Shappy »

Кстати, не дописал... Использую это во вьюхе:

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

<div class="row">
            <?php
            $this->widget( 'xupload.XUpload', array(
                    'url' => Yii::app( )->createUrl( "/user/upload"),
                    //our XUploadForm
                    'model' => $photos,
                    //We set this for the widget to be able to target our own form
                    'htmlOptions' => array('id'=>'AdvertForm'),
                    'attribute' => 'file',
                    'multiple' => true,
                    //Note that we are using a custom view for our widget
                    //Thats becase the default widget includes the 'form'
                    //which we don't want here
                    'formView' => 'application.views.user._photo_form',
                    'options' => array(
                        'maxFileSize' => 3000000,
                        'maxNumberOfFiles'=>20,
                        'acceptFileTypes' => "js:/(\.|\/)(jpe?g)$/i",
                    )
                )
            );
            ?>
        </div>
у этого виджета должен быть одинаковый id с CActiveForm... Может из-за этого проблемы?

Поставил виджету этому другой id, все равно тоже самое... ошибки приходят, но на места не встают...
Nafania
Сообщения: 1227
Зарегистрирован: 2011.01.31, 13:12

Re: Валидация аякс. Не отображает ошибки.

Сообщение Nafania »

Чего-то вы намудрили.
Когда идет валидация через ajax, то посылается параметр $_POST['ajax'] который равен id формы.
Далее, сам метод validate присваивает значения атрибутов, вам этого делать не надо.
Далее, у вас где-то CHtml::, где-то form, используйте везде $form->
Ну и конечно несколько id одинаковых на странице быть не может.
В общем, у вас каша какая-то.
Разберитесь в этом и все будет нормально.
Shappy
Сообщения: 86
Зарегистрирован: 2013.09.19, 12:31

Re: Валидация аякс. Не отображает ошибки.

Сообщение Shappy »

Nafania писал(а):Чего-то вы намудрили.
Когда идет валидация через ajax, то посылается параметр $_POST['ajax'] который равен id формы.
Далее, сам метод validate присваивает значения атрибутов, вам этого делать не надо.
Далее, у вас где-то CHtml::, где-то form, используйте везде $form->
Ну и конечно несколько id одинаковых на странице быть не может.
В общем, у вас каша какая-то.
Разберитесь в этом и все будет нормально.
Спасибо, для начала переделаю форму и исправлю экшен как Вы сказали... А на счет id я сам не могу понять почему так должно быть, но в описании этого виджета написано что id виджета д.б. такое же как и у виджета CActiveForm... Без этого не работает...
Отпишусь как найду проблему...
Nafania
Сообщения: 1227
Зарегистрирован: 2011.01.31, 13:12

Re: Валидация аякс. Не отображает ошибки.

Сообщение Nafania »

И еще, вот в этой строке

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

<?php $form->error($model, 'title') ?>
вы забыли добавить echo
Shappy
Сообщения: 86
Зарегистрирован: 2013.09.19, 12:31

Re: Валидация аякс. Не отображает ошибки.

Сообщение Shappy »

Nafania писал(а):И еще, вот в этой строке

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

<?php $form->error($model, 'title') ?>
вы забыли добавить echo
Да, спасибо... В общем, я чуть-чуть прибрался, исправил все на

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

<?php echo $form->error($model, 'title') ?>
Теперь выводятся ошибки, но не везде где нужно:) День сегодня забавный...

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

<div class="row-fluid urp_parent">
                        <?php echo $form->label($model,'title'); ?>
                        <i class="icon-asterisk asterisk aA_asterisk"></i>
                        <?php echo $form->textField($model,'title', array('class' => 'aA_title_textField')); ?>
                        <i class="icon-asterisk asterisk aA_asterisk"></i>
                        <?php echo $form->error($model, 'title') ?>
                    </div>
                    <div class="row-fluid urp_parent">
                        <?php echo $form->label($model,'action_id'); ?>
                        <i class="icon-asterisk asterisk aA_asterisk"></i>
                        <?php echo $form->dropDownList($model,'action_id', array(''=>'Выберите','1'=>'Купить', '2'=>'Продать',
                            '3'=>'Снять', '5'=>'Сдать', '6'=>'Сдать на часы, сутки'), array('id'=>'action_id')) ?>
                        <?php echo $form->error($model, 'action_id') ?>
                    </div>
В этом куске кода ошибка в title выводится, а в action_id не выводится, хотя ошибки на эти поля приходят... И так во всей форме, где-то выводится, где-то нет...

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

AdvertForm_action_id: [Необходимо заполнить поле «Я хочу».]
AdvertForm_city_id: [Необходимо заполнить поле «Населенный пункт».]
AdvertForm_delete_time: [Необходимо заполнить поле «Срок размещения объявления».]
AdvertForm_description: [Необходимо заполнить поле «Описание объявления».]
AdvertForm_object_id: [Необходимо заполнить поле «Объект».]
AdvertForm_price: [Необходимо заполнить поле «Цена».]
AdvertForm_rieltor_phone1: [Необходимо заполнить поле «Телефон».]
AdvertForm_rieltors_name: [Необходимо заполнить поле «Контактное лицо (имя)».]
AdvertForm_title: [Необходимо заполнить поле «Заголовок объявления».]
AdvertForm_type_id: [Необходимо заполнить поле «Тип».]
AdvertForm_verifyCode: [Неправильный код проверки.]
 
Вот приходят ошибки... Но не все показываются...
Shappy
Сообщения: 86
Зарегистрирован: 2013.09.19, 12:31

Re: Валидация аякс. Не отображает ошибки.

Сообщение Shappy »

Для тех у кого не все ошибки будут выводиться при аякс-валидации при субмите, читаем внимательно документацию, а именно error() method у CActiveForm.
When an CActiveForm input field uses a custom ID, for ajax/client validation to work properly inputID should be set to the same ID
Example:

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

<div class="form-element">
   <?php echo $form->labelEx($model,'attribute'); ?>
   <?php echo $form->textField($model,'attribute', array('id'=>'custom-id')); ?>
   <?php echo $form->error($model,'attribute',array('inputID'=>'custom-id')); ?>
</div>
inputID Необходимо ставить у ошибки такой же как и у $form->textField например, или у любого другого инпута.
Спасибо большое Nafania за помощь...
Ответить