从 Symfony2 中的订阅者(表单事件)访问表单字段 [英] Accessing a form field from a subscriber (of a form event) in Symfony2
问题描述
我正在学习如何使用表单事件动态生成表单一>.我被困在 AddNameFieldSubscriber
的创建上:
I'm following the tutorial How to Dynamically Generate Forms Using Form Events. I'm stuck on the creation of AddNameFieldSubscriber
:
$subscriber = new AddNameFieldSubscriber($builder->getFormFactory());
我的问题很简单:FormFactory
如何访问和修改以前由 $builder
创建的任意表单字段?为什么我们要传递 FormFactory
而不是 $builder
本身?
My question is simple: how FormFactory
can access and modify an arbitrary form field previously created by the $builder
? And why we are passing the FormFactory
instead of the $builder
itself?
假设我们在 builder 中只有两个字段(name"和price"):
Assuming we have just two fields ("name" and "price") in the 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
(只是一个例子):
I'd like to set required = false
(just an example) in the subscriber:
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
}
}
推荐答案
我可能错了,但我不相信您可以在创建表单后更改其属性.但是,您可以添加到表单中.
I could be wrong about it this, but I don't believe you can change a form's attributes after its been created. However, you can add to the form.
不是在 ProductType::buildForm
中添加 'name' 字段,您可以将其推迟到订阅者:
Instead of adding the 'name' field in ProductType::buildForm
, you can defer this to the subscriber:
if (!$data->getId()) {
$form->add($this->factory->createNamed('text', 'name', null, array('required' => false)));
} else {
$form->add($this->factory->createNamed('text', 'name'));
}
这篇关于从 Symfony2 中的订阅者(表单事件)访问表单字段的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!