用于多语言实体关系的带有 collectionType 的嵌入式表单

Embedded forms with collectionType for multilingual entity relationships

我正在尝试在 Symfony 中创建一个带有嵌入式表单的系统,以便保留一个名为 Menu 的实体和一个名为 MenuTranslation 的相关实体。

Menu 具有以下属性:

id, type, title, position, menuTranslations

MenuTranslation 具有以下属性:

id, title, slug, lang, pages, menu

关系是 ManyToOne,其中 MenuTranslation 是拥有的部分,Menu 是反转的部分。换句话说,菜单翻译将属于一个菜单menu item 可能有很多 menutranslations items.

当我按照官方文档中描述的嵌入式表单CollectionType的一些教程进行操作时,假设我们将添加使用 javascript 的无限数量的嵌入表单,因此附加了 addremove 按钮。

但就我而言,我的目标是能够嵌入langs[中定义的语言一样多的子形式 =60=] table 在数据库中。我需要在“新”表单中创建此类子表单,而无需通过 javascript.

添加它们

我尝试了不同的解决方案,例如 自定义 表单呈现,但因为我只能打印一次表单而陷入死胡同。如果我尝试 循环 langs 数组以便根据需要呈现尽可能多的子表单,我会遇到以下错误,从编程设计的角度来看这是有意义的,但帮助不大达到我的目标。

An exception has been thrown during the rendering of a template ("Field "title" has already been rendered, save the result of previous render call to a variable and output that instead.").

我的 menuType.php 文件包含以下代码:

->add('menuTranslations', CollectionType::class,[
                'entry_type'=> MenuTranslationType::class,
                'entry_options' =>[
                    'label' => false
                ],
            ])

我的 menuTranslationsType.php 文件包含以下内容:

->add('title', TextType::class)
            ->add('slug', TextType::class)
            ->add('lang', HiddenType::class,[
                'data' => $lang,
            ])
            ->add('pages', EntityType::class,[
                'class' => Pages::class,
                'choice_label' => 'title',
                'multiple' => false,
                'expanded' => false,
            ])

呈现此表单的 twig 模板如下:

{{ form_start(form) }}
{{ form_row(form.type) }}
{{ form_row(form.title) }}
{{ form_row(form.position) }}

{% for lang in langs %}
     {{ lang.name }}
     {% for menuTranslation in form.menuTranslations %}
         {{ form_row(menuTranslation) }}
     {% endfor %}
{% endfor %}
{{ form_end(form) }}

我想知道什么是最好的方法。我考虑过使用一些翻译包,但我没能按照我想要的方式实现,而且关于我遇到的错误的文档也很少。

我认为你应该在你的控制器中处理它:

$menu = new Menu();

foreach($langs as $lang) {
    $menuTranslation = new MenuTranslation();
    $menuTranslation->setLang($lang);
    $menu->addMenuTranslation($menuTranslation);
}

$form = $this->formFactory->create(MenuType::class, $menu);