Yii ajaxSubmitButton () с проверкой полей - PullRequest
12 голосов
/ 14 июня 2011

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

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

  1. Проверка поля, когда фокус покидает его, асинхронно.
  2. Асинхронно вызывать метод на стороне сервера при нажатии кнопки.

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

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

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


EDIT

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

Флаг 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» заключается в получении частичного рендеринга с сервера, отличного от проверки модели. Я хочу обе вещи: проверка и частичный рендеринг.

Ответы [ 6 ]

13 голосов
/ 30 октября 2012

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

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

Шаг 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. @ ваш контроллер вызывает validate вашей модели и возвращает объект json, если форма неверна 2. @ ваш взгляд разбивает этот объект json (или проходит через него) и показывает сообщения об ошибках под соответствующими элементами формы.

Будьте проще:)

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

1 голос
/ 16 мая 2012

Я нашел решение. Моя защитная форма

<?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;
        }'
    ),
)); ?>

Мое создание Действие

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();
}
1 голос
/ 15 июня 2011

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

0 голосов
/ 24 сентября 2013

Попробуйте:

/*
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/

0 голосов
/ 19 марта 2013

проверьте этот фрагмент, он решает проблему на стороне клиента http://www.yiiframework.com/wiki/466/a-simple-way-to-get-yii-client-side-form-validation-run-when-submitting-by-ajax/

0 голосов
/ 23 марта 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...