enableAjaxValidation

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
Ответить
row248
Сообщения: 20
Зарегистрирован: 2013.02.02, 15:01

enableAjaxValidation

Сообщение row248 »

Есть вот такой код:

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

    <?php $form = $this->beginWidget('CActiveForm', array(
        'htmlOptions' => array('enctype' => 'multipart/form-data',
            'id' => 'add-new-message-form'
        ),
        'enableAjaxValidation' => true,
        'focus' => array($model, 'post'),
        'clientOptions' => array(
            'validateOnSubmit' => true
        )
    )); ?>
Как сделать чтобы валидация происходила только при нажатии на сабмит? Сейчас при потрере фокуса срабатывает валидация.
rak
Сообщения: 2181
Зарегистрирован: 2010.11.02, 23:40
Контактная информация:

Re: enableAjaxValidation

Сообщение rak »

validateOnChange => false
row248
Сообщения: 20
Зарегистрирован: 2013.02.02, 15:01

Re: enableAjaxValidation

Сообщение row248 »

Спасибо, в который раз уже помогаешь.
Может еше в одном "деле" сможешь помочь?
Как сделать индикатор того, что происходит валидация ну и если валидация прошла - убрать этот индикатор.
Что приходит на ум, так это воспользоваться методами after и beforeValidate, но тогда придется переписывать
код загрузки, обработки ошибок и т.д. в них. Можно на саму кнопку сабмита повесить функцию, которая выведет на экарн
див с загрзкой, но вот как узать что валидация прошла и убрать его? Или можно как-то пользоваться функциями
after и beforeValidate без надобности переписывать их работу, а просто "дополнить"?
dzirt68
Сообщения: 32
Зарегистрирован: 2013.03.16, 00:53

Re: enableAjaxValidation

Сообщение dzirt68 »

row248 писал(а):Спасибо, в который раз уже помогаешь.
Может еше в одном "деле" сможешь помочь?
Как сделать индикатор того, что происходит валидация ну и если валидация прошла - убрать этот индикатор.
Что приходит на ум, так это воспользоваться методами after и beforeValidate, но тогда придется переписывать
код загрузки, обработки ошибок и т.д. в них. Можно на саму кнопку сабмита повесить функцию, которая выведет на экарн
див с загрзкой, но вот как узать что валидация прошла и убрать его? Или можно как-то пользоваться функциями
after и beforeValidate без надобности переписывать их работу, а просто "дополнить"?
у тебя так долго проходит валидация? :shock: что надо оповещать об этом.
row248
Сообщения: 20
Зарегистрирован: 2013.02.02, 15:01

Re: enableAjaxValidation

Сообщение row248 »

Ну хотелось бы узнать как это сделать, потом уже буду начинать показывать див с загрузкой в начале валидации,
а отключать его, когда данные уже добавились в бд.
Аватара пользователя
flashimage
Сообщения: 1517
Зарегистрирован: 2011.01.23, 12:43

Re: enableAjaxValidation

Сообщение flashimage »

Так как валидация ajax, то можно повесить хендлеры просто на ajaxStart и ajaxStop. На старте показываешь див к крутящейся гивкой, на стопе скрываешь.
Бранчи это гомеоморфические эндофункторы, которые мапятся на субманифолды пространства Гилберта.
row248
Сообщения: 20
Зарегистрирован: 2013.02.02, 15:01

Re: enableAjaxValidation

Сообщение row248 »

Опять проблемы.
В общем вот view

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

    <?php $form = $this->beginWidget('CActiveForm', array(
        'htmlOptions' => array('enctype' => 'multipart/form-data',
            'id' => 'add-new-message-form'
        ),
        'enableAjaxValidation' => true,
        'focus' => array($model, 'post'),
        'clientOptions' => array(
            'validateOnSubmit' => true,
            'validateOnChange' => false
        )
    )); ?>
    <input id="url" type="hidden" value="<?php echo Yii::app()->createUrl("bred/deleteId", array('ajax' => 1)); ?>">

    <div class="field-message">

        <?php echo $form->label($model, 'name'); ?>
        <?php echo $form->textField($model, 'name'); ?>
        <?php echo $form->error($model, 'name'); ?>

    </div>

    <div class="field-message">

        <?php echo $form->label($model, 'post', array('class' => 'new-post-add-label')); ?>
        <?php echo $form->textArea($model, 'post', array('class' => 'new-post-add')); ?>
        <?php echo $form->error($model, 'post'); ?>

    </div>

    <div class="field-message">

        <?php echo $form->label($model, 'img'); ?>
        <?php echo $form->fileField($model, 'img'); ?>
        <?php echo $form->error($model, 'img'); ?>

    </div>

    <div class="field-message">

        <?php echo CHtml::submitButton('Отправить', array('id' => 'add-new-message-submit')); ?>

    </div>
Контроллер

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

     protected function performAjaxValidation($model) {
        if(isset($_POST['ajax']) && $_POST['ajax'] === 'add-new-message-form') {
            echo CActiveForm::validate($model);
            Yii::app()->end();
        }
    }


    ## Watch main page
    public function actionIndex() {
        $model = new Bred;
        $model->setScenario('index');

        $arg = $model->getThreadsPagination();

        if ( isset($_POST['ajax']) ) {
            $this->performAjaxValidation($model);
        }

        if ( isset($_POST['Bred']) ) {
            $model->attributes = $_POST['Bred'];

            $model->img = CUploadedFile::getInstance($model, 'img'); #If file not exists @ruturn null

            if ( $model->validate() ) {
                if ( !is_null($model->img) ) {
                    $fileName = H::renameFile($model->img->name);
                    $model->img->saveAs('images/' . $fileName);
                    $model->img = $fileName;

                    ## Thumb
                    H::createThumb('images/' . $model->img);
                } 

                $model->time = time();
                $model->save();
                $this->refresh();
            }
        } 
}
И правила валидации

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

            array('post', 'required', 'message' => 'Обязательное поле'),
            array('img', 'file', 'types' => 'png, gif, jpg', 'maxSize' => 5242880, 'wrongType' => 'Разрешено загружать только .png .gif .jpg', 'tooLarge' => 'Макс. размер файла 5мб', 'message' => 'Для создание нового треда, нужна картинка!', 'on' => 'index'),
            array('img', 'file', 'types' => 'png, gif, jpg', 'maxSize' => 5242880, 'wrongType' => 'Разрешено загружать только .png .gif .jpg', 'tooLarge' => 'Макс. размер файла 5мб', 'allowEmpty' => true, 'on' => 'thread'),
            array('name', 'safe')
Проблема в том, что fileField не проходит валидацию. Как я понял, загрузить файл аяксом - сложно, но мне этого не надо,
надо всего лишь проверить, поставлен ли файл на загрзку или нет. В любом случае на сервер отправляется вот такой запрос

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

YII_CSRF_TOKEN:ea36d5294bceb95c8d73be803abc7690fe926c5a
Bred[name]:Аноним
Bred[post]:12
Bred[img]:
ajax:add-new-message-form
yt0:Отправить
поле Bred[img] всегда пусто.

При отключении валидации, все работает и загружается.
top
Сообщения: 3
Зарегистрирован: 2013.06.05, 16:07

Re: enableAjaxValidation

Сообщение top »

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

Из за чего так происходит?
top
Сообщения: 3
Зарегистрирован: 2013.06.05, 16:07

Re: enableAjaxValidation

Сообщение top »

Если кому понадобится вот нашел ответ: viewtopic.php?f=3&t=7195
Ответить