Silverstripe Iterator检查行是否已满

时间:2017-08-10 16:01:44

标签: php iterator grid silverstripe

我正在寻找一种有效的方法来检查循环内是否有一行(一行有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配置。

我希望在这种情况下得到你的见解,也许解决方案足够有效,但我总是愿意学习更有效的解决方案!

由于

1 个答案:

答案 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>