je souhaite télécharger plusieurs images d'un coup ave un formulaire imbriqué. j'ai une entité product avec un formulaire productForm , ce formulaire contient un champ productImageColors qui est de type collectionType. lorsque je telecharge plusieurs imges ,toutes les image apparaissent dans les charges utiles de la requete dans l'inspecteur mais coter controller je ne recois qune seul image au lieu de recevoir toutes les images comment faire sil vous plait

ProductType

class ProductsType extends AbstractType
{
  public function buildForm(
          FormBuilderInterface $builder, 
          array $options, 
          ): void
      {
      $builder
      ->add('productImageColors', CollectionType::class, [
                  'entry_type' => ProductImageColorsType::class,
                  'allow_add' => true,
                  'allow_delete' => true,
                  'by_reference' => false,
                  'entry_options' => [
                      'required' => false,
                  ],
              ])
          ;
      }

      public function configureOptions(OptionsResolver $resolver): void
      {
          $resolver->setDefaults([
              'data_class' => Products::class,
          ]);
      }
}

ProductImageColorsType

class ProductImageColorsType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options): void
    {
        $builder
            ->add('imageFile', FileType::class, [
                'required' => false,
                'multiple' => true,
                'mapped' => false,
                'attr' => [
                    'class' => 'product-color-input',
                    'accept' => '.webp,.png',
                    'multiple' => 'multiple'
                    // data-maxFileSize'=> 2097152,//in bytes (2MB)
                ],
                'constraints' => [
                    new All(['constraints' => [
                        new NotBlank([
                            'message'=>'Importez une image'
                        ]),
                        new File([
                            'maxSize' => '5M',
                            'mimeTypes' => [
                                'image/png',
                                'image/webp',
                            ],
                            'mimeTypesMessage' => 'Le fichier doit être une image au format png ou webp.',
                            'maxSizeMessage' => 'L\'image est trop volumineuse. Limite:{{ limit }}',
                        ]),
                    ]])
                ],

            ])
        ;
    }

    public function configureOptions(OptionsResolver $resolver): void
    {
        $resolver->setDefaults([
            'data_class' => ProductImageColors::class,
        ]);
    }
}

ProductController

#[Route('/ajouter/{id<\d+>?}', name: 'app_products_new', methods: ['GET', 'POST'])]
    public function create(
        Request $request,
        ?Collections $collection =  null, 
        FormErrorsCatcherService $formErrorsCatcherService,
        CategoriesRepository $categoriesRepository,
        RepositoryService $repositoryService): JsonResponse|Response
    {

        $product = new Products();
        /**
         * @var Form
         */
        $form = $this->getForm($product);
        $form->handleRequest($request);
        $formErrorMessage = $formErrorsCatcherService->getErrorMessage($form);

        if($form->isSubmitted() && $form->isValid()) {
            if(null === $collection){
                /**
                 * @var Collections
                 */
                $collection = $form->get("collection")->getData();
                if(null === $collection){
                    $this->addFlash('danger', 'Ooops! Une erreur s\'est produit.');
                    return $this->redirectToRoute('app_products_new', [], Response::HTTP_SEE_OTHER);
                }
            }
            $event = new ProductEvent($product, $repositoryService, ['form'=>$form,'collection'=>$collection]);
            $this->eventDispatcherInterface->dispatch($event, ProductEvent::PRODUCT_CREATE);
            $this->addFlash('success', 'Nouveau produit ajouté à la collection'.' '.$collection->getName().'.');
            return new JsonResponse(['success' => true]);
        }
        if($form->isSubmitted() && !$form->isValid()){
            return new JsonResponse(['success' => false,'causes' => $formErrorMessage]);
        }

        return $this->render('products/new.html.twig', [
            'form' => $this->getForm($product)->createView(),
            'collection_id' => $collection ? $collection->getId() : "",
            'product_categories' => $categoriesRepository->findAll(),
        ]);
    }
protected function getForm(Products $products): FormInterface|Form
    {
        // dd($request->request);
        if($products){
            if($products->getProductImageColors()->isEmpty()) {
                $productColors = new ProductImageColors();
                $productColors->setProduct($products);
                $products->getProductImageColors()->add($productColors);
            }
        }
        return $this->createForm(ProductsType::class, $products);
    }

Twig

{% for imageColors in form.productImageColors %}
      {{ form_widget(imageColors.imageFile) }}
 {% endfor %}

1 réponse


Il faut que tu parcours chaque image dans une boucle foreach comme dans mon projet :


$offer->setCreatedAt(new \DateTimeImmutable());
            //dd($offerRepository->generateReference());
            //On rajoute les images
            $images = $form->get('images')->getData();
            foreach($images as $image){
                //définir le dossier de destination
                $folder = 'cars';

                //Appel du Service PictureService.php
                $file = $pictureService->add($image,$folder,800,600);

                $img = new Images();
                $img->setName($file);
                $offer->addImage($img);

            }
            $entityManager->persist($offer);
            $entityManager->flush();
            return $this->redirectToRoute('app_offers_index', [], Response::HTTP_SEE_OTHER);
        }

oui mais le souci cest que je recoi dans mon controller qu'une seule images parmi toutes les images envoyé cette correspond a la prmiere image de la liste d'image , du coup que je fasse une boucle ou pas, se sera une seule et la meme image qui sera envoyé