问题描述
我正在搜索如何使用表单生成器来动态选择语言的系统。
I'm searching how to implement a system of choosing languages dynamically using form builder.
所以我们必须有两个html数组输入字段:name = languages [ ],第二个将是name = languges_level []
so we must have two html array inputs field : name="languages[]" and the second will be name="languges_level[]"
因此,该系统允许用户设置可以在其级别上使用的语言。
So this system allows the user to set the language which he can speak with his level on it.
用户可以在提交表单之前动态添加/删除语言。
The User can add/remove Language dynamically before he submits the Form.
问题:
1-表单级别:字段表单类型是什么?我必须添加2个表单字段,将它们组合起来以创建将存储在数据库中的结果数组。因此,这两个字段不会与ORM映射。
1- Form Level : what will be the field form type? I have to add 2 form fields which will be combined to create my result array which will be stored in the database. So this two field will be not mapped with ORM.
->add('langues', TYPEXXX:class)
->add('langues_level', TYPEXXX:class)
3-树枝级别:应该我也会在树枝上做一些更改吗?
3- Twig Level: should i make some change in the twig as well?
那么我的情况下最好的解决方案是什么?
So what will be the best solution in my case?
我的第一次尝试是:
->add('languages', CollectionType::class, array(
'entry_type' => ChoiceType::class,
'entry_options' => array(
'choices' => array(
'Français' => 'Français',
'English' => 'English',
'Italien' => 'Italien',
'Espanish' => 'Espanish',
),
'label' => ' ',
),
))
->add('language_levels', CollectionType::class, array(
'entry_type' => ChoiceType::class,
'entry_options' => array(
'choices' => array(
'Beginner' => 'Beginner',
'Medium' => 'Medium',
'Good' => 'Good',
),
'label' => ' ',
),
));
但是这不起作用,正如我在图片中提到的..谁有一个完美的解决方案plz?
but this don't work as I mentioned in the picture .. who had a perfect solution plz ?
推荐答案
我认为您需要。
(..)
3-树枝级别:我也应该对树枝进行一些更改吗?
3- Twig Level: should i make some change in the twig as well?
(..)
4- Javascript级别,当在HTML中创建的输入是干净的
时,我可以进行开发。
4- Javascript Level, i can develop it when the inputs are clean created in the html.
不,不,不。如果您使用的是Symfony之类的框架,那么正确地描述数组输入字段的命名方式是不正确的。描述您的实体字段,描述您的表单字段,Symfony将为所有表单元素命名。 Symfony Forms将为您呈现和处理表单,因此(很有可能)不必理会表单元素名称的确切含义。
No, no and no. Describing how your 'array input fields' should be named exactly is not the right mentality if you're using a framework like Symfony. Describe your entity fields, describe your form fields and Symfony will give all form elements a name. Symfony Forms will render and handle the form for you, so there is (very likely) no need to be bothered what the form element names are exactly.
您的实体类:
class LanguageLevel
{
protected $user;
protected $language;
protected $level;
//getters and setters
}
创建表格类型:
class UserType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('languages', CollectionType::class, array(
'entry_type' => LanguageLevelType::class,
'allow_add' => true,
));
}
}
和LanguageLevelType:
And a LanguageLevelType:
class LanguageLevelType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('language', LanguageType::class)
->add('level', ChoiceType::class, array(
'choices' => array(
'Good' => 5,
'Bad' => 1,
),
));
}
}
如果渲染的输出不是您想要的,请检查文档,如果您可以配置表单类型。可以为特定情况手动更改树枝模板,控制器和/或JavaScript,但我认为上面的表单集合将涵盖您的用例。
If the rendered output is not what you want, check the documentation if you can configure the Form Types. Manually changing the twig template, your controller and/or javascripts for a specific case is possible, but I think the 'Collection of Forms' from above will cover your use case.
这篇关于Symfony:动态添加选择框(添加动态选择语言)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!