1

在 Yii 博客演示中,包含在框架下载和此处:

http://www.yiiframework.com/demos/blog/

表单输入的 ajax 验证适用于发表评论和登录表单...

demos\blog\protected\views\comment_form.php

demos\blog\protected\views\login.php

两者都包括

<?php $form=$this->beginWidget('CActiveForm', array(
    'id'=>'comment-form',
    'enableAjaxValidation'=>true,
)); ?>

或者

<?php $form=$this->beginWidget('CActiveForm', array(
    'id'=>'login-form',
    'enableAjaxValidation'=>true,
)); ?>

我尝试向views/site/contact.php和views/post/_form.php('id'=>'contact-form'和'post-form')添加类似的东西,但它不起作用(跳出表单字段不会产生红色或绿色字段,具体取决于输入是有效还是无效,并且也没有 ajax 生成的无效消息)

4

1 回答 1

1

Ajax 验证包括 3 个阶段:

  1. 使用表单字段的值向服务器发送 ajax 请求以验证它们。
  2. 验证字段并从服务器返回验证消息。
  3. 使用验证消息更新表单字段。

当您设置enableAjaxValidation为 时true,您正在处理第 1 阶段和第 3 阶段,因此还剩下第 2 阶段。


阶段2。

默认情况下,ajax 验证触发 POST ajax 调用,附加1 个 'ajax'post 参数,其值设置为id正在验证的表单的值。在您的情况下,它应该类似于:ajax --> contact-formajax --> post-form.

所以你要做的就是在你的服务器端捕获这个 POST 请求,并在验证请求中发送的字段后发送响应。

POST 请求被发送到表单的actionurl(默认情况下),在您的情况下将类似于: http://foo/index.php/site/contact,这意味着您必须更改您的controllers/SiteController.phpactionContact功能:

public function actionContact(){
    $model = new ContactForm;
    // checking if it is ajax validation request below 
    if(isset($_POST['ajax']) && $_POST['ajax']==='contact-form') {
        echo CActiveForm::validate($model); // validate the form fields sent in POST, and return response
        Yii::app()->end(); // end the application
    }
    // ... leave the rest of the code as is ...

}

在博客演示的views/site/contact.php中没有错误字段,因此您暂时无法看到消息。要查看它们,请将错误字段添加到表单中:

<div class="row">
    <?php echo $form->labelEx($model,'name'); ?>
    <?php echo $form->textField($model,'name'); ?>
    <?php echo $form->error($model,'name'); // this line needs to be added ?>
</div>

为其他输入类似地添加错误字段。

对于post/_form.php对控制器/PostController.phpactionCreateactionUpdate方法进行类似的调整(从第一个代码片段开始) 。只是您的if支票将更改为:

 if(isset($_POST['ajax']) && $_POST['ajax']==='post-form')

额外信息。

ajaxPOST 参数称为,ajaxVar默认为ajax。您可以更改很多这些默认值,例如验证 url (或actionof validationUrlclientOptions或. 阅读文档以查看选项。ajaxVar$_POST['ajax']clientOptions


1 除了表单的字段。

于 2013-01-01T12:30:06.783 回答