Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Symfony|Collection] ajouts à la volée plus liés

[Symfony|Form|CollectionType]

Sujet résolu
    11 février 2023 à 2:02:07

    Bonsoir,

    Je bidouille un site que j'ai passé sous Symfony 6.2 depuis probablement la 6.0 (et de PHP 7.4 à 8.1), et là je constate quelque chose de plutôt frustrant.

    Pour une partie de gestion de matériel pour laquelle l'objet exact n'est pas important, mais j'aimerais quand même savoir qui a quoi, j'ai quelque chose comme suit dans mon contrôleur.

    $form = $this
        ->createFormBuilder($formData, [
            'action' => $this->generateUrl($_route, $routeParams),
        ])
        ->add('provisions', CollectionType::class, [
            'entry_type' => $entryType,
            'by_reference' => true,
            'label' => 'app.fields.' . $source . '.provisions.label',
            'prototype' => true,
            'allow_add' => true,
            'allow_delete' => true,
            'entry_options' => [
                'label' => false,
            ],
        ])
        ->getForm();
    ;
    

    Les variables ne sont pas de l'obfuscation volontaire, le formulaire est un peu dynamique selon le provisionnement de plusieurs objets à une personne ou d'un objet à plusieurs personnes en même temps.

    Au niveau client, le formulaire s'affiche, je peux lui ajouter et supprimer des éléments, à la soumission je vois bien tout partir dans la requête et le serveur reçoit bien tout, l'objet $request dans le contrôleur contient les valeurs, et elles ont bien été passées "en POST".

    Mais.

    Après $form->handleRequest($request);, je ne récupère rien. $formData est vide.

    Si je mets un objet retourné par la classe sous-jacente à $entryType dans $formData avant de le passer en paramètre (donc une valeur par défaut, même vide), je récupère les données d'un unique élément de la collection, en l'occurrence le premier dans les données envoyées, indépendamment de l'index utilisé. C'est tout. Il me faudrait donc ajouter des valeurs par défaut vides pour autant de valeurs que j'ai voulu saisir, ce qui, pour une collection qui est extensible, n'est pas pratique.

    J'ai joué avec by_reference, étant donné que là j'ai un tableau comme "structure principale" et non un objet comme plus couramment, mais cela ne semble rien changer.
    allow_add est bien à true.

    Dans le même projet, j'ai des collections sur un formulaire dont la structure sous-jacente est une entité, et cela ne pose pas de problème apparent, je peux ajouter à la volée des éléments à la collection et ceux-ci sont bien récupérés.

    Est-ce que je suis le seul à constater ce comportement ? Est-ce que cela pourrait être lié à un changement de comportement de PHP entre les versions 7.4 et 8.1 ? J'avoue ne pas avoir creusé plus que cela tant le code du composant Symfony que les changements techniques du langage, mais je penche plus pour la seconde option et quelque chose qui aurait été "oublié" dans le composant…

    Edit

    Bon, alors j'ai pourtant suivi les annonces de mise à jour et je n'ai rien vu passer quant à ce genre de souci, mais je n'ai plus le problème depuis la version 6.2.6

    -
    Edité par Ymox 14 mars 2023 à 17:01:09

    • Partager sur Facebook
    • Partager sur Twitter

    [Symfony|Collection] ajouts à la volée plus liés

    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
    • Editeur
    • Markdown