【发布时间】:2012-02-04 21:50:29
【问题描述】:
我通过 ajax(使用 jquery)打开一个表单,我想保存它而不重新加载整个页面。我必须更改代码以获取文本响应(例如“ok!”)而不是重定向到编辑页面?
这是我的 js:
$("#newcatlink").click(function() {
$.ajax({
'url': "category/new",
'success': function(data, textStatus, jqXHR) {
$("#mdialog").html(data);
$("#_form_jqhide").hide();
$("#mdialog").dialog({
modal: true,
width: 500,
resizable: false,
buttons: {
Save: function() {
$.ajax({
'type': 'POST',
'url': 'category/create',
'data': $("#categoryform").serialize(),
'success': function(data, textStatus, jqXHR) {
alert(data);
}
});
},
Cancel: function() {
$(this).dialog("close");
}
}
});
}
});
});
我在 actions.class.php 中更改了 processForm 操作,如下所示:
...
if ($form->isValid())
{
$Category = $form->save();
if($request->isXmlHttpRequest()) {
return $this->renderText("ok!");
} else {
$this->redirect('category/edit?id='.$Category->getId());
}
}
但它并没有改变任何东西。如何做到这一点?
编辑 8/1/12:
我已经根据 blowski 和 sakfa 的答案对我的代码进行了更改,但我遇到了另一个问题:如何捕获表单错误?我添加到 processForm else 到 if 并且它按预期工作,但我无法得到错误消息/代码/无论如何,只有存在错误的事实。
这里是代码:http://pastebin.com/ppbPM88G 这是发送表单后的服务器回答,其中一个必填字段为空:
{"haserrors":true,"errors":[]}
【问题讨论】:
-
它还在重定向到分类/编辑页面?在返回
$this->renderText('ok!')之前添加一个die('here')语句以检查它是否进入该分支。 -
with die,它按预期显示“here”。没有死,重定向到编辑页面。
-
我想不出它为什么继续运行重定向。动作类中的其他任何地方肯定没有重定向?通常为此我使用
if(!$request->isXmlHttpRequest()) { $this->redirect() },并将文本渲染放在公共方法中。 -
pastebin.com/S4MnPRx7 这就是完整的 processForm 方法。没有其他任何改变。
-
好的,尝试在重定向前添加
die('here')。如果这不会杀死脚本,那么重定向肯定来自其他地方。
标签: php jquery ajax symfony1 propel