2016-07-08 12 views
4

Symfonyプロジェクトでは、いくつかのフォームで動作するForm EventSubscriberがあります。FormFieldにFormEvent内のオプションを渡す

すでに入力されている各フィールドを無効にすることを目指しています。私が使用して加入者に

$childOptions = $child->getConfig()->getOptions(); 

私が子供のためにすべての解決のオプションを受け取るには、私は、フォームの構築時に渡されたものだけを取得したいです。 (いくつかのFormType(i.o. DocumentType)を作成するので、解決されたすべてのオプションを再投入することはできません。そのいくつかは問題を引き起こします)。

  • AにformType例:

  • サブスクライバ:

    class ChangesSubscriber implements EventSubscriberInterface 
    { 
        // Disables filled inputs 
        public function postSetData(FormEvent $event) 
        { 
         $form = $event->getForm(); 
    
         foreach($form->all() as $child) 
         { 
          $childName = $child->getName(); 
          $childType = $child->getConfig()->getType()->getName(); 
    
          // Here I receive all resolved options 
          // But I only want the options passed above during 'buildForm' ('class','choice_label') : 
          $childOptions = $child->getConfig()->getOptions(); 
    
          if(!$child->isEmpty()){ 
           $form->add($childName,$childType,array_merge($childOptions,array('disabled'=>true))); 
          } 
         } 
        } 
    } 
    

これは多くのユースケースの一例であり、別の例があり得る: Alsatian\FormBundle ExtensibleSubscriber

- > AJAXが選択肢/団体/文書タイプの選択肢を提出させるための書式作成者。 現時点では、わかりましたが、解決されたオプションをいくつか選択することにしましたが、私はこの解決策に満足していません。

+0

グローバルフォームではなく、フィールド自体にサブスクライバを追加する必要があります。 $ builder-> get( "entity") - > addEventSubscriber($ this-> changesSubscriber) 'を実行します。それに応じて加入者を編集する必要があります。おそらくもうループする必要はありません。 – VaN

+0

サブスクライバが子供の上にいるとき、私は子供を '再作成'できません。そして、オプションを編集して '無効'を追加することはできません。 – Alsatian

+0

サブスクライバの代わりにフォームタイプ拡張を使用することを検討しましたか? – Heah

答えて

1

あなたのアプローチを変更する必要があるように思えます。

多分カスタムフォームタイプを作成し、そのオプションのいくつかは、CollectionTypeと同様に元のタイプを作成するオプションにする必要があります。タイプがデータをリッスンし、何をすべきかを決定するイベントを追加することができます

->add('entity', AjaxType::class,array( 'ajax_type' => EntityType:class, 'ajax_options' => [ 'class' => 'AppBundle:User', 'choice_label' => 'username', ] ))

多分それは少しこのようになります。

+0

これは良い考えですが、私はこのような種類のフォームイベントを使って、FormType(テキスト、選択肢、エンティティ、ドキュメントなど)の各タイプを変更しています。だから私はsymfonyに機能要求を書いたのです。フォームの作成中にどこかに保存されていれば、 'passed'オプションを直接取得するほうが簡単です。 – Alsatian

関連する問題