使用Js Helper的CakePHP ajax加载页面而不是模板以获得成功,为什么?

时间:2012-02-10 13:07:12

标签: ajax cakephp cakephp-1.3

我正在尝试通过ajax和CakePHP 1.3中的JsHelper提交表单

我尝试拨打/eng/feedbacks/submit_feedback,但在控制台中,我看到了http://lang/eng/pa/homepage的帖子。返回的结果是该页面的另一个实例,而不是其他任何实例。

这似乎与此类submit_feedback是否存在无关。我已经使用die("test");启动了该操作,但它不会改变任何内容。

为什么会这样,发生了什么?

表单在我的布局中(因为我希望它在我的页脚中)。当网址为/eng/pa/homepage

时运行

表格代码:

echo $this->Form->create('Feedback', array('url'=>array( 'controller'=>'feedbacks', 'action'=>'submit_feedback')));
echo $this->Form->input('Feedback.content', array('label'=>false, 'type'=>'textarea'));
echo $this->Js->submit('Save', array('class'=>'button blue',
                            'before'=>$this->Js->get('#sending')->effect('fadeIn'),
                            'success'=>$this->Js->Get('#sending')->effect('fadeOut'),
                            'update'=>'#success'
                        ));
echo $this->Form->end();?>
<div id="success">xx</div>

在那个#success DIV中,我得到一个相关的整页,而不是我在控制器动作中定义的那个

控制器方法:

function submit_feedback(){
    if(!empty($this->data)){
        $this->Feedback->set($this->data);
        if($this->Feedback->validates()){
            if($this->Feedback->save($this->data)){
                // AJAX
                if($this->RequestHandler->isAjax()){
                    $this->render('/feedbacks/success', 'ajax');
                }else{
                    die('not ajax');
                    }

            }
            }
        }
}

成功模板是:

<p style="background: lightgreen">Purple cow!</p>

我做错了什么?

注意:如果我从/eng/feedbacks/submit_feedback页面运行相同的表单,它的工作原理与ajax完全相同,我的数据库会更新,我得到了必要的“成功”模板加载,一切都闪亮而快乐。

更新:生成源码COUDE:

<form accept-charset="utf-8" action="/eng/feedbacks/submit_feedback" method="post" id="FeedbackReadForm">
<div style="display: none;">
    <input type="hidden" value="POST" name="_method">
</div>
<input type="hidden" id="FeedbackUserId" value="141" name="data[Feedback][user_id]">
<div class="input radio">
    <input type="hidden" value="" id="FeedbackType_" name="data[Feedback][type]">
    <input type="radio" value="suggestion" id="FeedbackTypeSuggestion" name="data[Feedback][type]">
    <label for="FeedbackTypeSuggestion">Suggestion</label>
    <input type="radio" value="problem" id="FeedbackTypeProblem" name="data[Feedback][type]">
    <label for="FeedbackTypeProblem">Poblem</label>
    <input type="radio" value="opinion" id="FeedbackTypeOpinion" name="data[Feedback][type]">
    <label for="FeedbackTypeOpinion">Other Opinion</label>
</div>
<div class="input textarea">
    <textarea id="FeedbackContent" rows="6" cols="30" name="data[Feedback][content]"></textarea>
</div>
<div style="margin-top: 17px; margin-right: 50px;" class="right">
    <a onclick="javascript: closeFeedbackPuller(); return false;" href="#">Cancel</a>
</div>
<div class="submit">
    <input type="submit" value="Save" id="submit-396027771" class="button blue">
</div>
</form>

更新2:JS生成:

$(document).ready(function () {
$("#submit-396027771").bind("click", function (event) {
    $.ajax({
        beforeSend:function (XMLHttpRequest) {
            $("#sending").fadeIn();
        }, 
        data:$("#submit-396027771").closest("form").serialize(), 
        dataType:"html", 
        success:function (data, textStatus) {
            $("#sending").fadeOut();
            $("#success").html(data);
        }, 
        type:"post", 
        url:"\/eng\/pa\/homepage"
    });
    return false;
});
});

我看到网址错误,甚至认为表单网址是对的。怎么解决这个问题?

1 个答案:

答案 0 :(得分:0)

echo $this->Js->submit('Save', array('class'=>'button blue',
                        'before'=>$this->Js->get('#sending')->effect('fadeIn'),
                        'success'=>$this->Js->Get('#sending')->effect('fadeOut'),
                        'url' => '/eng/feedbacks/submit_feedback',
                        'update'=>'#success'
                    ));

这可能会解决您的问题,但我并非100%肯定。似乎Js-&gt; submit()方法接受了很多Form辅助方法。