Форма Symfony2 не может определить, была ли отправлена сущность или загруженный файл

0

У меня есть форма PostType которая создает Entity, называемую Post Эта форма имеет встроенную PhotoType для объекта Photo.

В PhotoType Редактировать Post я обмениваюсь PhotoType для формы ImagePreviewType чтобы показать небольшой предварительный просмотр Photo и запретить любые изменения Photo.

Это прекрасно работает, но проблема заключается в том, что когда я PostType форму PostType создаю Post, похожее на старое Post. Форма отображается отлично, и я вижу Photo в ImagePreviewType но при $builder->getData() пуст, и я не ImagePreviewType снова выбрать ImagePreviewType чтобы от возврата к PhotoType и PhotoType загруженный файл, но получил объект и выдает ошибку.

Надеюсь, вы поймете мою проблему, вот мой источник с комментарием, где он терпит неудачу:

PostType:

<?php

namespace Socialised\FbPostingBundle\Form;

use Socialised\FbPostingBundle\Entity\Post;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
use Symfony\Component\Validator\Constraints\Url;
use Doctrine\ORM\EntityRepository;
use Socialised\FbPostingBundle\Form\Type\ImagePreviewType;
use Socialised\FbPostingBundle\Form\Type\VideoPreviewType;

class PostType extends AbstractType
{
    /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {


        $builder
            ->add('message', 'textarea', array(
                'required' => false,
                'label'    => 'form.label.message',
                'attr' => array('class' => 'variable photo text link video'),
            ))
            ->add('link', 'url', array(
                    'required' => false,
                    'label' => 'form.helptext.link.url',
                    'constraints' =>  new Url(),
                    'attr' => array('class' => 'variable link'),
                )
            )

        if ($builder->getData()->getPhoto() != null){  // <- This is where it fails
            /*               
                On submit of a new Entity $builder->getData() is empty, even thought data valid is submit.
                I'm unable to detect if an image was uploaded or the reference to an 'Photo' was send. So the wrong Form is selected.
            */           
            $builder->add('photo', new ImagePreviewType(), array(
                'label'    => 'form.label.photo',
                'horizontal_input_wrapper_class' => 'variable photo col-lg-8',
                'translation_domain' => 'SocialisedFbPostingBundle',
            ));
        }else{            
            $builder->add('photo', new PhotoType(), array(
                'required' => false,
                'label'    => 'form.label.photo',
                'horizontal_input_wrapper_class' => 'variable photo col-lg-8',
                'translation_domain' => 'SocialisedFbPostingBundle',
            ))
        }
    }

    /**
     * @param OptionsResolverInterface $resolver
     */
    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'Socialised\FbPostingBundle\Entity\Post',
            'translation_domain' => 'SocialisedFbPostingBundle',
            'show_legend' => false,
            'attr' => array(
                'class' => 'form-horizontal'
            ),
            'securityContext' => false
        ));
    }

    /**
     * @return string
     */
    public function getName()
    {
        return 'socialised_fbpostingbundle_post';
    }
}

PhotoType:

<?php
namespace Socialised\FbPostingBundle\Form;

use Socialised\FbPostingBundle\Entity\Post;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
use Symfony\Component\Validator\Constraints\Image;
use Symfony\Component\Validator\Constraints\File;

class PhotoType  extends AbstractType
{
    /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('file', 'file', array(
                    'required' => true,
                    'label' => false,
                    'constraints' => array(new Image(array(
                            'minWidth' => 200,
                            'minHeight' => 200,
                        )),
                        new File(array(
                            'maxSize' => '4096k',
                        ))
                    ),
                )
            )
        ;
    }

    /**
     * @param OptionsResolverInterface $resolver
     */
    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'Socialised\FbPostingBundle\Entity\Photo',
            'translation_domain' => 'SocialisedFbPostingBundle',
            'show_legend' => false,
        ));
    }

    /**
     * @return string
     */
    public function getName()
    {
        return 'socialised_fbpostingbundle_photo';
    }
}

ImagePreviewType:

<?php
namespace Socialised\FbPostingBundle\Form\Type;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
use Socialised\FbPostingBundle\Form\PhotoType;

class ImagePreviewType extends AbstractType
{
    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            //'class' => 'SocialisedFbPostingBundle:Photo',
            'data_class' => 'Socialised\FbPostingBundle\Entity\Photo',
            'property' => 'id',
            'by_reference' => false,
        ));
    }

    public function getParent()
    {
        return 'text';
    }

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

РЕШЕНИЕ:

Добавление этого кода в форму PostType похоже на трюк.

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

    if(is_numeric($data['photo'])){
        $form->add('photo', new ImagePreviewType(), array(
            'label'    => 'form.label.photo',
            'horizontal_input_wrapper_class' => 'variable photo link offer col-lg-8',
            'translation_domain' => 'SocialisedFbPostingBundle',
        ));
    }      

});
Теги:
forms

1 ответ

1
Лучший ответ

вы пытались использовать событие формы POST_SET_DATA?

http://symfony.com/doc/current/components/form/form_events.html

  • 0
    Я думаю, что я нашел решение с вашей помощью, я обновил вопрос и добавил решение, которое я придумал, похоже, сейчас он работает нормально.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню