簡體   English   中英

如何在Silverstripe 3模板中按日期對外部API json數據進行分組?

[英]How to group external API json data by date in silverstripe 3 template?

我可以使用RestfulService從RestAPI讀取和顯示數據,但不能按日期值對這些數據進行分組。 我當前的代碼工作正常

$myList = ArrayList::create(); 
foreach ($jsonData['list'] as $result) {
   $myresult = $result;
   $myList->push($myresult);
}

我之前在DataObject上使用過GroupedList :: create(),但是如何將其與ArrayList一起使用。

例如當我在$ foreach中打印$ result時給出

Array('Id' => '123', 'Title' => 'foo', 'Date' => '2018-01-16')
Array('Id' => '124', 'Title' => 'bar', 'Date' => '2018-01-16')
Array('Id' => '125', 'Title' => 'foo-bar', 'Date' => '2018-01-16')

我需要分組

newArray['2018-01-16'][0] = array(

    Array('Id' => '123', 'Title' => 'foo', 'Date' => '2018-01-16'),
    Array('Id' => '124', 'Title' => 'bar', 'Date' => '2018-01-16'),
    Array('Id' => '125', 'Title' => 'foo-bar', 'Date' => '2018-01-16')
);

謝謝。

鑒於您的數據如下:

Array('Id' => '123', 'Title' => 'foo', 'Date' => '2018-01-16')
Array('Id' => '124', 'Title' => 'bar', 'Date' => '2018-01-16')
Array('Id' => '125', 'Title' => 'foo-bar', 'Date' => '2018-01-16')

正如Robbie Averill所述,您可以將其放入SilverStripe ArrayList中以進行處理。 當ArrayList實現SS_List接口時,您可以將ArrayList數據提供給GroupedList並按數據字段(在本例中為“日期”)分組。 在您的控制器中輸入以下內容:

/**
* @return GroupedList
**/
public function getGroupedAPIData() {

    $data = ....; //get your data...

    $myList = ArrayList::create($data);
    $groupedList = GroupedList::create($myList);

    return $groupedList;

}

注意:此GroupedList對象目前尚不知道如何對數據進行分組,我們可以使用GroupedBy方法在模板中進行配置。 它返回另一個可以循環調用的列表$Children

<% loop $GroupedAPIData.GroupedBy(Date) %>
    <h3>$Date</h3> 
    <ul>
        <% loop $Children %>
            <li>$Title ($ID)</li>
        <% end_loop %>
    </ul>
<% end_loop %>

如果您需要有關通過API消耗的數據的更多邏輯,則可以使用自定義邏輯將獲得的數據轉換為ViewableData的子類。

請參閱SilverStripe文檔中的分組列表

感謝您提供示例數據。

您可以使用嵌套的ArrayLists實現此目的。 這比僅使用PHP數組要稍微復雜一些,但這是一個示例:

$myList = ArrayList::create();
foreach ($jsonData['list'] as $result) {
    // Look for an existing holder list
    if (!$myList->find('Date', $result['Date'])) {
        // Create one
        $myList->push([
            'Date' => $result['Date'],
            'List' => ArrayList::create(),
        ]);
    }

    // Get the list now that we know it's there
    $subList = $myList->find('Date', $result['Date']);

    // Push the current result record into the grouped list
    $subList->List->push($result);
}
return $myList;

然后,您可以像這樣循環輸入模板:

<% loop $GetMyList %>
    <h2>{$Date.XML}</h2>
    <ul>
    <% loop $List %>
        <li id="{$Id.ATT}">{$Title.XML}</li>
    <% end_loop %>
    </ul>
<% end_loop %>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM