2016-11-03 6 views
1

私のシナリオは 表示順序付きのエンティティ(モジュール)を作成する必要があり、トピックエンティティおよび関連正しく作られたフォームロード時に、トピックのドロップダウンと表示順のドロップダウンがモジュール名に沿って空白になります。トピックを選択すると、表示順にajax/jsを介してオプションが設定されます。表示順序は、特定のトピック+ 1の下の合計モジュールになる数字に1になります。次回の表示順序が自動的に選択されます。そしてそれは完璧に働いています。しかし、私の問題は、提出後の表示順序の検証に関するものです。その「この値は無効です」と言っています。私はこれがフォームタイプの配列として '選択肢'を与えないことが原因であると理解していますが、この場合はフォームタイプで静的なものとして与えることはできません。誰もが解決策を知っているのを助けてください。 enter image description heresymfony3 - ajax経由で追加するオプションのドロップダウンの選択タイプに 'この値は無効です'を表示

class ModuleType extends AbstractType { 

/** 
* @param FormBuilderInterface $builder 
* @param array $options 
*/ 
public function buildForm(FormBuilderInterface $builder, array $options) { 
    $builder 
      ->add('topic', EntityType::class, [ 
       'class'   => 'AppBundle:Topic', 
       'choice_label' => 'name', 
       'placeholder' => 'Choose a Topic' 
      ]) 
      ->add('name') 
      ->add('description', TextareaType::class) 
      ->add('displayOrder', ChoiceType::class) 
      ->add('save', SubmitType::class, [ 
       'attr'  => ['class' => 'form-control button btn-sm nomargin'] 
      ]) 
    ; 

} 

/** 
* @param OptionsResolver $resolver 
*/ 
public function configureOptions(OptionsResolver $resolver) { 
    $resolver->setDefaults(array(
     'data_class' => 'AppBundle\Entity\Module' 
    )); 
} 

}

+1

FormEventを使用して、 'displayOrder'を選択して、' topic'オプションを選択するのに適していると思います。 Symfonyのフォームイベントの詳細:https://symfony.com/doc/current/form/events.html –

答えて

0

イベントリスナを使用してみてください。 exempleのためのあなたの場合は

// TopicType.php 
private function addEventListener(FormBuilderInterface $builder) 
{ 
     // this function permit to valid values of topics 
    $annonymFunction = function(FormInterface $form, $diplayOrder) { 
     $entities = $this->container->get('doctrine.orm.default_entity_manager') 
        ->getRepository('YourBundle:Topic') 
        ->findAll(); 
     if ($entities) { 
      $topics = array(); 

      foreach($topics as $topic) { 
       $topics[$topic->getName()] = $topic->getName(); 
      }  
     } 
     else $topics = null; 

     $form->add('topic', EntityType::class, array(
      'attr' => array('class' => 'topic'), 
      'choices' => $topics)); 
    }; 

    $builder 
     ->get('displayOrder') 
     ->addEventListener(FormEvents::POST_SUBMIT, function(FormEvent $event) use ($annonymFunction) { 
       $annonymFunction($event->getForm()->getParent(), $event->getForm()->getData()); 
     }); 
} 

希望がお手伝いします。

関連する問題