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

问题描述 投票:2回答:2

我能够使用Restful Service从Rest API读取和显示数据,但无法按日期值对此数据进行分组。我目前的代码工作正常

$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')
);

谢谢。

php json arraylist silverstripe
2个回答
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接口时,您可以通过数据字段将ArrayList数据提供给GroupedList和group,在本例中为“Date”。在您的控制器中输入如下内容:

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

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

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

    return $groupedList;

}

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

<% 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
投票

感谢您提供示例数据。

您可以使用嵌套的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 %>
© www.soinside.com 2019 - 2024. All rights reserved.