SilverStripe 3.1:将列表分成垂直列(可变长度)

SilverStripe 3.1: Divide list into vertical columns (variable length)

这听起来像是一个简单的问题,但我有点难过。

我试过使用 Modulus 和 MultipleOf https://docs.silverstripe.org/en/3/developer_guides/templates/syntax/ 但这给了我一个水平的列表。我想要两列第一列包含我列出的数据对象的前半部分,第二列包含后半部分。

使用 CSS 不起作用,因为它会拆分内容并忽略 li 容器,因此我的一些列表项(每个列表项有多行)被分开。 https://www.w3schools.com/Css/css3_multiple_columns.asp

真的,我只想找到中间数据对象并使用 html / css 对其进行划分。欢迎任何建议。

这是我的列表示例,它显示 4 个项目,第 1 列将包含项目 1 和 2 以及第 2、3 和 4 列(实际列表可以是任意长度):

5 月 11 日 - 下午 7:30 - POWERSTOCK 小屋,DT6 3TB 售票处:01935 873555 / 网站 门票:£10.00/£8.00

2 月 13 日 - 地点 贝德福德 售票处:01234 354321 / 网站

3 月 14 日 - 预览:地点 贝德福德 售票处:01234 354321 / 网站

4 月 18 日 - 奇尔韦尔艺术中心 比斯顿

您需要一个自定义迭代器属性。您已经通过核心向您提供了 $First$Last$Middle,但是 $Middle 并没有达到大多数人的期望。中值迭代不是 return true,它只是第一个和最后一个之间的任何值,这通常没有帮助。

class MyIteratorProperties implements TemplateIteratorProvider
{   
    protected $totalItems;

    protected $pos;

    public static function get_template_iterator_variables()
    {
        return ['Median'];
    }

    public function iteratorProperties($pos, $totalItems)
    {
        $this->pos = $pos;
        $this->totalItems = $totalItems;
    }

    public function Median()
    {
        return $this->pos == floor($this->totalItems/2);
    }

}

还有你的模板:

<% $loop $SomeItems %>
    <% if $Median %></div><div ...><% end_if %>
<% end_loop %>