如何在Silverstripe模板中执行数学运算?

时间:2018-12-11 02:34:03

标签: silverstripe

我来自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方式吗?

1 个答案:

答案 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);
}
相关问题