You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Symfony嵌入式表单字段分位置展示问题求助

解决Symfony嵌入式翻译表单字段分位置渲染的问题

这个问题我之前也碰到过!Symfony表单组件默认会标记已渲染的字段,所以你没办法直接重复调用form_widget(form.translations)来分位置展示不同语言的字段。不过咱们可以换个思路——手动遍历翻译集合的每个条目,在表单的不同位置单独渲染对应语言的字段,具体操作如下:

核心思路

你的translations是一个CollectionType,它的children属性包含了所有语言对应的翻译表单条目。我们可以直接访问这些子条目,在需要的位置精准渲染每个条目的指定字段,而不是依赖整体的集合渲染。

修改后的Twig代码示例

{% form_theme form _self %}
{% block body %}
{{ form_start(form) }}
{{ form_errors(form) }}

{# 主实体的布尔字段 #}
<div>
    <div class="s12 m12 l12">
        {{ form_label(form.doubleBlock) }}
        {{ form_errors(form.doubleBlock) }}
        {{ form_widget(form.doubleBlock) }}
    </div>
</div>

{# 第一组:渲染第1种语言的title和subtitle #}
<div id="block-1">
    {% set lang1Translation = form.translations.children[0] %}
    <div class="s12 m6 l6">
        {{ form_label(lang1Translation.title) }}
        {{ form_errors(lang1Translation.title) }}
        {{ form_widget(lang1Translation.title) }}
    </div>
    <div class="s12 m6 l6">
        {{ form_label(lang1Translation.subtitle) }}
        {{ form_errors(lang1Translation.subtitle) }}
        {{ form_widget(lang1Translation.subtitle) }}
    </div>
</div>

{# 其他主实体字段 #}
<div>
    <div class="s12 m6 l6">
        {{ form_label(form.activedStyle) }}
        {{ form_errors(form.activedStyle) }}
        {{ form_widget(form.activedStyle) }}
    </div>
    <div class="s12 m6 l6">
        {{ form_label(form.checkoutOption) }}
        {{ form_errors(form.checkoutOption) }}
        {{ form_widget(form.checkoutOption) }}
    </div>
</div>

{# 第二组:渲染第2种语言的desc #}
<div id="block-2">
    {% set lang2Translation = form.translations.children[1] %}
    <div class="s12 m12 l12">
        {{ form_label(lang2Translation.desc) }}
        {{ form_errors(lang2Translation.desc) }}
        {{ form_widget(lang2Translation.desc) }}
    </div>
</div>

{# 提交按钮和未渲染的字段(确保所有字段都被处理) #}
{{ form_widget(form.save) }}
{{ form_rest(form) }}
{{ form_end(form) }}
{% endblock body %}

关键说明

  1. 直接访问子条目:通过form.translations.children[index]可以获取对应索引的翻译表单条目,这里假设你已经按语言顺序配置了集合的条目(比如索引0对应中文,索引1对应英文)。
  2. 避免重复渲染问题:这种方式每个字段只被渲染一次,不会触发Symfony表单的“已渲染”标记冲突,同时也能精准控制字段在表单中的位置。
  3. form_rest的作用:最后调用form_rest(form)可以确保所有没手动渲染的字段(比如集合的隐藏字段、_token、翻译条目的ID隐藏字段等)都被正确输出,避免表单提交出错。

进阶优化(可选)

如果你的语言数量不固定,或者想更灵活地按语言标识(比如enzh)来渲染,可以在FormType中给每个翻译条目绑定实体的locale属性,然后在Twig中通过遍历判断来渲染:

{% for translation in form.translations.children %}
    {% if translation.vars.data.locale == 'zh' %}
        {# 渲染中文的title和subtitle #}
        <div class="s12 m6 l6">
            {{ form_label(translation.title) }}
            {{ form_errors(translation.title) }}
            {{ form_widget(translation.title) }}
        </div>
    {% elseif translation.vars.data.locale == 'en' %}
        {# 渲染英文的desc #}
        <div class="s12 m12 l12">
            {{ form_label(translation.desc) }}
            {{ form_errors(translation.desc) }}
            {{ form_widget(translation.desc) }}
        </div>
    {% endif %}
{% endfor %}

这样就能完全根据你的需求,把不同语言的翻译字段分散到表单的任意位置展示啦!

内容的提问来源于stack exchange,提问作者Rubix

火山引擎 最新活动