Rob*_*ill 6 php api silverstripe
我有一个相对简单的设置,使用SilverStripe 3.2.1与restfulserver插件运行,并使用各种小部件,这些小部件使用元素插件与页面相关联.
当我通过API发出GET请求以检索页面#1的一些数据时,我可以看到相关的ElementAreaID:
# GET /api/v1/Page/1.json?fields=Title,URLSegment,Content,ElementArea
{
"Title": "Welcome",
"URLSegment": "home",
"Content": "A bunch of HTML here from all the widgets in the page...",
"ElementArea": {
"className": "ElementalArea",
"href": "http://ss.local:3000/api/v1/ElementalArea/11.json",
"id": "11"
}
}
Run Code Online (Sandbox Code Playgroud)
如果我通过ElementalArea API调用跟踪链接,它将列出我页面中的所有元素:
# GET /api/v1/ElementalArea/11.json
{
"ID": "11",
"Widgets": [
{
"className": "Widget",
"href": "http://ss.local:3000/api/v1/Widget/9.json",
"id": 9
},
{
"className": "Widget",
"href": "http://ss.local:3000/api/v1/Widget/8.json",
"id": 8
},
...
]
}
Run Code Online (Sandbox Code Playgroud)
如果我遵循这些API路径,它将提供每个窗口小部件的最新版本的内容.
我的问题是如何在原始页面字段列表中包含Widget DataObjects中的某些字段?
理想情况下,我希望将每个Widget的Content字段返回到具有初始Page API请求的数组中.
以供参考:
ElementArea
ElementArea
有很多Widget
小号Widget
包含我想要的内容Page
前言:目前似乎没有一种方法可以使用 RESTful 服务器模块输出类似数组的数据结构(当然关系除外)。所提出的解决方案是一种滥用JSONDataFormatter
格式输出方式的黑客行为。
由于JSONDataFormatter
用于forTemplate
在将字段转换为 JSON 之前渲染字段,因此我们可以创建自己的对象渲染器,通过forTemplate
. 这可能看起来像这样:
class FlatJSONDataList extends ViewableData
{
protected $list;
public function __construct(array $list)
{
parent::__construct();
$this->list = $list;
}
public function forTemplate()
{
return $this->list;
}
}
Run Code Online (Sandbox Code Playgroud)
然后在您的页面中,有一个附加方法就足够了,如下所示:
public function getWidgetContents()
{
return FlatJSONDataList::create(
$this->ElementArea()->Widgets()->column('Content')
);
}
Run Code Online (Sandbox Code Playgroud)
然后您可以包含WidgetContents
在您的字段列表中以获取Content
数组中的所有小部件字段:
GET /api/v1/Page/1.json?fields=Title,URLSegment,Content,WidgetContents
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
124 次 |
最近记录: |