Bonjour ,

J’ai un soucis avec mon code. Pour expliquer le contexte :
Je fais de la récupération d’information via un OCR.
Ces informations se retrouve dans un tableau (de type annee, debut, fin, status, points, type de points)
Toutes ces informations doivent être sauvegarder en BDD, mais sur des tables différentes :

  • 1 releve contient 1 carriere qui contient X infoCarrieres qui contient X points qui est 1 type de point
    Pour valider ces informations avant sauvegarde, je passe par un formulaire et c’est l’affichage de se formulaire qui me pose problème.

    Ce que je fais

    Vu qu’il est possible de tout modifier de façon indépendante par la suite, je crée un formulaire relais pour mettre en place mes CollectionType (et donc, tous les morceaux de mon formulaire final)

Voici mon CarriereRelaiType :

public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add("caisses", CollectionType::class, [
                'entry_type' => CarriereType::class,
                'allow_add' => true,
                'allow_delete' => true,
                'attr' => ['class' => 'col-sm-2']
            ]);

    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'data_class' => null,
            'empty_data' => null
        ]);
    }

Voici mon InfoCarriereRelaiType :

public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add("infoCarrieres", CollectionType::class, [
                'entry_type' => InfoCarriere::class,
                'allow_add' => true,
                'allow_delete' => true,
                'attr' => ['class' => 'col-sm-2']
            ]);

    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'data_class' => null,
            'empty_data' => null
        ]);

    }

et j’ai la même chose pour les points.

Voici mon une partie de mon controller :
(pour info, $dispatch est le tableau mappé issu de mon OCR)

//creation de mon releve
$formReleve = $this->createForm(ReleveRelaiType::class, $dispatch, [
       'etudie' => $etudie,
 ]);
 $formReleve→handleRequest($request);

// creation carriere
$recupCaisse = [];
        foreach ($dispatch as $keyDispatch => $valueDispatch){
            if ($keyDispatch != "dateDoc"){
                $recupCaisse[][$keyDispatch] = $valueDispatch;
            }
        }

        $compteurCaisse = count($recupCaisse);
        for ($i=0; $i<$compteurCaisse; $i++){
            // creation de Carriere
            $dataCarriere["caisses"][$i] = new Carriere();
            foreach ($recupCaisse[$i] as $keyCaisse => $valueCaisse){
                // recuperation des noms de caisse
                $caisse = $caisseRepository->findByAcronyme(strtoupper($keyCaisse));
            }
            $dataCarriere["caisses"][$i]->setCaisse($caisse[0]);
            // recuperation des numeros 
            foreach ($valueCaisse as $keyDetail => $valueDetail) {
                if ($keyDetail == "numero") {
                    $dataCarriere["caisses"][$i]->setNumero($valueDetail);
                }
            }
        }
       dump($dataCarriere);
        $formCarriere = $this->createForm(CarriereRelaiType::class, $dataCarriere);
        $formCarriere→handleRequest($request);

for ($i=0; $i<$compteurCaisse; $i++){
            foreach ($recupCaisse[$i] as $keyDetail => $valueDetail){
                // ajout infocarriere
                foreach ($valueDetail as $keyTempInfoCarriere => $valueTempoInfoCarriere){
                    $dataInfoCarriere[$keyDetail][$keyTempInfoCarriere] = new InfoCarriere();
                    if (is_array($valueTempoInfoCarriere)){
                        foreach ($valueTempoInfoCarriere as $key => $value){
                            if ($key != "numeroDossier"){
                                if ($key == 'annee'){
                                    $dataInfoCarriere[$keyDetail][$keyTempInfoCarriere]->setAnnee($value);
                                }elseif ($key == 'debut'){
                                    $dataInfoCarriere[$keyDetail][$keyTempInfoCarriere]->setDebut($value);
                                }elseif ($key == 'fin'){
                                    $dataInfoCarriere[$keyDetail][$keyTempInfoCarriere]->setFin($value);
                                }elseif ($key == 'naturePeriode'){
                                    $dataInfoCarriere[$keyDetail][$keyTempInfoCarriere]->setStatus($value);
                                }

                            }
                        }
                    }
                    }
            }
        }
dump($dataInfoCarriere);
$formInfoCarriere = $this->createForm(InfoCarriereRelaiType::class, $dataInfoCarriere);
$formInfoCarriere->handleRequest($request);

Tout se passe bien en sauvegarde jusqu’à la carrière (j’ai 2 niveaux au dessus).

Ce que je veux

je voudrai pouvoir afficher l’ensemble de mon tableau afin de modifier/valider les informations

Ce que j’obtiens

Comme dit précédemment, tout se passe bien jusqu’à la carriere (affichage / sauvegarde). Lorsque je veux continuer avec mes infoCarriere, voici le message d’erreur Symfony :

Could not load type "App\Entity\InfoCarriere": class does not implement "Symfony\Component\Form\FormTypeInterface".

Dans mes dumps $dataCarriere et $dataInfoCarriere j'obtiens sensiblement la meme chose... sauf que la Carriere n'a qu'une seule entree et l'InfoCarriere en possède 4... mais ensuite, on a bien a chaque fois un objet
Dump $dataCarriere:

array:1 [▼
  "caisses" => array:4 [▼
    0 => App\Entity\Carriere {#1154 ▶}
    1 => App\Entity\Carriere {#1801 ▶}
    2 => App\Entity\Carriere {#1860 ▶}
    3 => App\Entity\Carriere {#1891 ▶}
  ]
]

Dump $dataInfoCarriere:

array:4 [▼
  "truc" => array:35 [▶]
  "bidule" => array:14 [▶]
  "machin" => array:8 [▶]
  "chose" => array:23 [▶]
]

et en voici une partie deplié:

array:4 [▼
  "truc" => array:35 [▼
    11 => App\Entity\InfoCarriere {#1943 ▶}
    12 => App\Entity\InfoCarriere {#2090 ▶}
    13 => App\Entity\InfoCarriere {#2105 ▶}
    14 => App\Entity\InfoCarriere {#2107 ▶}
    15 => App\Entity\InfoCarriere {#2326 ▶}
    16 => App\Entity\InfoCarriere {#2398 ▶}
    17 => App\Entity\InfoCarriere {#2401 ▶}
    18 => App\Entity\InfoCarriere {#2403 ▶}

J’ai l’impression qu’il me manque pas grand-chose mais je sais pas quoi… merci par avance de votre aide ;) et de m'avoir lu
bonne journée

1 réponse


GabrielT
Auteur
Réponse acceptée

Probleme résolu, dans mon InfoCarriereRelaiType, je faisais appel a l'entity et non au formType.
Il faut remplacer

'entry_type' => InfoCarriere::class,

par

'entry_type' => InfoCarriereType::class,

Merci en tout cas de m'avoir lu et bonne journée