如何“洗牌”包括从树枝

时间:2018-01-27 00:58:55

标签: symfony twig

我有一个包含多个子模板的基本模板,代码运行如下:

<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过滤器。

1 个答案:

答案 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 %}

现在子模板将以随机顺序呈现。