Silverstripe - 在模板中循环非关联数组

Posted

技术标签:

【中文标题】Silverstripe - 在模板中循环非关联数组【英文标题】:Silverstripe - Looping over non-associative array in template 【发布时间】: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 让模板吐出“这是一个测试”?

【问题讨论】:

【参考方案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 是没有意义的。

以上是关于Silverstripe - 在模板中循环非关联数组的主要内容,如果未能解决你的问题,请参考以下文章

是否可以在 SilverStripe 菜单中获取 Children of children?

在 SilverStripe 中创建导航时,$Menu 后面的数字是多少?

Silverstripe 3:如何按标题,日期等对CMS网站树中的页面进行排序

如何在 SilverStripe 4 CMS 中添加自定义样式

silverstripe 3 addFieldToTab“设置”

Silverstripe 3.2:如何在前端表单中动态添加和更新数据对象?