1

I'm trying to upload multiple files on Symfony but when the form is submitted the form image field returns a null object like this

object(Doctrine\Common\Collections\ArrayCollection)#1455 (1) {
  ["elements":"Doctrine\Common\Collections\ArrayCollection":private]=>
  array(1) {
    [0]=>
    object(AdminBundle\Entity\ImageNew)#1717 (5) {
      ["nom":"AdminBundle\Entity\ImageNew":private]=>
      NULL
      ["path":"AdminBundle\Entity\ImageNew":private]=>
      NULL
      ["idimage":"AdminBundle\Entity\ImageNew":private]=>
      NULL
      ["categorie":"AdminBundle\Entity\ImageNew":private]=>
      NULL
      ["file":"AdminBundle\Entity\ImageNew":private]=>
      NULL
    }
  }
}

But when I get files directly inside the request files attributes file exist. I've tried to upload a file by accessing the attribute in the request, it works but it still wants to upload file via Symfony $form request handler.

That's my controller

 public function addColorAction(Request $request, Article $article)
    {
        $couleur = new Couleur();
        $form = $this->createForm('AdminBundle\Form\CouleurType', $couleur);
        $form->handleRequest($request);

        if ($form->isSubmitted() && $form->isValid()) {

            $em = $this->getDoctrine()->getManager();

            $files = $couleur->getImages();

            echo "<pre>";
            var_dump($files); die;
            
            $imgs = $request->files->get("adminbundle_couleur")["images"];

            foreach ($imgs as $img) {
                $image = new ImageNew();
                $image->setFile($img["file"]);
                $image->upload();
                $couleur->addImage($image);

                $em->persist($image);
                $em->flush();
            }

            $color_art_dispo = new CouleurArticleDispo();
            $color_art_dispo->setEnStock(true);
            $color_art_dispo->setArticle($article);
            $color_art_dispo->setCouleur($couleur);
            
            $em->persist($couleur);
            $em->persist($color_art_dispo);
            $em->flush();

            return $this->redirectToRoute('article_index');
        }

        return $this->render(
            'admin/article/couleur/new.html.twig', array(
            'couleur' => $couleur,
            'form' => $form->createView(),)
        );
    }

The couleur entity

class Couleur
{
    /**
     * @var int
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var string
     *
     * @ORM\Column(name="nom", type="string", length=255)
     * @Assert\NotBlank(message="Veuillez entrer le nom de la couleur")
     */
    private $nom;

    /**
     * @var string
     *
     * @ORM\Column(name="code_couleur", type="string", length=6)
     * @Assert\NotBlank(message="Veuillez entrer le code couleur correspondant")
     * @Assert\Length(
     *     min=6,
     *     max=6,
     *     minMessage="Le code couleur n'est pas correct.",
     *     maxMessage="Le code couleur n'est pas correct.",
     * )
     */
    private $codeCouleur;

    /** 
     * 
     * @ORM\OneToMany(targetEntity="CouleurArticleDispo", mappedBy="_couleurs")
     */
    private $colorArticles;

    /**
     * Many Colors have Many Images.
     * 
     * @ORM\ManyToMany(targetEntity="ImageNew",cascade={"remove"})
     * @ORM\JoinTable(name="color_images",joinColumns={@ORM\JoinColumn(name="color_id",referencedColumnName="id", onDelete="CASCADE")},
     *      inverseJoinColumns={@ORM\JoinColumn(name="image_id", referencedColumnName="idimage", onDelete="CASCADE")}
     * )
     */
    private $images;

    public function __toString()
    {
        return (string) $this->getNom();
    }

    /**
     * Class Constructor
     */
    public function __construct() 
    {
        $this->images = new ArrayCollection();
    }
}

This is the image entity

class ImageNew
{
    /**
     * @var string
     *
     * @ORM\Column(name="nom", type="string", length=100)
     */
    private $nom;

    /**
     * @var string
     *
     * @ORM\Column(name="path", type="string", length=255)
     */
    private $path;

    /**
     * @var integer
     *
     * @ORM\Column(name="idimage",type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    private $idimage;

    /**
     * @var \AdminBundle\Entity\Categorie
     *
     * @ORM\ManyToOne(targetEntity="AdminBundle\Entity\Categorie",cascade={"persist"},inversedBy="slides")
     * @ORM\JoinColumns({
     *   @ORM\JoinColumn(name="id_categorie",referencedColumnName="idcategorie",nullable=true,onDelete="SET NULL")
     * })
     */
    private $categorie;

    /**
     * @Assert\NotNull()
     * @Assert\File(
     *     maxSize = "6000k",
     *     mimeTypes = {"image/png", "image/jpg", "image/bmp"},
     *     mimeTypesMessage = "Please upload a valid Image File (PNG, JPEG or BMP)"
     * )
     */
    private $file;

    public function __toString()
    {
        return (string) $this->getPath();
    }
}

and this is the couleur type

class CouleurType extends AbstractType
{
    /**
     * {@inheritdoc}
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('nom')
            ->add('codeCouleur')
            ->add(
                'images', CollectionType::class, 
                array(
                    'label' => 'Images de l\'article ayant cette couleur',
                    'entry_type' => ImageNewFileType::class,
                    'allow_add' => true,
                    'allow_delete' => true,
                )
            );
    }
}

and finally the image type

class ImageNewFileType extends AbstractType
{
    /**
     * {@inheritdoc}
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add(
            'file', FileType::class, 
            [
                'mapped' => false,
                'required' => false,
                'attr' => array(
                    'accept' => 'image/*',
                )
            ]
        );
    }
}

2 Answers 2

1

I think you shouldn't add the mapped => false option in the ImageNewFileType.

https://symfony.com/doc/current/reference/forms/types/form.html#mapped

As you can see in the documentation the field is ignored when writing to the object.

Sign up to request clarification or add additional context in comments.

2 Comments

look well on my question mapped => false option already been set on ImageNewFileTytpe.
your answer helped me to see that I should map true rather than false
1

the error was inside the ImageNewFileType, because of property 'mapped' => false, the form wasn't set uploaded files information in file field of ImageNew Entity, so I've replaced this :

class ImageNewFileType extends AbstractType
{
    /**
     * {@inheritdoc}
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add(
            'file', FileType::class, 
            [
                'mapped' => false,
                'required' => false,
                'attr' => array(
                    'accept' => 'image/*',
                )
            ]
        );
    }
}

by this:

class ImageNewFileType extends AbstractType
{
    /**
     * {@inheritdoc}
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add(
            'file', FileType::class, 
            [
                'mapped' => true(or live this empty because by default it is true),
                'required' => false,
                'attr' => array(
                    'accept' => 'image/*',
                )
            ]
        );
    }
}

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.