首页 > 解决方案 > Symfony / Twig:过滤器过滤集合

问题描述

新手来了 使用 Symfony 3.4。

我有一个使用表单生成器创建的 EntityType 表单类型的集合。我正在尝试有选择地将它们存放在页面上。我想在我的模板上循环遍历它们几次,根据特定标准(例如,“HiddenType”子类型的值)吐出其中的一些。

例如,假设我有一个电影集合,其中一些具有“评级”隐藏类型。我的任务是在几个单独的“评级”部分(即一个部分中的所有 R 级电影)有选择地吐出它们。

编辑:但是!评级是用户估算的;在别处动态生成。所以我不能只提前制作有限数量的“部分”。

我的第一个想法是

{% for rating in ratings %}
   <h1>{{rating}}-Rated Movies</h1>
   {% for movie in form.movies %}
       {% if movie.rating = "R" %}
           {{movie}} // put movie formtype/ collection member here somehow...?
       {% endif %}
    {% endfor %}
{% endfor %}

但我也读到树枝有一个“过滤器”过滤器:

{% for rating in ratings %}
   <h1>{{rating}}-Rated Movies</h1>
    {% for movie in movies|filter(m=> m.rating == rating) -%}
        {{ m }} //put movie formtype/ collection member here somehow...?
    {% endfor %}
{% endfor %}

但是,无论哪种方式,我都无法真正协调我熟悉的用于将表单转换为实际 html(例如form_row())的函数与这些方法中的任何一种。

有任何想法吗?

标签: symfonyfiltertwig

解决方案


您需要按评分在表单中订购电影。然后在您的模板中执行以下操作:

{% set rating = null %}

{% for movieForm in form.movies %}
    {% set movie = movieForm.vars.value %} <= check if this is the movie entity by dumping it
    {% if movie.rating != rating %}
        <h1>{{ movie.rating }}</strong>
        {% set rating = movie.rating %}
    {% endif %}
    {{ form_row(movieForm) }}
{% endfor %}

推荐阅读