在Concrete5-8.1.0上,我创建了一个具有Ajax功能的自定义块,主要基于具体的5文档 - Implementing Ajax in Block View Templates。但是,与示例不同,我不想重新加载块视图,我想根据输入传递特定的消息。我尝试了一个简单的echo '{"msg":"ok"}';
和return '{"msg":"ok"});
作为测试,但对函数的请求产生了一个空响应。
我找到How To Send JSON Responses with Concrete5.7并使用选项2(更好地控制错误代码),产生以下测试代码:
public function action_submit($token = false, $bID = false) {
if ($this->bID != $bID) {
return false;
}
if (Core::make('token')->validate('get_paper', $token)) {
//save to database
//removed for brevity
//send email
if ($this->emailto != '') {
//removed for brevity
}
if ($_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest') {
return new Response(
json_encode(array('msg' => 'ok')),
200,
['Content-Type' => 'application/json']
);
} else {
Redirect::page($page)->send();
}
}
else {
return false;
}
exit;
}
数据库保存和电子邮件功能按预期方式,但响应仍为空。在Chrome开发工具中,我看到了正确的内容类型(作为测试,我尝试了text/html
并看到了开发工具中的更改),但没有内容。有趣的是,如果我将状态从200
更改为500
,我不仅会看到开发工具中反映的状态更改,还会看到我期待的{"msg":"ok"}
内容,但更改了状态返回200
,内容再次为空。
似乎我遗漏了一些简单的东西...我已经验证所有缓存都在C5中关闭(网站仍在开发中),我还验证了jQuery请求包含cache:false
,但解决方法逃避了我。