4

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

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

我尝试向我的 CustomPage_Controller 类添加一个操作,如下所示:

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

但我无法弄清楚如何使这项工作:

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

2 回答 2

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 输出。

于 2013-07-04T05:21:38.807 回答
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);
    }
}
于 2017-06-07T05:06:47.810 回答