【问题标题】:Accessing a form field from a subscriber (of a form event) in Symfony2在 Symfony2 中从订阅者(表单事件)访问表单字段
【发布时间】:2012-03-28 11:54:00
【问题描述】:

我正在关注教程How to Dynamically Generate Forms Using Form Events。我被困在AddNameFieldSubscriber的创建上:

$subscriber = new AddNameFieldSubscriber($builder->getFormFactory());

我的问题很简单:FormFactory 如何访问和修改以前由$builder 创建的任意表单字段?为什么我们要传递 FormFactory 而不是 $builder 本身?

假设我们在 builder 中只有两个字段(“名称”和“价格”):

class ProductType extends AbstractType
{
    public function buildForm(FormBuilder $builder, array $options)
    {
        $subscriber = new AddProductTypeSubscriber($builder->getFormFactory());
        $builder->addEventSubscriber($subscriber);

        $builder->add('name');
        $builder->add('price');
    }

    public function getName() { return 'product'; }
}

我想在订阅者中设置required = false(只是一个例子):

class ProductTypeSubscriber implements EventSubscriberInterface
{
    private $factory;

    public function __construct(FormFactoryInterface $factory)
    {
        $this->factory = $factory;
    }

    public static function getSubscribedEvents()
    {
        return array(FormEvents::PRE_SET_DATA => 'preSetData');
    }

    public function preSetData(DataEvent $event)
    {
        $data = $event->getData();
        $form = $event->getForm();

        if (null === $data) return;

        // Access "name" field and set require = false
    }
}

【问题讨论】:

    标签: symfony symfony-forms


    【解决方案1】:

    我可能错了,但我不相信您可以在创建表单后更改其属性。但是,您可以添加到表单中。

    您可以将其推迟给订阅者,而不是在 ProductType::buildForm 中添加“名称”字段:

    if (!$data->getId()) {
        $form->add($this->factory->createNamed('text', 'name', null, array('required' => false)));
    } else {
        $form->add($this->factory->createNamed('text', 'name'));
    }
    

    【讨论】:

    • 这也是我的恐惧。我会进一步调查,但我认为完全一样......
    • 你找到方法了吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-12
    • 2018-04-19
    • 2017-11-18
    • 1970-01-01
    相关资源
    最近更新 更多