JsHelper Request如何在CakePHP 2.1中成功/错误/完成回调?

时间:2013-07-02 19:05:16

标签: jquery ajax forms cakephp xmlhttprequest

我正在尝试使用CakePHP 2.1框架,jQuery和Cake的JsHelper设置邀请请求页面,以便提交用户电子邮件,然后发出回复。理想情况下,我希望在成功提交电子邮件后将表单淡出,不幸的是,当使用“成功”或“完整”回调时,即使遇到验证错误,它也会淡出。

我的view.ctp代码:

<?php $this->Js->get('#InvitationRequestAddForm'); ?>
    <?php $this->Js->event(
        'submit',
        $this->Js->request(
            array(
                    'controller'=>'InvitationRequests',
                    'action'=>'add'
            ),
            array('async' => true,
                'method' => 'POST',
                'dataExpression'=>true,
                'update' => '#invitationStatus',
                'complete' => "$('#InvitationRequestAddForm').fadeOut();",
                'data'=> $this->Js->serializeForm(
                    array(
                        'isForm' => true,
                        'inline' => true
                    )
                )
            )
        )
    ); ?>

我的控制器代码:

if($this->RequestHandler->isAjax()) 
    {
        if ($this->request->is('post')) 
        {
            $this->InvitationRequest->create();
            if ($this->InvitationRequest->save($this->request->data)) 
            {
                $this->set('alert_state', 'alert-success');
                $this->set('message', '<strong>Hang Tight!</strong> We have your request and we are working hard to approve as soon as possible!');
            } 
            else 
            {
                $this->set('alert_state', 'alert-error');
                $this->set('message', '<strong>Uh Oh!</strong> Something went wrong, check your email address and please try again.');
            }
        } 
    }

非常感谢任何帮助/建议!

1 个答案:

答案 0 :(得分:0)

首先,the docs为jquery

中的complete选项指定此项
  

请求完成时要调用的函数(执行成功和错误回调之后)。

因此,无论是成功还是错误,它都会被调用。您需要使用complete更改success并且(如果您需要(但建议))error来执行您想要的fadeOut,因为complete将始终在ajax之后执行调用

现在,另一件事。你必须记住,即使控制器中的save有验证错误而且没有保存,ajax调用也会成功。为什么?因为带动作的连接将是正常的,并且控制器中没有可怕的错误。因此,在ajax调用的success函数中,您需要检查alert-state变量,如果它是alert-success,请执行fadeOut,否则请根据需要处理错误。