Symfony2 - 使用eventListener修改表单字段

时间:2013-04-12 08:46:11

标签: symfony

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

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

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

            }

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

感谢您的帮助

3 个答案:

答案 0 :(得分:23)

虽然最初的问题相当陈旧,但是请允许我将此保留在此处,以防其他人遇到更改字段的特定选项而无需再次复制所有选项的需要:

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

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

答案 1 :(得分:2)

你可以做的是覆盖原来的孩子。

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

            $form->add($this->factory->createNamed('name_to_override', 'choice', null,
                 array("choices" => array("choice"=>"value"))
                ));

        }

它对我有用。

注意:这只适用于PHP 5.4,因为在闭包中的$this在PHP 5.3中不可用。

答案 2 :(得分:0)

这里有一篇博文,通过整个动态表单来处理实体关系:http://aulatic.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