在 Concrete5-8.1.0 上,我创建了一个具有 Ajax 功能的自定义块,主要基于 concrete5 文档 -在块视图模板中实现 Ajax。但是,与我不想重新加载块视图的示例不同,我想根据输入传递特定的消息。我尝试了一个简单的echo '{"msg":"ok"}';
和return '{"msg":"ok"});
作为测试,但对该函数的请求产生了一个空响应。
我找到了如何使用 Concrete5.7 发送 JSON 响应并使用选项 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 开发工具中,我看到了正确的 Content-Type(作为测试,我尝试text/html
在开发工具中看到了这种变化),但没有内容。有趣的是,如果我将状态从更改为200
,500
我不仅会在开发工具中看到状态更改,还会看到{"msg":"ok"}
我期望的内容,但将状态更改回,200
内容又是空的。
似乎我遗漏了一些简单的东西......我已经验证了 C5 中的所有缓存都已关闭(站点仍在开发中),我还验证了 jQuery 请求包括cache:false
,但解决方案让我无法理解。