【问题标题】:Symfony : Dynamic add select box ( Add Dynamically select Language )Symfony:动态添加选择框(添加动态选择语言)
【发布时间】:2018-05-02 06:02:53
【问题描述】:

我正在寻找如何使用表单生成器实现动态选择语言的系统。

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

所以这个系统允许用户设置他可以说的语言,他的水平就可以了。

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

问题:

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

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

3- 树枝级别:我是否也应该对树枝进行一些更改?

那么在我的情况下,最好的解决方案是什么?

我的第一次尝试是:

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

但这不起作用,正如我在图片中提到的那样......谁有完美的解决方案?

【问题讨论】:

  • 你为什么不试试我的答案?我看到你已经编辑了你的问题,它看起来有点像我的答案,但重要的部分是不同的。您已经创建了语言列表和级别列表,但您应该将它们组合起来(我称之为 LanguageLevel)
  • @StephanVierkant:在 LanguageLevel 实体类中为什么要定义用户属性?有必要吗?
  • 是的,我想是的?请使用您的实体模型更新您的问题。我假设您有多个用户,他们可以有多个“语言级别”(荷兰语 - 良好,英语 - 中等,德语 - 初学者)。
  • 很高兴看到我的回答 helped you out。不要忘记接受我的回答。

标签: symfony doctrine-orm twig entity symfony-forms


【解决方案1】:

我认为你需要Collection of Forms

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

(..)

3- 树枝级别:我是否也应该对树枝进行一些更改?

(..)

4- Javascript 级别,我可以在输入干净时开发它 在 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,
             ),
        ));
    }
}

如果呈现的输出不是您想要的,请查看文档是否可以配置表单类型。可以针对特定情况手动更改树枝模板、控制器和/或 javascript,但我认为上面的“表单集合”将涵盖您的用例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-15
    • 1970-01-01
    • 2012-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多