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 %}