2017-06-10 66 views
0

我的工作,我用選擇2場中爲AJAX請求symfony的形式,我聽PRE_SUBMIT事件得到選項列表,分給choices選項Symfony的形式事件:ChoiceType場返回NULL意外

$opts = $config->getOptions(); 
$opts['choices'] = $listImages; //array of Image object 

,但在我的var_dump得到的形式選擇的值,並且在封閉使用它,而當持續領域擁有空值PRE_SUBMIT事件,所以我在POST_SUBMIT事件現場做的var_dump具有真正的價值。而且我看不出有什麼我錯過

我下面FormType:

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。 如果你需要更多的問題。

回答

0

這似乎是完全有效的價值,將在該時間點返回。

PRE_SUBMIT期間,您會獲得父窗體並將其傳遞給$formModifier,這沒什麼。但是,修改將執行以下操作,其中包括:

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

這種事,你已經有一個字段中指定image在你的形式,但重新添加它完全覆蓋其上下文(包括數據)。在你採取偷看到Form.php,你會看到:

form.php的線873

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

這就是說,一旦你重疊表單字段不能檢索數據。

爲什麼在重新添加字段後需要檢索數據?

+0

要堅持它在數據庫中,該字段有一個'ManyToOne'關係,所以我需要將選定的選項的值傳遞給Doctrine,如果我沒有收到類似於該值無效的錯誤。正如我所看到的,施工後您無法更改字段的配置,如果我錯了,請糾正我,但您可以覆蓋它,以便我做到了,並知道我丟失了數據。現在的問題是如何將'imageList'傳遞給'$ options [options]'而不會丟失數據字段? –

+0

和@JovanPerovic我不認爲重新添加字段是一個問題原因,當我傳遞'$ event'到閉包並執行'$ event-> getData();'在'POST_SUBMIT'事件中我得到了提交數據,然後我重新添加字段在PRE_SUBMIT事件,而神祕的事情是做'$ event-> getForm();'在POST_SUBMIT我的圖像字段有'空值'和我的其他字段有正確的價值。我該如何處理? –

+0

我有兩個解決方案來處理這1-是設置數據在自己的形式,因爲我不明白爲什麼圖像總是有空值。 2-使用未映射,然後與事件添加我的圖像字段與文本類型的提交數據(這不是最好的方式,我認爲(原因圖像與我的文章實體有很多關係),但是我唯一找到) –