Silverstripe:CMS页面为JSON?

时间:2013-07-04 00:28:33

标签: php json api silverstripe

我正在开发Silverstripe项目,我希望有一种简单的方法可以将CMS生成的页面(或页面的子类型)的内容呈现为JSON。

理想情况下,我想在路径末尾添加“/ json”,或通过post(json = true)发送参数并获取JSON格式的响应。

我尝试在我的CustomPage_Controller类中添加一个动作,如下所示:

public static $allowed_actions = array('json');
public function json(SS_HTTPRequest $request) {
    // ...
}

但我无法弄清楚如何做到这一点:

  • 我应该使用什么网址/路由?
  • 如何获取页面内容?

2 个答案:

答案 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);
    }
}