Symfony2 - 使用eventListener修改表单字段

jro*_*ros 7 symfony

我想要帮助.我有一个带下拉列表的表单,我需要根据外部输入修改选项.我想它应该适用于eventListener

$builder->addEventListener(
            FormEvents::PRE_SET_DATA,
            function(FormEvent $event) use($input){
                $form = $event->getForm();

                // get existin form child
                // modify list of choices

            }
Run Code Online (Sandbox Code Playgroud)

我见过的所有示例都只使用FormEvents添加新字段,但我需要修改现有字段,但我不知道如何访问它.

感谢帮助

iva*_*cus 24

虽然最初的问题相当陈旧,但是让我把它留在这里,以防其他人遇到需要更改字段的特定选项而无需再次复制所有选项的情况:

<?php

$builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) {
    $form = $event->getForm();

    // Get configuration & options of specific field
    $config = $form->get('field_to_update')->getConfig();
    $options = $config->getOptions();

    $form->add(
        // Replace original field... 
        'field_to_update',
        $config->getType()->getName(),
        // while keeping the original options... 
        array_replace(
            $options, 
            [
                // replacing specific ones
                'required' => false,
            ]
        )
    );
});
Run Code Online (Sandbox Code Playgroud)

资料来源:https://github.com/symfony/symfony/issues/8513#issuecomment-21868035

  • 我有同样的问题,但使用Symfony 3.而不是`$ config-> getType-> getName()`使用`get_class($ config-> getType() - > getInnerType())`.这是因为Symfony 3要求类型为完全限定的类名. (11认同)
  • 请注意,如果您在现场有 modelTransformer,则此解决方案不起作用。 (2认同)

Luk*_*uke 0

这里有一篇博客文章,通过实体关系的整个动态形式进行工作:http://aumatic.16mb.com/wordpress/2011/08/symfony2-dynamic-forms-an-event-driven-approach/

Symfony 网站也有大部分记录,您只需要编写 ajax 代码和相应的控制器方法,这在上面的博客文章中完成: http ://symfony.com/doc/current/cookbook/form/dynamic_form_modification.html