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 中添加自定义样式