Yii ajaxSubmitButton()带有字段验证

dag*_*lll 12 php ajax jquery yii

我正在使用Yii ajaxSubmitButton()来提交表单.此外,我已将'enableAjaxValidation'参数设置为true以验证相应的文本框.

我能做什么:

  1. 在焦点离开时,以异步方式验证字段.
  2. 单击按钮时,异步调用服务器端方法.

问题是我不知道如何在单击提交按钮时执行字段验证,如果验证了模型,则在客户端执行部分渲染.

如果我覆盖ajaxSubmitButton中的'success'事件,我会得到部分渲染,但我无法维护模型验证.

有帮助吗?


编辑

谢谢回复,

已设置validateOnSubmit标志,如果未设置"成功"事件,则将正确验证模型.

当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',
                                        )
                                    );
    ?>
Run Code Online (Sandbox Code Playgroud)

alert('success')将打印对应于模型验证的字符串.一旦我有了这个字符串,必须在客户端调用什么逻辑?

覆盖"成功"javascript处理程序的原因是从服务器接收部分呈现,与模型验证不同.我想要两件事:验证和部分渲染.

Muh*_*yaz 13

嘿我有同样的问题,并且dint得到它的工作,即使有aftervalidate,beforevalidate等等.其次我想使用这个coz的扩展我的应用已经有很多.所以我做了这个:

编辑:根据Barth的建议,我将这些代码放在这里.

第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();
                        }
           }

    }
Run Code Online (Sandbox Code Playgroud)

第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')); ?>
Run Code Online (Sandbox Code Playgroud)

这对我来说很好.上面写的所有代码都是我的写作风格.您可以根据需要更改它们,但是,只有两件事需要注意如下:1.@您的控制器调用模型的验证并返回一个json对象,如果表单无效2. @您的视图中断此json对象(或遍历通过它)并在表单的相应元素下显示错误消息.

把事情简单化 :)

你也可以在这里看到我的博客文章:http: //www.yiiframework.com/forum/index.php/topic/37075-form-validation-with-ajaxsubmitbutton/


k t*_*e z 1

CActiveForm有一个名为 的公共财产$clientOptions。有一个validateOnSubmit选项默认为 false。你需要它是真实的。在您看来,它应该看起来像这样:

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

)); ?>
Run Code Online (Sandbox Code Playgroud)

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

  • 此验证未使用 ajaxSubmitButton 执行。它仅适用于 CHtml::submitButton (8认同)