php - 银条 3 : How to group a sorted array by grandparent pages

标签 php sorting grouping silverstripe

我试图遍历我所有的 ProductPage,同时按祖 parent 的头衔对它们进行分组(因为这是产品类别)。我还想按 ProductReleaseDate 降序对每个组下的产品页面进行排序。最后,如果可能的话,任何没有 ProductReleaseDate 的都列在所有内容之前。

我的页面 Controller 中有这个功能可以抓取所有产品页面:

function ProductPages() {
    $productPages = ProductPage::get();
    return $productPages ? $productPages : false;
}

然后在我的模板中:

<% loop $ProductPages.Sort(ProductReleaseDate, DESC) %>
    $Title
<% end_loop %>

这会按给定的产品发布日期降序显示我所有的产品页面标题。他们现在需要分组。

我一直在努力寻找,但找不到合适的文档或示例来解决这个问题。也许我需要 groupBy?我不确定它是否需要在 Controller 或模板中。

这可能有帮助,但我需要帮助:http://docs.silverstripe.org/en/developer_guides/model/how_tos/grouping_dataobject_sets/

最佳答案

在 SilverStripe 3.1 中,我们可以使用 GroupedList 来做到这一点,您在问题中链接到的那个。

要设置它,我们首先需要一些东西来对项目进行分组。返回值的变量或函数。

在您的情况下,我们将设置一个返回祖 parent 头衔的 get 函数。

ProductPage.php

class ProductPage extends SiteTree {

    public function getGrandParentTitle() {
        $parent = $this->Parent();
        if ($parent->Exists()) {
            $grandParent = $parent->Parent();
            if ($grandParent->Exists()){
                return $grandParent->Title;
            }
        }
        return '';
    }
}

然后我们需要添加一个返回 GroupedList 的函数。

Page.php

class Page extends SiteTree {

    public function getGroupedProducts() {
        return GroupedList::create(ProductPage::get()->sort('ProductReleaseDate', 'DESC'));
    }

}

最后,在我们的模板中,我们调用了 GroupedList 函数,并告诉它根据什么对项目进行分组。

您的模板

<% loop $GroupedProducts.GroupedBy(GrandParentTitle) %>
    <h3>$GrandParentTitle</h3>
    <ul>
        <% loop $Children %>
            <li>$Title</li>
        <% end_loop %>
    </ul>
<% end_loop %>

按父头衔分组

或者如果您想先按父页面标题排序,我们将设置一个返回父标题的 get 函数。

ProductPage.php

class ProductPage extends SiteTree {

    public function getParentTitle() {
        $parent = $this->Parent();
        if ($parent->Exists()) {
            return $parent->Title;
        }
        return '';
    }
}

然后在我们的模板中调用我们之前创建的 GroupedList 函数,但这次将 GroupedBy 设置为 ParentTitle

您的模板

<% loop $GroupedProducts.GroupedBy(ParentTitle) %>
    <h3>$ParentTitle</h3>
    <ul>
        <% loop $Children %>
            <li>$Title</li>
        <% end_loop %>
    </ul>
<% end_loop %>

关于php - 银条 3 : How to group a sorted array by grandparent pages,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30465208/

相关文章:

mysql - 分组方式

php - CakePHP 1.3 : $this->render() vs $this->element()

Java 流 : Add to map but avoid mutation

php - LINQ 表达式?

javascript - Jquery按数组中的元素值排序

matlab - 根据第二个矩阵中给定的顺序对矩阵进行排序 (MATLAB)

java - 这个数组偶数和奇数代码有什么问题?

mySQL,按日期分组数据

javascript - 将对象数组打印到 HTML 数据属性中

php - Laravel 5 - 重定向不起作用