2012-01-08 22 views
3

CustomerController,我有create行动:在Yii框架中是否有任何内置的方式来启用AJAX表单提交?

public function actionCreate() { 
    $model = new Customer; 

    $this->performAjaxValidation($model, 'customer-form'); 

    //only support ajax saving 
    if (isset($_POST['Customer']) && Yii::app()->getRequest()->getIsAjaxRequest()) { 
       $model->setAttributes($_POST['Customer']); 
       $saveSuccess = $model->save(); 
       if ($saveSuccess) { 
         //should echo a success message              
       } 
       else {        
         //should echo error messages 
       } 

       Yii::app()->end(); 
    } 


    $this->render('create', array('customer' => $model)); 
} 

在视图中,我使用的CActiveform:

$form = $this->beginWidget('CActiveForm', array(
     'id' => 'customer-form', 
     'enableAjaxValidation' => true, 
     'clientOptions'=>array(
      'validateOnSubmit'=>false   
       ) 
     ) 
); 

正如你所看到的,我设置enableAjaxValidation为真,但我设置客户端选项validateOnSubmit为false。

如果我将其设置为true,当表单提交,它将第一发送AJAX POST请求发送到服务器,然后服务器将返回错误消息(如果有的话)JSON格式,CActiveForm将显示​​错误在视图中自动摘要并阻止表单提交。

如果没有发现错误,表单将执行 POST请求(这是非AJAX)并实际提交表单。

但这不是我以后的行为。

理想情况下,我想有一个单个 AJAX POST请求,以便当表单提交时,服务器将返回成功或错误消息,CActiveForm将自动显示它们。

这是Yii内置的东西还是我必须编写自己的代码呢?

+1

一定要使用“Yii :: app() - > request-> isAjaxRequest”来检查请求是否是Ajax请求。 – 2012-01-08 07:07:33

回答

4

要执行ajax提交,您需要用ajaxSubmitButton()替换通常的CHtml::submitButton()。在这里检查:http://www.yiiframework.com/doc/api/1.1/CHtml#ajaxSubmitButton-detail

+0

感谢您的回复。但是,我希望将验证和表单提交放在单个AJAX POST请求中。 – bobo 2012-01-08 06:01:36

+0

当然!我很抱歉,我没有仔细阅读这个问题......现在我看到了......实际上解决方案更加简单,但让我将其添加到我的答案中。 – 2012-01-08 06:46:43

+0

当然,使用'ajaxSubmitButton()'的形式,会向服务器发送一个AJAX(而不是非AJAX)的POST请求。但是由于这个POST请求不是由CActiveForm启动的,CActiveForm不会在客户端捕获它的响应,所以不会自动显示错误或成功消息。 – bobo 2012-01-08 17:41:57