用于多语言实体关系的带有 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 的无限数量的嵌入表单,因此附加了 add 和 remove 按钮。
但就我而言,我的目标是能够嵌入与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);
我正在尝试在 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 的无限数量的嵌入表单,因此附加了 add 和 remove 按钮。
但就我而言,我的目标是能够嵌入与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);