2012-03-12 80 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