当我在Silverstripe中调用增量偏移方法时,为什么我的偏移不会增加?

时间:2014-03-16 16:09:48

标签: php silverstripe

我在Silverstripe项目中的模板文件中调用了IncrementOffset()方法。预期的结果是每次调用该方法时,私有偏移属性将增加1.偏移方法如下所示:

class NewPage extends Page {
    public function IncrementOffset() { $this->offset++; }
    public function ResetOffset() { $this->offset = 0; }
    public function Offset() { return $this->offset; }
}

在我的NewPage.ss模板中,我有以下代码:

<% loop $InfoPanels %>
    <% if not $Description %>
        <div class="span3">
            <h4 align="center">$Title</h4>
            <a href="{$ButtonURL}" target="blank"><div style="background: url('{$Image.SetSize(225, 225).URL}') no-repeat center center; width: 225px; height: 225px;" class="center3"></div></a>
            <a href="{$ButtonURL}" target="blank" class="btn btn-block">$ButtonLabel</a>
            </div>
        <% if $MultipleOf(3, $Top.Offset()) %>
            </div>
            <div class="row-fluid">
        <% end_if %>
    <% else %>
        $Top.IncrementOffset()
    <% end_if %>
<% end_loop %>
<p>Offset is: $Offset</p>

调用IncrementOffset()后,Offset打印的结果输出为:

  

偏移量为:0

有人可以告诉我,如果我在这里遗漏了一些明显的东西吗?我无法理解为什么这不起作用。对我来说似乎应该是这么简单。

1 个答案:

答案 0 :(得分:2)

因为模板变量在第一次访问时被缓存。

您的问题在模板的SilverStripe文档中解释,“副作用”部分

以下是您可能会发现有用的一些变量:

  • $Pos循环中的当前位置。将是1,2,3,4,5,......
  • $Pos(2) pos起点,如果我没记错,那将是2,3,4,5,6,......
  • $MultipleOf(3)应该在不传递第二个参数的情况下工作
  • $InfoPanels.Count件数

在评论中对话后编辑:

如果你想过滤掉一些项目,你应该在循环它们之前这样做:

在php中:

public function FilteredInfoPanels() {
    $dataList = $this->InfoPanels();
    // only get items of which the Description is not ''
    $dataList = $dataList->filter('Description:not', ''); 
    return $dataList;
}

在themplate中:

<% loop $InfoPanels %>
        <div class="span3">
            <h4 align="center">$Title</h4>
            <a href="{$ButtonURL}" target="blank"><div style="background: url('{$Image.SetSize(225, 225).URL}') no-repeat center center; width: 225px; height: 225px;" class="center3"></div></a>
            <a href="{$ButtonURL}" target="blank" class="btn btn-block">$ButtonLabel</a>
            </div>
        <% if $MultipleOf(3) %>
            </div>
            <div class="row-fluid">
        <% end_if %>
<% end_loop %>
<p>Number of filtered Panels is: $FilteredInfoPanels.Count</p>
<p>Number of Panels is: $InfoPanels.Count</p>