2012-03-12 4 views
2

私はチュートリアルHow to Dynamically Generate Forms Using Form Eventsに従っています。私はAddNameFieldSubscriberの作成にこだわっている:symfony2の(フォームイベントの)サブスクライバからのフォームフィールドへのアクセス

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

私の質問は簡単です:FormFactoryが以前$builderによって作成された任意のフォームフィールドにアクセスして変更することができますか?なぜ$builderの代わりにFormFactoryを渡しているのですか? 加入者に私はrequired = false(単なる例)を設定したいと思い

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

:我々はビルダーでちょうど2つのフィールド(「名前」と「価格」)を持っていると仮定すると、

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

+0

あなたはこれを行う方法を見つけましたか? – d0001

関連する問題