Symfony:动态添加选择框(添加动态选择语言)

时间:2017-11-18 15:50:32

标签: forms symfony doctrine-orm twig entity

我正在搜索如何使用表单构建器实现动态选择语言的系统。

Form example

所以我们必须有两个html数组输入字段:name =“languages []”,第二个将是name =“languges_level []”

因此,该系统允许用户设置他可以用他的关卡进行讲话的语言。

用户可以在提交表单之前动态添加/删除语言。

问题:

1-表单级别:字段表单类型是什么?我必须添加2个表单字段,这些字段将被组合以创建我的结果数组,该数组将存储在数据库中。因此,这两个字段不会与ORM映射。

->add('langues', TYPEXXX:class) 
->add('langues_level', TYPEXXX:class)

3- Twig等级:我是否应该在树枝上做一些改变?

那么在我的案例中最好的解决方案是什么?

我的第一次尝试是:

->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'      => ' ',
    ),
));

但是这不像我在图片中提到的那样工作..谁有一个完美的解决方案?

1 个答案:

答案 0 :(得分:1)

我认为你需要一个Collection of Forms

  

所以我们必须有两个html数组输入字段:name =" langues []"和   第二个是name =" langes_level []"

     

(..)

     

3- Twig等级:我是否应该在树枝上做一些改变?

     

(..)

     

4- Javascript Level,我可以在输入干净时开发它   在html中创建。

不,不,不。描述你的数组输入字段'如果您正在使用像Symfony这样的框架,那么应该准确地命名是不正确的心态。描述您的实体字段,描述您的表单字段,Symfony将为所有表单元素命名。 Symfony Forms将为您呈现和处理表单,因此(很可能)不需要打扰表单元素名称的确切内容。

您的实体类:

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:

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,
             ),
        ));
    }
}

如果渲染的输出不是您想要的,请检查文档是否可以配置表单类型。手动更改树枝模板,您的控制器和/或特定情况的javascripts是可能的,但我认为'表格集合'从上面将涵盖您的用例。