You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Symfony 6表单集合报错后移除链接消失问题解决

解决Symfony 6集合表单错误后移除链接消失的问题

问题根源:表单错误重新渲染时,服务器端生成的已有集合条目没有包含Remove链接,且原有JS只给动态新增的条目绑定删除功能,未处理页面加载时已存在的条目。

修复步骤

1. 修改Twig模板,为每个集合条目添加Remove链接

原来的模板直接渲染整个form.items集合,导致结构错误且没有Remove链接。改为遍历每个条目,手动添加Remove按钮:

{{ form_start(form) }}
{% if form_errors(form) %}
<div class="rounded-md p-2 border-red-300 bg-red-50 border mb-4">{{ form_errors(form) }}</div>
{% endif %}
<div>
    <ul class="items"
        data-index="{{ form.items|length > 0 ? form.items|last.vars.name + 1 : 0 }}"
        data-prototype="{{ form_widget(form.items.vars.prototype)|e('html_attr') }}">
        {% for item in form.items %}
            <li class="item">
                {{ form_label(item) }}
                {{ form_widget(item) }}
                {{ form_errors(item) }}
                {# 为每个已有条目添加Remove链接 #}
                <a href="#" class="remove">Remove</a>
            </li>
        {% endfor %}
    </ul>
</div>

<button type="submit" class="block w-full shadow-sm border-transparent bg-indigo-600 hover:bg-indigo-700 dark:bg-indigo-500 dark:hover:bg-indigo-400 text-white rounded-md border p-2 mt-4 mb-2">{{ 'Save'|trans }}</button>

{{ form_end(form)}}

2. 更新JavaScript,处理页面加载时的已有条目和新增条目

原有JS只处理动态新增的条目,现在需要添加初始化逻辑,给页面加载时已存在的Remove链接绑定删除事件,同时保留新增条目的功能:

const addTagLink = document.createElement('a')
addTagLink.classList.add('add')
addTagLink.href = '#'
addTagLink.innerText = 'Add'
addTagLink.dataset.collectionHolderClass = 'items'

const collectionHolder = document.querySelector('ul.items')
collectionHolder.appendChild(addTagLink)

// 通用函数:绑定所有Remove链接的删除事件
const bindRemoveLinks = () => {
    document.querySelectorAll('.remove').forEach(link => {
        // 先克隆节点避免重复绑定事件
        const newLink = link.cloneNode(true);
        link.replaceWith(newLink);
        
        newLink.addEventListener('click', (e) => {
            e.preventDefault();
            // 找到当前条目并移除
            newLink.closest('.item').remove();
        });
    });
};

// 页面加载完成后,初始化已有条目的删除功能
document.addEventListener('DOMContentLoaded', bindRemoveLinks);

const addFormToCollection = (e) => {
    e.preventDefault();
    const collectionHolder = document.querySelector('.' + e.currentTarget.dataset.collectionHolderClass);

    const item = document.createElement('li');
    item.classList.add('item');

    // 插入原型模板
    item.innerHTML = collectionHolder
        .dataset
        .prototype
        .replace(/__name__/g, collectionHolder.dataset.index);

    // 给新条目添加Remove链接
    const removeLink = document.createElement('a');
    removeLink.href = '#';
    removeLink.innerText = 'Remove';
    removeLink.classList.add('remove');
    item.appendChild(removeLink);

    collectionHolder.appendChild(item);
    collectionHolder.dataset.index++;

    // 重新绑定所有删除链接(包括新增的)
    bindRemoveLinks();
}

addTagLink.addEventListener("click", addFormToCollection)

关键说明

  • Twig遍历集合条目:确保服务器端渲染的每个条目都自带Remove链接,解决表单错误刷新后无链接的问题。
  • 通用绑定函数:统一处理页面加载时的已有条目和动态新增条目,避免重复绑定事件导致的异常。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 20:42:01