我正在寻找一种有效的方法来检查循环内是否有一行(一行有12列)。
案例如下,我有一个可以容纳多个视频的页面类型。这些视频的列大小可能会有所不同。例如,第一个视频可以设置为12列,第二个视频可以设置为8,以下设置为4,等等。
我现在这样做的方式是:
<div class="row">
<% loop $MediaTest %>
<% if $Row %>
</div><div class="row">
<% else %>
<% include MediaBlock FixedRatio=true %>
<% end_if %>
<% end_loop %>
</div>
这会循环方法返回的数据
public function getMediaTest()
{
$out = new ArrayList();
$cols = 0;
foreach ($this->Media() as $mediaItem) {
$cols += $mediaItem->Size;
$out->push($mediaItem);
if ($cols >= 12) {
$cols = 0;
$row = new ViewableData();
$row->Row = true;
$out->push($row);
}
}
return $out;
}
但是我在质疑这个解决方案的效率,因为在将数据传递到下一个循环(在模板中)之前循环数据并进行更改。
我正在考虑使用我可以在循环中调用的方法SSViewer_BasicIteratorSupport
来扩展类Row()
。但是这个课程不可扩展。我也尝试了对类进行子类化并将其替换为Injector
配置。
我希望在这种情况下得到你的见解,也许解决方案足够有效,但我总是愿意学习更有效的解决方案!
由于
答案 0 :(得分:2)
我认为这种方法很好,因为它看起来像你在这里进行过早优化。
如果你真的遇到性能问题,你可以随时使用<% cached %>
块,只有在视频发生变化时才会更新,例如。类似的东西:
<div class="row">
<% cached 'mediablocks', $Media.max('LastEdited'), $Media.count() %>
<% loop $MediaTest %>
<% if $Row %>
</div><div class="row">
<% else %>
<% include MediaBlock FixedRatio=true %>
<% end_if %>
<% end_loop %>
<% end_cached %>
</div>