php-SilverStripe 3:如何按祖父母页面对已排序的数组进行分组

我试图遍历我的所有ProductPage,同时按祖父母的标题对它们进行分组(因为这是产品类别).我还要对每个组下的产品页面按其ProductReleaseDate降序进行排序.最后,如果可能的话,所有没有ProductReleaseDate的对象都将首先列在所有内容之前.

我在抓取所有产品页面的页面控制器中具有此功能:

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

然后在我的模板中:

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

这将按照给定的ProductReleaseDate降序显示我所有的产品页面标题.他们现在需要分组.

我一直在努力搜索,找不到合适的文档或示例来实现此目的.也许我需要groupBy?我不确定是否需要在控制器或模板中.

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

解决方法:

在SilverStripe 3.1中,我们可以使用GroupedList(您在问题中链接到的那个)进行操作.

要进行设置,我们首先需要对项目进行分组的依据.返回值的变量或函数.

在您的情况下,我们将设置一个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 %>
上一篇:c#-基于多个共享属性值的最小对象分组


下一篇:如何使用集合按Java中的对象分组?