【问题标题】:Silverstripe - Looping over non-associative array in templateSilverstripe - 在模板中循环非关联数组
【发布时间】:2013-07-29 02:26:22
【问题描述】:

如何在模板中做到这一点?我已经使用 ArrayData 使用模板循环中的键来访问模板中的值,但是如果我有一个没有键的任意字符串数组,我应该使用什么变量来访问这些值?

如果在我的控制器中我有这个:

public function ArrayList()
{
    $ArrayList = new ArrayList(array('this', 'is', 'a', 'test'));
    return $ArrayList;
}

这在我的模板中:

<% loop $ArrayList %>1<% end_loop %>

我用什么代替 1 让模板吐出“这是一个测试”?

【问题讨论】:

    标签: php silverstripe


    【解决方案1】:

    据我所知这是不可能的,您需要将每个项目包装到一个 ArrayData 对象中

    public function ArrayList()
    {
        $ArrayList = ArrayList::create(array(
            ArrayData::create(array('Text' => 'this')),
            ArrayData::create(array('Text' => 'is')),
            ArrayData::create(array('Text' => 'a')),
            ArrayData::create(array('Text' => 'test')),
        ));
        return $ArrayList;
    }
    

    和模板:

    <% loop $ArrayList %>$Text<% end_loop %>
    

    // 注意:___::create() 是类固醇上的new ___()

    【讨论】:

    • 这是错误的。 ArrayData 包装不是必需的。 ArrayList 中的项可以是简单的关联数组。
    • 恐怕不是。是的,常规数组可以工作,但是我强烈建议不要使用它们,因为这实际上是不一致的处理,并且可能导致不同 SilverStripe 版本中不同甚至未定义的行为。 SilverStripe 4 alpha7 中仍然存在的一个例子是github.com/silverstripe/silverstripe-framework/issues/2636
    • 虽然我承认这一点:对于从事单个项目的个人开发人员来说,这个错误很可能永远不会发生,因此使用常规数组会起作用。
    【解决方案2】:

    您可以只使用$Me,而不是每次都创建一个新的ArrayData 实例。所以你会:

    public function ArrayList()
    {
        $ArrayList = new ArrayList(array('this', 'is', 'a', 'test'));
        return $ArrayList;
    }
    

    并且,在您的模板中:

    <% loop $ArrayList %>$Me<% end_loop %>
    

    $Me 引用循环中的当前项。在这种情况下,它将是数组中的字符串。

    【讨论】:

    • 不幸的是,这种解决方案在某些情况下会导致行为不一致,因此不可靠。在修复错误之前,我建议不要使用这种方法。有关详细信息,请参阅github.com/silverstripe/silverstripe-framework/issues/2636
    • 只有当你想访问字段时才重要。对于直字符串,必须为列表中的每个项目构造一个 ArrayData 是没有意义的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-07
    • 1970-01-01
    • 2019-03-07
    • 1970-01-01
    • 1970-01-01
    • 2014-02-16
    相关资源
    最近更新 更多