8199 sujets

Développement web côté serveur, CMS

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.

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).

Je cherche à pouvoir afficher l’ensemble de mon tableau afin de modifier/valider les informations

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 Smiley cligne et de m'avoir lu
bonne journée
Modifié par Gabs (10 Sep 2020 - 16:46)
Modérateur
Bonjour, le problème est ici:


->add("infoCarrieres", CollectionType::class, [
                'entry_type' => InfoCarriere::class,
                'allow_add' => true,
                'allow_delete' => true,
                'attr' => ['class' => 'col-sm-2']
            ]);


entry_type ne peut pas valoir InfoCarriere::class car c'est une entité, au lieu d'un élément de formulaire.