IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Symfony PHP Discussion :

Multiple insert Symfony 4.3


Sujet :

Symfony PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2016
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2016
    Messages : 33
    Par défaut Multiple insert Symfony 4.3
    Bonjour a tous, je suis actuellement en apprentissage de symfony et je dois a la fin d'etude fournir un projet fonctionnel permettant la gestion Commerciale (Commande, Bon de commande, Bon de Livraison), j'ai actuellement un souci lors de la recuperation des donnees de la bd, J'ai cree un table qui me permet d'inserer les donnees dans la bd comme suit Nom : Screenshot from 2019-09-01 07-05-56.png
Affichages : 883
Taille : 106,7 Ko

    mais lors de la recuperation pour modifier, j'ai une seule ligne qui ressort, Voici mon controlleur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    /**
         * @Route("/new", name="commande_new", methods={"GET","POST"})
         * @Route("/{NumComd}/edit", name="commande_modification", methods={"GET","POST"})
         */
        public function new(Request $request, User $user=null, Commande $commande=null, Lcommande $lcommande=null, ProduitRepository $produitRepository): Response
        {
            $repo = $this->getDoctrine()->getRepository(Compteur::class);
            $compteur = $repo->find(1);
            $numcom = $compteur->getNumCom();
            if (!$commande && !$lcommande) {
                $commande = new Commande();
                $lcommande = new Lcommande();
            }
     
            $form = $this->createForm(CommandeType::class, $commande);
            $form->handleRequest($request);
     
            $f = $this->createForm(LcommandeType::class, $lcommande);
            $f->handleRequest($request);
     
            $tva = 0;
            $qte = 0;
            $pxu = 0;
            $mht = 0;
            $lig = 0;
            $ttc = 0;
            $tht = 0;
            $ttva = 0;
     
            $session = $request->getSession();
            if (!$session->has('commande')) {
                $session->set('commande', []);
            }
            $choix = "";
            $tabcom = $session->get('commande', []);
     
            if ($form->isSubmitted() || $f->isSubmitted()) {
                $choix = $request->get('bt');
                if ($choix == "Valider") {
                    $em = $this->getDoctrine()->getManager();
                    $lig = sizeof($tabcom);
                    for ($i = 1; $i<=$lig; $i++) {
                        $lcommande = new Lcommande();
                        $commande->addNumCom($lcommande);
                        $prod = $produitRepository->findOneBy(['id'=>$tabcom[$i]->getProduits() ]);
                        $lcommande->setProduits($prod);
                        $lcommande->setNumComd($commande);
                        $lcommande->setLig($i);
                        $lcommande->setPrixUnitaire($tabcom[$i]->getPrixUnitaire());
                        $lcommande->setQuantite($tabcom[$i]->getQuantite());
                        $lcommande->setTVA($tabcom[$i]->getTVA());
                        $lcommande->setCreatedAt(new \DateTime());
                        $em->persist($lcommande);
                        $mht = $tabcom[$i]->getPrixUnitaire()*$tabcom[$i]->getQuantite();
                        $tva = $mht * ($tabcom[$i]->getTVA())*0.01;
                        $tht = $tht + $mht;
                        $ttva = $ttva + $tva;
                        $ttc = $ttc + ($tht + $ttva);
                    }
     
                    $commande->setNumCommande($numcom);
                    $commande->setPHTC($tht);
                    $commande->setTVA($ttva);
                    $commande->setCreatedAt(new \DateTime());
                    $commande->setStatut(false);
                    $commande->setLivratedAt(new \DateTime());
                    $commande->setPTTC($ttc);
     
     
                    $em->persist($commande);
     
                    $compteur->setNumCom($numcom+1);
                    $em->persist($compteur);
                    $em->flush();
     
                    return $this->redirectToRoute('commande_show', ['id'=>$commande->getId()]);
                } elseif ($choix == "Ajouter") {
                    $mht = $lcommande->getPrixUnitaire()*$lcommande->getQuantite();
                    $lig = sizeof($tabcom)+1;
                    //$lcommande->setNumComd($commande);
                    $lcommande->setLig($lig);
                    $tabcom[$lig] = $lcommande;
                    $session->set('commande', $tabcom);
                    $this->get('session')->getFlashBag()->add('notice', 'Ajoute avec success ✅');
                }
            }
            $log = $this->getUser();
            return $this->render('commande/new.html.twig', [
                'commande' => $commande,
                'user'=>$log,
                'lcomm'=>$tabcom,
                'form' => $form->createView(),
                'f' => $f->createView(),
                'numcom'=>$numcom,
                'tht'=>$tht,
                'ttva'=>$ttva,
                'mht'=>$mht,
                'lig'=>$lig,
                'ttc'=>$ttc,
                'lcommande' => $lcommande,
                'prod' => $produitRepository->findAll(),
                //'editMode'=>$commande->getId() !== null,
                //'editMode1'=>$lcommande->getNumComd() !== null,
            ]);
        }

  2. #2
    Membre chevronné
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    351
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2011
    Messages : 351
    Par défaut
    Salut,

    Tout d'abord je me permets quelques remarques/questions :

    1. Symfony recommande de suivre la philosophie "thin controllers and fat models" ("Your controller methods should just call to other services, trigger some events if needed and then return a response, but they should not contain any actual business logic. If they do, refactor it out of the controller and into a service.") Étant donné la longueur et la complexité de ton contrôleur, je pense qu'il serait pertinent (si tu peux le faire dans les contraintes qui sont les tiennes) de refactoriser un peu ton code en créant un ou plusieurs services afin d'y mettre ta logique "métier" ; ensuite ton contrôleur ferait appel à ces services (leurs fonctions) ce qui simplifierait grandement ton contrôleur.

    2. Est-ce pour des raisons particulières que tu utilises le même contrôleur sur deux routes différentes ? (une pour la création et une pour la modification)
    J'ai l'impression que là aussi, ça rend ton code plus complexe à lire et à comprendre (encore plus d'un point de vue extérieur quand on n'est pas familier de l'application développée).

    3. Quelques commentaires dans le code ne feraient pas de mal pour qu'on le comprenne plus facilement et sans faire d'interprétation personnelle. Ça rejoint un peu ma première remarque mais si tu laisses le code en l'état, je pense qu'a minima des commentaires détaillant ce qui est fait et pourquoi nous permettraient d'y voir plus clair. Idem en ce qui concerne le nommage des variables : je pense (mais après c'est très personnel hein) que le code y gagnerait en lisibilité si certains noms étaient plus explicites (ex: $ligneCommande au lieu de $lcommande, $formCommande et $formLigneCommande plustôt que $form et $f, idem pour les abréviations, etc...).

    4. L'argument User $user = null semble utilisé nulle part, et je me demande à quoi sert d'injecter Commande $commande=null et Lcommande $lcommande=null car sauf erreur de ma part ces deux variables valent toujours null.

    Ensuite est-ce que tu peux détailler ce que tu entends par "mais lors de la récupération pour modifier, j'ai une seule ligne qui ressort" stp ?
    Si je comprends bien quand tu modifies une commande tu voudrais avoir un formulaire de modification permettant de modifier chaque ligne de commande c'est ça ?
    J'avoue avoir du mal à comprendre le code de ton contrôleur pour les raisons évoquées plus haut... quelle partie du contrôleur s'occupe de récupérer les données de la commande et d'afficher le formulaire de modification ?

  3. #3
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2016
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2016
    Messages : 33
    Par défaut
    Bonjour _Thomas et merci encore pour les remarques, ca je l'avoue moi-meme ca m'enerve parfois de regarder ce code la.
    deja la notion de Service je le connais pas trop, je devrais donc regarder un peu le cours sur ce module pour surement aranger mon code

  4. #4
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2016
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2016
    Messages : 33
    Par défaut
    Pour de qui est de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Commande $commande=null
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Lcommande $lcommande=null
    ,
    c'est pour que la commande soit toujours nulle lors de la creation en evitant les erreurs de parametre url et aussi modifier
    la commande si elle existe et qu'on passe en parametre dans l'url l'id de la commande, c'est pour cela que j'ai utilise la deuxieme route
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    * @Route("/{id}/edit", name="commande_modification", methods={"GET","POST"})
    pour effectivement recuperer les donnees de la commande.(Avoir effectivement des formulaire me permettant de modifier chaque ligne de la commande) comme tu as constate

  5. #5
    Membre chevronné
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    351
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2011
    Messages : 351
    Par défaut
    Citation Envoyé par ltatiekam Voir le message
    deja la notion de Service je le connais pas trop, je devrais donc regarder un peu le cours sur ce module pour surement aranger mon code
    En fait la notion de Service est assez simple grâce à l'autowiring de Symfony : c'est juste une classe PHP qui "fait des choses", qu'on peut éventuellement ré-utiliser à différents endroits et qui permet de simplifier les contrôleurs. (voir : https://symfony.com/doc/current/serv...-the-container)

    Dans ton cas tu pourrais par exemple créer Service/CommandeHelper.php contenant des méthodes permettant, à partir des données de la requête, de la session, etc... d'hydrater un objet Commande et de le retourner. Tu injectes ce Service dans le constructeur de ton contrôleur, et ainsi tu pourrais remplacer tous le code qui fait actuellement ça ($commande->setQuelqueChose...) par un appel aux fonctions du Service ($this->commandeHelper->methodeCustom...).

    Bon courage si tu te lances dans ce chantier, et si tu as besoin d'aide ou d'autres questions n'hésite pas !

  6. #6
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2016
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2016
    Messages : 33
    Par défaut
    Déjà merci et merci encore. Mais aussi stp est-ce qu'il y a une méthode ou un moyen de récupérer chaque ligne d'une commande dans une formule pour un update ?

  7. #7
    Membre chevronné
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    351
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2011
    Messages : 351
    Par défaut
    À mon avis il faut que tu fasses ce qui est présenté au début de cet article : https://symfony.com/doc/current/form...llections.html

    En gros tu aurais un formulaire CommandeType dont l'un des champs serait une collection de LCommandeType ; a priori rien de très différent d'un formulaire "classique" tant que tu ne veux pas ajouter/supprimer dynamiquement des LCommande. Cela dit, je n'ai encore jamais utilisé cette fonctionnalité donc je ne sais pas trop les difficultés qui peuvent se présenter.

Discussions similaires

  1. Multiples INSERT dans deux tables diffèrentes
    Par pcsystemd dans le forum Débuter
    Réponses: 2
    Dernier message: 16/06/2009, 07h50
  2. Upload multiple + insert du nom dans MySQL
    Par abrioit dans le forum Langage
    Réponses: 6
    Dernier message: 09/01/2009, 11h43
  3. Probleme de multiple insert sous ibatis
    Par hellipse dans le forum Persistance des données
    Réponses: 0
    Dernier message: 25/08/2008, 03h28
  4. [Tableaux] seleted multiple insert puis update
    Par digger dans le forum Langage
    Réponses: 2
    Dernier message: 10/07/2006, 15h32
  5. [ADOQuery] Multiple INSERT
    Par lanonyme dans le forum C++Builder
    Réponses: 2
    Dernier message: 12/05/2006, 13h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo