Подтвердить что ты не робот

Yii ajaxSubmitButton() с проверкой полей

Я использую Yii ajaxSubmitButton() для отправки формы. Кроме того, я установил параметр enableAjaxValidation в значение true для проверки соответствующих текстовых полей.

Что я могу сделать:

  • Проверяйте поле, когда фокус покидает его, асинхронно.
  • Вызов метода на стороне сервера, когда кнопка нажата, асинхронно.

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

Если я переопределяю событие "success" в ajaxSubmitButton, я получаю частичный рендеринг, но я не могу поддерживать проверку модели.

Любая помощь?


ИЗМЕНИТЬ

Спасибо за ответ,

Флаг validateOnSubmit уже установлен, и модель будет правильно проверена, если событие "success" не было установлено.

Когда ajaxSubmitButton выглядит так:

<?php echo CHtml::ajaxSubmitButton( 'Send',
                                        CHtml::normalizeUrl(array('site/ajaxIndexSubmit')),
                                        array(
                                        'error'=>'js:function(){
                                            alert(\'error\');
                                        }',
                                        'beforeSend'=>'js:function(){
                                            alert(\'beforeSend\');
                                        }',
                                        'success'=>'js:function(data){
                                            alert(\'success, data from server: \'+data);
                                        }',
                                        'complete'=>'js:function(){
                                            alert(\'complete\');
                                        }',
                                        //'update'=>'#where_to_put_the_response',
                                        )
                                    );
    ?>

предупреждение ( "успех" ) выведет строку, соответствующую проверке модели. Как только у меня есть эта строка, какая логика должна быть вызвана на стороне клиента?

Причиной переопределения обработчика javascript "success" является получение частичного рендеринга с сервера, отличного от проверки модели. Я хочу обе вещи: проверка и частичное рендеринг.

4b9b3361

Ответ 1

Привет, у меня была такая же проблема, и у меня получилось работать даже с aftervalidate, beforevalidate и т.д. И во-вторых, я предпочитаю использовать расширение для этого coz. В моем приложении уже много. Поэтому я сделал это:

Изменить: согласно предложению Барта, я сам помещаю этот код.

Шаг 1: @действие вашего контроллера

public function actionMyAction()
    {       
            $model=new User;             
            $this->performAjaxValidation($model);  

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

                       //do anything here
                         echo CJSON::encode(array(
                              'status'=>'success'
                         ));
                        Yii::app()->end();
                        }
                        else{
                            $error = CActiveForm::validate($model);
                            if($error!='[]')
                                echo $error;
                            Yii::app()->end();
                        }
           }

    }

Шаг 2: @ваш вид Ваша форма может выглядеть так:

<?php
$form=$this->beginWidget('CActiveForm', array(
    'id'=>'user-form',
    'enableAjaxValidation'=>true,
    'action'=>$this->createUrl('myController/MyAction'),
    'enableClientValidation'=>true,
 )); ?>
    <div class="errorMessage" id="formResult"></div>
    <div id="AjaxLoader" style="display: none"><img src="<?php echo Yii::app()->request->baseUrl; ?>/images/spinner.gif"></img></div>
    <div class="row-user-single">
            <?php echo $form->labelEx($model,'attribute1'); ?>
            <?php echo $form->passwordField($model,'attribute1',array('size'=>60,'maxlength'=>500)); ?>
            <?php echo $form->error($model,'attribute1'); ?>
    </div>

    <div class="row-user-single">
            <?php echo $form->labelEx($model,'attribute2'); ?>
            <?php echo $form->passwordField($model,'attribute2',array('size'=>60,'maxlength'=>500)); ?>
            <?php echo $form->error($model,'attribute2'); ?>
    </div>
    <div class="buttons">

     <?php echo CHtml::ajaxSubmitButton('Save',CHtml::normalizeUrl(array('myController/MyAction','render'=>true)),
             array(
                 'dataType'=>'json',
                 'type'=>'post',
                 'success'=>'function(data) {
                     $("#AjaxLoader").hide();  
                    if(data.status=="success"){
                     $("#formResult").html("form submitted successfully.");
                     $("#user-form")[0].reset();
                    }
                     else{
                    $.each(data, function(key, val) {
                    $("#user-form #"+key+"_em_").text(val);                                                    
                    $("#user-form #"+key+"_em_").show();
                    });
                    }       
                }',                    
                 'beforeSend'=>'function(){                        
                       $("#AjaxLoader").show();
                  }'
                 ),array('id'=>'mybtn','class'=>'class1 class2')); ?>

