2012-03-12 120 views
2

我正在按照教程How to Dynamically Generate Forms Using Form Events。我卡上创建AddNameFieldSubscriber在Symfony2中从订阅者(表单事件的)访问表单字段

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

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

假设我们在建设者只有两个字段( “name” 和 “价格”):

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 
    } 
} 

回答

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')); 
} 
+0

这也是我的恐惧。我会进一步调查,但我认为一样... – Polmonino 2012-03-12 13:52:35

+0

你有没有找到一种方法来做到这一点? – d0001 2013-09-17 00:03:37