【问题标题】:Yii ajax validation for blog demo - posts/contact formYii ajax 验证博客演示 - 帖子/联系表
【发布时间】:2013-01-01 06:09:33
【问题描述】:

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

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

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

演示\博客\protected\views\comment_form.php

演示\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 生成的无效消息)

【问题讨论】:

  • 您是否也对各个控制器的操作进行了更改?

标签: ajax yii


【解决方案1】:

Ajax 验证包括 3 个阶段:

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

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


第 2 阶段。

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

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

POST 请求被发送到表单的action url(默认情况下),在您的情况下将类似于:http://foo/index.php/site/contact,这意味着您必须更改您的 controllers/SiteController.php em>的actionContact函数:

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.phpcontrollers/PostController.phpactionCreate 和 @987654335 进行类似的调整(从第一个代码 sn-p) @ 方法。只是您的if 支票将更改为:

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

额外信息。

ajax POST 参数称为ajaxVar,默认为ajax。您可以更改很多这些默认值,例如验证 url(clientOptionsactionvalidationUrl),或clientOptionsajaxVar$_POST['ajax'])。阅读documentation 以查看选项。


1除了表单的字段。

【讨论】:

  • 谢谢。顺便说一句,对于 actionUpdate(),它使用“$model=$this->loadModel();”而不是 "$model=new Post" 来加载初始值。此外,似乎“$form->error($model,'title')”不仅对于错误消息是必要的,而且对于将输入字段显示为红色/绿色也是必要的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多