带有has_one数据的SilverStripe GroupedList

时间:2015-11-06 02:22:45

标签: silverstripe

我正试图弄明白这一点,我觉得我在思考它。

所以我已经构建了2个DataObjects(品牌,产品)和1个Controller / Page(ProductType)。

  • ProductType有很多产品
  • 产品有一个品牌
  • 产品有一个ProductType
  • 品牌有很多产品

我要做的是:

ProductType页面应该提供仅由该类型的产品使用的品牌列表。

现在我有一个有点工作,但它感觉hacky和不太便携。示例如下:

ProductType Controller:

public function getBrands() {

        if($products = $this->Products()) {
            $group = GroupedList::create($products->sort('BrandID'))->GroupedBy('BrandID');
        }

    }

产品类型模板:

<% if Brands %>
    <ul>
        <li><a href="{$Link}">All</a></li>
        <% loop Brands %>
            <% loop Children.Limit(1) %>
                <li><a href="{$Top.Link}brand/{$Brand.URLSegment}">$Brand.Title</a></li>
            <% end_loop %>
        <% end_loop %>
    </ul>
<% end_if %>

我有没有办法在ProductType控制器中构建一个方法,该方法只返回该类型产品所使用的品牌的DataList?

使用Silverstripe 3.1.3

如果我需要更清楚一些事情并感谢,请告诉我!

1 个答案:

答案 0 :(得分:1)

啊,我猜你对GroupedList有误解

您已拥有此产品类型的所有产品的Datalist。

它是has_many关系

$这 - &GT;产品()

现在您想按BrandID对当前产品进行分组。您的方法命名可能会令人困惑,所以让我们重命名一下:

public function getProductsGroupedByBrands() {

    if($products = $this->Products()) {
        $group = GroupedList::create($products->sort('BrandID'))
            ->GroupedBy('BrandID');
    }

}

因此,在您的模板中,您可以循环使用GroupedList。

<% if Products %>
    <ul>
        <li><a href="{$Link}">All</a></li>
        <% loop ProductsGroupedByBrands %>
            <li>
                <%-- here you should be able to see the grouping relation --%>
                <a href="{$Top.Link}brand/{$Brand.URLSegment}">$Brand.Title</a>


                <%-- in doubt use the First element to get the current Brand, it's a has_one -->
                <% with $Children.First %>
                    <a href="{$Top.Link}brand/{$Brand.URLSegment}">$Brand.Title</a>
                <% end_with %>
                <ul>

                <% loop Children %>
                <%-- here are the products grouped by brand --%>
                    <li>$Title</li>
                <% end_loop %>
                </ul>
            </li>
        <% end_loop %>
    </ul>
<% end_if %>

另见Silverstripe Docs or Grouping Lists