我有一个包含多个子模板的基本模板,代码运行如下:
<ul class="row portfolio list-unstyled mt-3 lightbox" id="grid">
<!-- summary section -->
{{ render(controller('App\\Controller\\ReadController::summary')) }}
{{ render(controller('App\\Controller\\BookController::random', {num: 3})) }}
{{ render(controller('App\\Controller\\WikiController::random')) }}
</ul><!-- / portfolio row -->
可以看出,这些“项目”按固定顺序显示:summary
先行,然后是3 random
,然后是random
。
我打算做的是“洗牌”这些项目(在上面的代码片段中,将有5个项目),以便每次刷新时顺序不同,以给最终用户一些变化。
这可以在Twig中做到吗?
更新
我使用@hcoat方法,它正在工作。稍后会尝试shuffle
过滤器。
答案 0 :(得分:2)
正如您在上述评论中所建议的那样,您可以使用Array Extension
或通过控制器发送它。我认为让控制器发送随机列表是可行的方法。
但是,有时使用标准树枝随机化列表很有用,在这种情况下,您可以执行以下操作:
// Path and pram Array, pass empty hash if no params
{% set arr = [
["App\\Controller\\ReadController::summary", {}],
["App\\Controller\\BookController::random", {'num': 3}],
["App\\Controller\\WikiController::random", {}]
] %}
// create a list and merge arr array with random key
{% set list = {} %}
{% for item in arr %}
// There is a bug in some twig verions
// so concat a letter to ensure random key works
{% set list = list|merge({ (random()~'a'):(item) }) %}
{% endfor %}
// sort the list by the random key and render the output
{% for key in list|keys|sort %}
{{ render(controller(list[key][0], list[key][1])) }}
{% endfor %}
现在子模板将以随机顺序呈现。