如何在Twig中切换Symfony表单Choice类型的expanded属性值?
没问题,咱们完全可以在Twig层面搞定这个需求,不用折腾控制器。下面给你两种实用的实现思路:
方案1:渲染表单时手动传入控制参数
这种方式最灵活,你可以在不同页面渲染表单字段时,直接指定expanded属性的值:
首先,在需要显示单选框的页面里,这样渲染字段:
{{ form_widget(form.your_target_field, { 'expanded': true }) }}
而在需要下拉框的页面里,改成:
{{ form_widget(form.your_target_field, { 'expanded': false }) }}
如果你的字段用了自定义局部模板(比如form/custom_choice.html.twig),那可以在局部模板里先判断传入的参数,再分支渲染:
{# form/custom_choice.html.twig #} {% block custom_choice_widget %} {# 先判断是否传入了expanded参数,没传就用默认值false #} {% set is_expanded = expanded is defined ? expanded : false %} {% if is_expanded %} {# 渲染单选框组 #} {% for option in form %} <div class="radio-item"> {{ form_widget(option) }} {{ form_label(option) }} </div> {% endfor %} {% else %} {# 渲染下拉选择框 #} <select {{ form_attr(form) }}> {% for option in form %} {{ form_widget(option) }} {% endfor %} </select> {% endif %} {% endblock %}
这样每次调用局部模板时,只要传个参数就能切换显示类型,非常直观。
方案2:根据页面上下文自动判断
如果不想每次渲染都手动传参,也可以根据当前页面的路由、参数等上下文自动决定显示方式。比如通过当前路由来判断:
在你的局部模板里加入逻辑:
{# form/custom_choice.html.twig #} {% block custom_choice_widget %} {# 获取当前页面的路由名称 #} {% set current_route = app.request.attributes.get('_route') %} {# 指定哪些路由显示单选框,其他路由显示下拉框 #} {% set is_expanded = current_route in ['app.product_detail', 'app.checkout'] ? true : false %} {# 下面的渲染逻辑和方案1一致 #} {% if is_expanded %} {% for option in form %} <div class="radio-item"> {{ form_widget(option) }} {{ form_label(option) }} </div> {% endfor %} {% else %} <select {{ form_attr(form) }}> {% for option in form %} {{ form_widget(option) }} {% endfor %} </select> {% endif %} {% endblock %}
这种方式适合固定某些页面必须显示单选框的场景,一劳永逸不用手动传参。
另外要注意:如果你的FormType类里已经给字段设置了expanded的默认值,Twig里传递的参数会直接覆盖这个默认值,不用担心冲突问题。
内容的提问来源于stack exchange,提问作者Will Ward
相关产品推荐
相关产品推荐

