2014-02-18 2 views
7

Я пытаюсь получить данные, хранящиеся во вложенной форме, но при вызове $builder->getData() я всегда получаю NULL.

Кто-нибудь знает, как получить данные внутри вложенной формы?

Вот ParentFormType.php:

 
    class ParentFormType extends AbstractType 
    { 
     public function buildForm(FormBuilderInterface $builder, array $options) 
     { 
      $builder->add('files', 'collection', array(
       'type'   => new FileType(), 
       'allow_add'  => true, 
       'allow_delete' => true, 
       'prototype'  => true, 
       'by_reference' => false 
      ); 

FileType.php

 
    class FileType extends AbstractType 
    { 
     public function buildForm(FormBuilderInterface $builder, array $options) 
     { 

//Each one of bellow calls returns NULL 
print_r($builder->getData()); 
print_r($builder->getForm()->getData()); 
die(); 
      $builder->add('file', 'file', array(
                'required'  => false, 
                'file_path'  => 'file', 
                'label'   => 'Select a file to be uploaded', 
                'constraints' => array(
                 new File(
                  array(
                   'maxSize' => '1024k',   
                  ) 
                 ) 
                ) 
       ) 
      ); 
     } 

     public function setDefaultOptions(\Symfony\Component\OptionsResolver\OptionsResolverInterface $resolver) 
     { 
      return $resolver->setDefaults(array()); 
     } 

     public function getName() 
     { 
      return 'FileType'; 
     } 
    } 

Спасибо!

+0

Какие данные вы пытаетесь получить? –

+0

Данные ребенка, в этом случае это объекты ArrayCollection of File. Кроме того, я бы сказал, что реальная проблема заключается в том, что я не могу получить доступ к данным из расширения поля формы формы i, которое отлично работает для родительских форм, но, как это происходит в приведенном выше примере, я не могу получить доступ к вложенной форме данные. – user846226

ответ

-1

Форма построена, прежде чем данные связаны (то есть связанные данные не доступны в то время, AbstractType::buildForm() называется)

Если вы хотите, чтобы динамически строить свою форму на основе связанных данных, вы» должен будет использовать событие

http://symfony.com/doc/2.3/cookbook/form/dynamic_form_modification.html

+0

Привет, я действительно пытаюсь получить доступ к файлам FileType.php внутри расширения формы, но у меня есть точная проблема, так как whiel пытается получить доступ к данным из FileType.php. Это расширение отлично работает для не вложенных форм. – user846226

+1

Кроме того, почему вызов getData() внутри родительской формы не вызывает проблем? Для меня это выглядит как непоследовательное поведение. – user846226

+0

Вы можете получить данные на этом этапе, см. Https://github.com/symfony/symfony/blob/2.4/src/Symfony/Component/Form/FormConfigInterface.php#L165. –

5

Вы должны использовать FormEvents :: POST_SET_DATA, чтобы получить объект формы:

 $builder->addEventListener(FormEvents::POST_SET_DATA, function ($event) { 
      $builder = $event->getForm(); // The FormBuilder 
      $entity = $event->getData(); // The Form Object 
      // Do whatever you want here! 
     }); 
2

Это (очень раздражает ..) известная проблема:

https://github.com/symfony/symfony/issues/5694

Поскольку он работает отлично для простой формы, но не для соединения формы. Из документации (см. http://symfony.com/doc/master/form/dynamic_form_modification.html) вы должны:

$builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) { 
     $product = $event->getData(); 
     $form = $event->getForm(); 

     // check if the Product object is "new" 
     // If no data is passed to the form, the data is "null". 
     // This should be considered a new "Product" 
     if (!$product || null === $product->getId()) { 
      $form->add('name', TextType::class); 
     } 
    }); 
Смежные вопросы