2011-06-14 38 views
12

我使用Yii ajaxSubmitButton()来提交表单。此外,我已将“enableAjaxValidation”参数设置为true以验证相应的文本框。Yii ajaxSubmitButton()与字段验证

我能做些什么:

  1. 验证当焦点离开它,异步领域。
  2. 异步单击按钮时调用服务器端方法。

问题是,我不知道如何在点击提交按钮时执行字段验证,并且如果验证模型,则在客户端执行部分呈现。

如果我重写ajaxSubmitButton“成功”事件,我得到的部分呈现,但我不能保持模型验证..

任何帮助吗?


编辑

感谢您的答复,

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

警报(“成功”),将打印对应的模型验证字符串。一旦我有了这个字符串,客户端必须调用什么逻辑?

重写'成功'javascript处理程序的原因是从服务器接收部分呈现,与模型验证不同。我想要两个东西:验证和部分渲染。

+0

很好的问题,我也没有找到一种方法来使用validateOnSubmit与ajaxSubmitButton – RusAlex 2011-06-14 19:06:24

回答

1

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

+8

这个验证没有执行与ajaxSubmitButton。它只适用于CHtml :: submitButton – RusAlex 2011-06-15 05:42:14

0

我将要尝试不同的值发送(贴有$ _GET)上ajaxSubmitButton点击。测试该值,然后在该值不存在时运行验证。这对你有用吗?

1

我找到了解决方案。 我了CActive形式

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

嘿我有同样的问题,力得到它的工作即使aftervalidate,beforevalidate等on.And其次我力喜欢用一个扩展这个因为我的应用程序已经有很多。 所以我做了这个:

编辑:根据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(); 
         } 
      } 

    } 

第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. @ your view break this json object (或遍历它)并在窗体的相应元素下显示错误消息。

保持简单:)

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

+0

欢迎来到StackOverflow!您想在答案中添加链接的摘录吗?这样,如果链接消失,你的答案仍然有用。 – 2012-10-30 12:27:04

+0

这应该是标记为答案。 – MKD 2015-05-19 10:48:17

0
+1

孤独链接被认为是一个不好的答案(请参阅[faq#删除]),因为它本身毫无意义,并且**目标资源不能保证在将来活着**。 [这将是最好的](http://meta.stackexchange.com/q/8259)在这里包括答案的基本部分,并提供链接供参考。 – j0k 2013-03-19 08:16:07

-1

解决了这个问题试试这个:

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