2015-12-08 53 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

更改了實際工作示例的答案 –