我正试图弄明白这一点,我觉得我在思考它。
所以我已经构建了2个DataObjects(品牌,产品)和1个Controller / Page(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
如果我需要更清楚一些事情并感谢,请告诉我!
答案 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 %>