我来自Rails的背景,正在PHP 7.1上的Silverstripe 3.7项目中工作,我需要对模板进行更改以解决列对齐问题。
如果我在Rails中进行此更改,则模板中的代码可能如下所示:
<% items = ['item1', 'item2', 'item3, 'item4'] %>
<% len = items.length %>
<% mod = len % 3 %>
<% items.each_with_index do |item, index| %>
<% if mod != 0 && mod == len-index %>
<div class="col-sm-4 col-sm-offset-<%= 6 - (mod*2) %>">
<% else %>
<div class="col-sm-4">
<% end %>
<% end %>
在发现似乎无法在模板中进行数学运算之前,我在Silverstripe中尝试了以下操作:
<% loop $ProductSectionBlocks %>
<% if $TotalItems % 3 != 0 && $TotalItems % 3 == $FromEnd %>
<div class="col-sm-4 col-sm-offset-{6 - (($TotalItems % 3) * 2)}">
<% else %>
<div class="col-sm-4">
<% end_if %>
<% end_loop %>
我已经读过here,“您应该在包含逻辑的对象上创建一个方法并对其进行调用。”但是我不确定如何将这种建议应用于这种情况。
我怀疑最终结果是这样的:
function ProductSectionBlocksMod() {
return ProductSectionBlocks.length % 3;
}
function ProductSectionBlocksOffset() {
return 6 - (ProductSectionBlocksMod * 2);
}
<% loop $ProductSectionBlocks %>
<% if $ProductSectionBlocksMod != 0 && $ProductSectionBlocksMod == $FromEnd %>
<div class="col-sm-4 col-sm-offset-{$ProductSectionBlocksOffset}">
<% else %>
<div class="col-sm-4">
<% end_if %>
<% end_loop %>
有人能指出我正确的方向来实现Silverstripe方式吗?
答案 0 :(得分:1)
下面的代码应该可以工作。
模板:
<div class="row">
<% loop $ProductSectionBlocks %>
<% if $Top.ProductSectionBlocksMod != 0 && $Top.ProductSectionBlocksMod == $FromEnd %>
<%-- Bootstrap ^4 offset --%>
<%--<div class="col-sm-4 offset-sm-{$Top.ProductSectionBlocksOffset}">--%>
<%--Bootstrap 3 offset--%>
<div class="col-sm-4 col-sm-offset-{$Top.ProductSectionBlocksOffset}">
Column #{$Pos}
<% else %>
<div class="col-sm-4">
Column #{$Pos}
<% end_if %>
</div>
<% end_loop %>
</div>
PageController:
public function getProductSectionBlocks()
{
return Page::get()->limit(5); // Replace 'Page' with your real DataObject
}
public function ProductSectionBlocksMod()
{
return ($this->getProductSectionBlocks()->count() % 3);
}
public function ProductSectionBlocksOffset()
{
return 6 - ($this->ProductSectionBlocksMod() * 2);
}