0

关于CActiveForm文档中的内容是:(clientOptions部分)

ajaxVar:字符串,表示请求的参数名称是AJAX请求。当触发 AJAX 验证时,名为该属性的参数将与其他表单数据一起发送到服务器。参数值是表单 ID。然后,服务器端可以检测谁触发了 AJAX 验证并做出相应的反应。默认为“ajax”。

现在看一下我的示例: 摘要:我有一个包含两个字段的表单,mail并且newEmail我通过提交表单ajaxSubmitButton(如果您需要表单代码,请告诉我输入)。在以下我得到var_dump($_POST)两种状态的内容:

首先:以下 var_dump($_POST) 用于字段(newEmail)为空时:

array
'User' =>
    array
    'email' => string 'user@gmail.com' (length=14)
    'newEmail' => string '' (length=0)

第二:以下 var_dump($_POST) 用于填充所有字段时:

array
'User' =>
    array
    'email' => string 'user@gmail.com' (length=14)
    'newEmail' => string 'admin@gmail.net' (length=19)
'ajax' => string 'email-form' (length=10)
'yt0' => string 'update' (length=18)

如您所见,只有在填写所有字段时,ajaxVar(ajax)存在于$_POST. 在ajaxVar(ajax)CActiveForm 中初始化时?


编辑

电子邮件形式:

<?php
<div class="form">
    <?php $form = $this->beginWidget('CActiveForm',array(
            'id'=>'email-form',
            'enableAjaxValidation'=>true,
    'clientOptions'=>array(
            'validateOnSubmit'=>true,
            'focus'=>'input[type="email"]:first',
            )
    )); ?>

    <div class="row">
            <?php echo $form->label($model,'email') ?>
            <?php echo $form->textField($model,'email') ?>
            <?php echo $form->error($model,'email') ?>
    </div>

    <div class="row">
            <?php echo $form->label($model,'newEmail') ?>
            <?php echo $form->textField($model,'newEmail') ?>
            <?php echo $form->error($model,'newEmail') ?>
    </div>
    <hr>
    <div class="row">
            <?php  echo CHtml::ajaxSubmitButton(
            'update',
            Yii::app()->createUrl('upanel/user/CEmail'),
            array(
                    'dataType'=>'json',
                    'type' => 'POST',
                    'data' => "js:$('#email-form').serialize()",
                    'success'=>'function(data){
                    if(data.status=="success")
                    {
                            //alert(data.status);
                            hideFormErrors(form="#email-form");
                            callback(status=data.status);
                    }else{
                            formErrors(data,form="#email-form");
                    }
                    }',

                    'beforeSend'=>'before',
            ),
            array(
                    'id' => 'update-button'.uniqid(),
                    'class'=>'submit-button'
            )
            );
            ?>
    </div>
    <?php $this->endWidget() ?>
</div> 
<?php echo $form->errorSummary($model,'please solve following errors:') ?>

行动电子邮件:

public function  actionCEmail()
{
    /*ob_start();
    var_dump($_POST);
    $log=ob_get_contents();
    $fp = fopen('data.html', 'w');
    fwrite($fp, $log);
    fclose($fp);
    Yii::app()->end();*/ //This block active whenever i want see the $_POST content

    $model = $this->loadModel(Yii::app()->user->id);
    $model->scenario = 'CEmail';
    $this->performAjaxValidation($model,'email-form');

    if(Yii::app()->request->isAjaxRequest)
        $this->renderPartial('_cemail',array('model'=>$model),false,true);
    else
        $this->render('update',array('model'=>$model,'form'=>'_cemail'));
}

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

2 回答 2

1
ajaxVar 

初始化 onsubmit if 'validateOnSubmit'=>true,。尝试validateOnChange=>true在初始化时使用并显示您的 cactiveform 代码。

并真正停止发明“自行车”。如果您在上一个问题中不理解我的代码,请尝试阅读http://learnyii.blogspot.com/2010/12/yii.html 。我向您展示了我在工作项目中使用的 ajax 验证工作代码。使用该方法,您$_POST将更新所有带有 JSON 对象的字段的更改,其中将包含表单错误。

停止淹没社区。问候。

于 2013-04-22T08:42:29.633 回答
1

在你的行动中:

    public function  actionCEmail()
    {
        $model = $this->loadModel(Yii::app()->user->id);
        $model->scenario = 'CEmail';
        if(Yii::app()->request->isAjaxRequest)
            {
                $error = CActiveForm::validate($model);
                if($error!='[]')
                                {
                                    echo $error;
                    Yii::app()->end();
                }
            }

        if(isset($_POST['CEmailForm']))
              {
               //put form name in POST above 
               //do whatever you need with model here
               //save / edit etc.
               //in the end
               echo CJSON::encode(array(
                                  'status'=>'success',
                                  )); 
           Yii::app()->end();
               }
if(Yii::app()->request->isAjaxRequest) //check renders 
            $this->renderPartial('_cemail',array('model'=>$model),false,true);
        else
            $this->render('update',array('model'=>$model,'form'=>'_cemail'));
    }

在您的视图中提交按钮:

 <?php echo CHtml::ajaxSubmitButton ("Save", Yii::app()->request->url, array (
            'dataType' => 'json', 
            'type'=>'post',
            'success' =>
            'js:function (data) {


              if(data.status=="success"){
                            //do whatever you need on success
                            //show flash/notification 
                          };

                                      }
              else {//show errors here
                $.each(data, function(key, val) {
                        $("#YourFormIDhere #"+key+"_em_").text(val);
                $("#YourFormIDhere #"+key+"_em_").css(\'display\',\'block\');           
                                });
                        //can show error summarry here or custom notifications      
                    };

              }',
        ), array (
        'id' => 'yourbuttonid_submit_'.rand(1,255), // Need a unique id or they start to conflict with more than one load.
        ));?>

尝试这样做。有用。把事情简单化。你输了2个?验证 2 个字段的天数。我刚刚在我的更改密码表格上做了这个。我花了5分钟。我尝试使用默认空字段保存时的帖子​​:

{"UserChangePassword_verifyPassword":["Required field","Retype Password is incorrect."]}

像这样做,不要浪费时间。问候。

于 2013-04-23T07:39:18.863 回答