如何在silverstripe 3模板中按日期对外部API json数据进行分组?

时间:2018-01-16 10:10:17

标签: php json arraylist silverstripe

我可以使用RestfulService从RestAPI读取和显示数据,但无法按日期值对此数据进行分组。 我目前的代码工作正常

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

之前我在DataObject上使用过GroupedList :: create(),但是我如何在ArrayList中使用它。

e.g。当我在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')
);

感谢。

2 个答案:

答案 0 :(得分:2)

鉴于您的数据如下:

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接口时,您可以将数据列表数据提供给GroupedList并按数据字段分组,在本例中为“Date”。在您的控制器中输入如下内容:

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

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

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

    return $groupedList;

}

注意:此GroupedList对象现在不知道如何对数据进行分组,我们可以使用GroupedBy方法在模板中对其进行配置。它返回另一个可以循环的List $Children

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

如果您需要更多关于通过API使用的数据的奇特逻辑,您可以使用自定义逻辑将您获得的数据转换为ViewableData的子类。

请参阅Grouping Lists in SilverStripe Docs

答案 1 :(得分:1)

感谢您提供示例数据。

您可以使用嵌套的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 %>