我正在开发Silverstripe项目,我希望有一种简单的方法可以将CMS生成的页面(或页面的子类型)的内容呈现为JSON。
理想情况下,我想在路径末尾添加“/ json”,或通过post(json = true)发送参数并获取JSON格式的响应。
我尝试在我的CustomPage_Controller类中添加一个动作,如下所示:
public static $allowed_actions = array('json');
public function json(SS_HTTPRequest $request) {
// ...
}
但我无法弄清楚如何做到这一点:
答案 0 :(得分:10)
你走在正确的轨道上。您只需在json
操作中执行以下操作:
public function json(SS_HTTPRequest $request) {
$f = new JSONDataFormatter();
$this->response->addHeader('Content-Type', 'application/json');
return $f->convertDataObject($this->dataRecord);
}
或者对于特定字段,您可以执行此操作:
public function json(SS_HTTPRequest $request) {
// Encode specific fields
$data = array();
$data['ID'] = $this->dataRecord->ID;
$data['Title'] = $this->dataRecord->Title;
$data['Content'] = $this->dataRecord->Content;
$this->response->addHeader('Content-Type', 'application/json');
return json_encode($data);
}
如果您将上述内容放在Page.php文件中的控制器内,而所有其他页面都扩展Page_Controller
,那么您应该可以转到http://mydomain/xxxx/json
并获取任何页面的JSON输出。
答案 1 :(得分:0)
Shane的答案很有帮助,但是我需要输出路线中的所有页面,而不仅仅是当前记录。
以下是我设法做到这一点的方法:
<?php
class Page_Controller extends ContentController {
private static $allowed_actions = [
'index',
];
public function init() {
parent::init();
// You can include any CSS or JS required by your project here.
// See: http://doc.silverstripe.org/framework/en/reference/requirements
}
public function index(SS_HTTPRequest $request) {
$results = [];
$f = new JSONDataFormatter();
foreach (Article::get() as $pageObj) {
$results[] = $f->convertDataObjectToJSONObject($pageObj);
}
$this->response->addHeader('Content-Type', 'application/json');
return json_encode($results);
}
}