【问题标题】:How to group external API json data by date in silverstripe 3 template?如何在 silverstripe 3 模板中按日期对外部 API json 数据进行分组?
【发布时间】:2018-06-25 00:21:54
【问题描述】:

我可以使用 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')
);

谢谢。

【问题讨论】:

  • 您能否提供一个预期数据结构的示例?

标签: php json arraylist silverstripe


【解决方案1】:

鉴于你的数据是这样的:

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 的子类。

Grouping Lists in SilverStripe Docs

【讨论】:

  • 感谢您的代码,但我没有尝试此方法,因为 Robbie Averill 的代码在经过一些更改后对我来说确实可以完美运行。
【解决方案2】:

感谢您提供示例数据。

您可以使用嵌套的 ArrayList 来实现这一点。这比仅使用 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 %>

【讨论】:

  • ArrayList 上使用GroupedList 怎么样?那不是更简单吗?
  • @Robbie Averill,感谢您的代码,但在我的情况下,它给出了 [Notice] Trying to get property of non-object at $subList->List->push($result);跨度>
  • @wmk,您能否提供相同的 silverstripe 文档链接?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-02-20
  • 1970-01-01
  • 1970-01-01
  • 2018-10-16
  • 1970-01-01
  • 2019-03-05
  • 1970-01-01
相关资源
最近更新 更多