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