2017-06-10 19 views
0

は、私は選択肢のリストを取得し、choicesオプションsymfonyのフォームイベント:私は、AJAXリクエストのフィールドでSELECT2を使用してsymfonyのフォームに取り組んでいますChoiceTypeフィールド戻りヌル予期せ

に与える PRE_SUBMITイベントに耳を傾けます
$opts = $config->getOptions(); 
$opts['choices'] = $listImages; //array of Image object 

しかし、私は、フォームで選択した値を取得し、閉鎖にそれを使用し、フィールドを永続化するとき、NULL値を持っているのvar_dumpでPRE_SUBMITイベントで ので、私はPOST_SUBMITイベントフィールドでのvar_dumpをやっています本当に値としてnullを持っています。

class ArticleType extends AbstractType 
{ 
    /** 
    * {@inheritdoc} 
    */ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder->add('image', ChoiceType::class, array(
      'expanded' => false, 
      'multiple' => false)) 
     //other field 
     ; 

     $formModifier = function (FormInterface $form, $image) use ($options) { 
     $listImages = $options['em']->getRepository('AlmotivAppBundle:Image')->findBy(array(
      'id' => $image 
     )); 

     if (!$listImages) { 
      $form->add('image')->addError(new FormError(
       'Nous n\'avons pas p trouver l\'image, veuiller choisir une autre' 
      )); 
     } 
     //die(var_dump($listImages)); //array of Image object 


     $config = $form->get('image')->getConfig(); 
     $opts = $config->getOptions(); 
     $opts['choices'] = $listImages; 
     $typeName = get_class($config->getType()->getInnerType()); 
     $form->add('image', $typeName, $opts); 
     //die(var_dump($form->get('image')->getConfig()->getData())); //return null 
    }; 

    $builder->get('image')->addEventListener(
     FormEvents::PRE_SUBMIT, 
     function (FormEvent $event) use ($formModifier) { 
      $image = $event->getData(); 
      //die(var_dump($image)); //return 10 
      $formModifier($event->getForm()->getParent(), $image); 
     } 
    ); 

と私はフレームワークのV3.1を使用しています:と私は

マイ以下にformType逃したものを見ていません。 もっと必要な方は尋ねてください。

答えて

0

このようで、完全に有効な値は、その時点で返されます。中に

PRE_SUBMITあなたが親フォームを取得し、OKである、$formModifierに渡します。しかし、その修飾は、とりわけ、以下のん:

$typeName = get_class($config->getType()->getInnerType()); 
$form->add('image', $typeName, $opts); 

あなたがすでに形成するが、それは完全に(データを含む)そのコンテキストを上書き再追加あなたにimageという名前のフィールドを持っていることが起こります。 Form.phpに覗き見を取るあなたには、あなたが表示されます:あなたは、フォームフィールドを重複したら、あなたはデータを取得できません、と述べた

Form.phpライン873

$this->children[$child->getName()] = $child; 

を。

は、なぜあなたはあなたがフィールドを再度追加した後にデータを取得する必要がありますか?

+0

DBにそれを保持するには、フィールドに 'ManyToOne'の関係があります。値が有効でないようなエラーが表示されない場合は、選択したオプションの値をDoctrineに渡す必要があります。私はあなたが建設後にフィールドの設定を変更することはできませんが、私は間違っている場合は私を修正することができますが、私はそれをやったと私はデータを失った知っているそれを上書きすることができます。今質問は、 'imagesList'を' $ options [choices] 'に渡してデータフィールドを失わないようにするにはどうすればいいですか? '' POST_SUBMIT'イベントで私が提出してしまった。私は再度追加フィールドiが閉鎖に '$のevent'を渡す際の問題の原因であると' $ event->のgetData()をやってないと思う –

+0

と@JovanPerovicデータは、その後、私はPRE_SUBMITイベントでフィールドを再度追加し、 '$ event->をgetForm()を実行したときに謎の事がある;' POST_SUBMITで私のイメージフィールドは 'null'なので値と私の他のフィールドが正しい値を持っています。どのように私はこれを処理できますか? –

+0

私はこの1を扱う2つの解決策を持っています。なぜなら、イメージが常にヌル値を持つ理由を理解できないので、フォームにデータを設定することです。 2 - 使用してunmappedイベントを使用してテキストの種類(私の記事のエンティティとのmanytoone関係を持っている原因画像)、考えている最良の方法ではない送信されたデータで私の画像フィールドを追加しますが、私は唯一のものです事は 'EntityType'と連携して、フィールドオプションに「選択肢」の可能性について渡すために、この場合' PRE_SUBMIT'と 'PRE_SET_DATA'で、フォームイベントを使用することですので、見つかった) –

関連する問題