Это отлично работает для меня И весь написанный выше код - это мой стиль письма. Вы можете изменить их по мере необходимости, но, следует отметить только две вещи: 1. @ваш контрольный вызов проверяет вашу модель и возвращает объект json, если форма недействительна. 2. @ваш взгляд разбивает этот json-объект (ИЛИ проходит через него) и показывает сообщения об ошибках в соответствующих элементах формы.

Держите его просто:)

Вы также можете увидеть мой блог: http://www.yiiframework.com/forum/index.php/topic/37075-form-validation-with-ajaxsubmitbutton/

Ответ 2

CActiveForm имеет общедоступное свойство, называемое $clientOptions. По умолчанию параметр validateOnSubmit равен false. Вам нужно, чтобы это было правдой. По вашему мнению, это должно выглядеть примерно так:

<?php $form=$this->beginWidget('CActiveForm', array(
    'id'=>'yourFormId',
    'enableAjaxValidation'=>TRUE,
    'clientOptions'=>array('validateOnSubmit'=>TRUE),

)); ?>

http://www.yiiframework.com/doc/api/1.1/CActiveForm#clientOptions-detail

Ответ 3

Я нашел решение. Моя CActive Form

<?php $form=$this->beginWidget('CActiveForm', array(
    'id'=>'gold-value-form',
    'enableAjaxValidation'=>true,
    'clientOptions'=>array(
        'validateOnSubmit'=>true,
        'afterValidate'=>'js:function(form, data, hasError) {
            if(jQuery.isEmptyObject(data)) {
                alert("ok")
            }
            return false;
        }'
    ),
)); ?>

My create Action

public function actionCreate()
{
    $this->layout=false;
    $model=new GoldValue;

    if(isset($_POST['ajax']) && $_POST['ajax']==='gold-value-form')
    {
        if(isset($_POST['GoldValue']))
        {
            $model->attributes=$_POST['GoldValue'];
            if(!$model->save())
                echo CActiveForm::validate($model);
        }
    }
    Yii::app()->end();
}

Ответ 4

Я собираюсь попробовать отправить другое значение (опубликовано с помощью $_GET) на клике ajaxSubmitButton. Тестирование значения, а затем выполнение проверки, если значение не существует. Будет ли это работать для вас?

Ответ 6

Попробуйте следующее:

/*
1) Register the snippet into the HEAD. Be sure that it is linked after jquery.yii.js is linked.

2) Configure your CActiveForm instance like this:
*/

$this->beginWidget('CActiveForm', array(
    ...
    'enableClientValidation'=>true,
    'clientOptions'=>array(
        'validateOnSubmit'=>true,
        'afterValidate'=>'js:$.yii.fix.ajaxSubmit.afterValidate'
    )
    ...
);
/*
3) Configure your CHtml::ajaxSubmitButton instance like this:
*/

echo CHtml::ajaxSubmitButton('Whateverlabel', 'whateverurl', array(
    ...
    'beforeSend'=>'js:$.yii.fix.ajaxSubmit.beforeSend("#YOUR_FORM_ID")'
    ...
);

Подробнее http://www.codexamples.com/90/chtml-ajaxsubmitbutton/ или http://www.codexamples.com/category/chtml-8/