2015-12-08 51 views
1

我试图将'AbsoluteLink'属性添加到DataList中的每个DataObject,然后使用JSONDataFormatter::convertDataObjectSet()将列表转换为JSON。SilverStripe convertDataObjectSet正在剥离其他属性

我有以下功能:

public function json() { 
    $data  = ResourceCentreArticlePage::get()->filter('ShowInMenus', '1')->filter('ShowInSearch', '1')->sort('Created', 'DESC'); 
    $pageArray = new ArrayList(); 

    foreach ($data as $page) { 
     $page->AbsoluteLink = $page->AbsoluteLink(); 
     $pageArray->push($page); 
    } 

    // If I dump out the content of $pageArray here the object has the AbsoluteLink property 

    $jsonFormatter = new JSONDataFormatter(); 
    $jsonData  = $jsonFormatter->convertDataObjectSet($pageArray); 

    // If I dump out the content of $jsonData here there is no AbsoluteLink property 

    $this->response->addHeader("Content-type", "application/json"); 

    return $jsonData; 
} 

问题:

的AbsoluteLink属性通过convertDataObjectSet方法运行$pageArray后除去。

我错过了什么?

+1

凡你有意见'//如果我倾倒了$ pageArray的内容在这里没有AbsoluteLink property'你的意思是,如果你倾倒了$ jsonData的评论,或者是从$ pageArray实际丢失数据你说? –

+0

啊好拿起来,那的确是为了$ jsonData,现在就会更新。 – nickspiel

回答

1

使用$jsonFormatter->setCustomAddFields();将在这里帮助。

以下添加到Page类:

public function getMyAbsoluteLink() { 
    return $this->AbsoluteLink(); 
} 

例如到page.php文件:

class Page extends SiteTree { 
    public function getMyAbsoluteLink() { 
     return $this->AbsoluteLink(); 
    } 
} 

,并使用 “魔术场” 是这样的:

public function json() { 
    $pages = Page::get() 
     ->filter('ShowInMenus', '1') 
     ->filter('ShowInSearch', '1') 
     ->sort('Created', 'DESC'); 

    $jsonFormatter = new JSONDataFormatter(); 
    // add your custom field 
    $jsonFormatter->setCustomAddFields(["MyAbsoluteLink"]); 
    $jsonData = $jsonFormatter->convertDataObjectSet(
     $pages 
    ); 

    return $jsonData; 
} 

请注意$jsonFormatter->setCustomAddFields(["MyAbsoluteLink"]);,我删除了数组操作。

另外我删除了你的数组操作。 convertDataobjectSet函数的工作原理似乎不能在运行之前修改对象。

+0

该字段参数将只返回指定的字段。如果我添加AbsoluteLink这个对象回来空:$ jsonFormatter-> convertDataObjectSet($的数据,阵列( 'AbsoluteLink')); – nickspiel

+0

是的,该函数只返回文档中指定的字段,但作为一个案例,它应该工作。 funcion AbsoluteLink()不遵循约定,所以它会直接工作。你需要一个以公共函数getMyMagicMethod开头的方法。例如注意一开始。如果我没有记错的话。无论如何回到我的工作电脑上,所以我可能有时间开启一个真实的工作示例。 –

+0

更改了实际工作示例的答案 –