Partage
  • Partager sur Facebook
  • Partager sur Twitter

Probleme reviews post user symfony

Probleme reviews post user symfony

    12 février 2024 à 18:50:36

    Bonjour !

    Je souhaite créer un système d'avis.
    Par exemple, l'utilisateur "John Doe" se rend sur le profil de l'utilisateur "Thomas Martinez" et lui donne une note.

    Ensuite, sur l'avis, il faut écrire que l'avis a été publié par John Doe.

    PS : Sur mon application, noter que "John Doe" est le nom_agence en gros.
    J'essaie depuis des jours et je suis carrément bloqué... J'ai beau chercher, je ne trouve pas... 🤔

    Vois le src/controlleur/ProfileController.php (Je mets l'avis sur le profil des users c'est pour ça )
    $reviews = $user->getReviews();
    
            // Calculer le nombre total de mois de loyers payés
            $totalMonthsPaid = 0;
            foreach ($reviews as $review) {
                $start = $review->getStartDate();
                $end = $review->getEndDate();
    
                // Calculer le nombre de mois couverts par cet avis
                $interval = $start->diff($end);
                $months = $interval->y * 12 + $interval->m;
                if ($interval->d > 0) {
                    $months++; // Considérer les jours partiels comme un mois entier
                }
    
                $totalMonthsPaid += $months;
            }
    
            // Récupérer l'agence de l'utilisateur
           // $agenceNom = $entityManager->getRepository(User::class)->findOneBy(['id' => $user->getId()])->getNomAgence();
    $agenceNom = $user->getNomAgence();
    
            return $this->render('profile/index.html.twig', [
                'user' => $user,
                'form' => $form->createView(),
                'reviews' => $reviews,
                'totalMonthsPaid' => $totalMonthsPaid,
                'agenceNom' => $agenceNom,
            ]);
        }
    Peut être un graphique de texte qui dit ’MON ENTITY USER MA VUE getNomAgence return :?string his->nom agence; Agence setNomAgence( tring $nom_agence): static strong agence agence; review.agenceNom’
    Peut être une image de texte

    • Partager sur Facebook
    • Partager sur Twitter
      13 février 2024 à 16:23:55

      {{ review.nomAgence }} in view twig

      -
      Edité par SergioSans 13 février 2024 à 16:26:12

      • Partager sur Facebook
      • Partager sur Twitter
        13 février 2024 à 17:02:19

        SergioSans a écrit:

        {{ review.nomAgence }} in view twig

        -
        Edité par SergioSans il y a 34 minutes


        Bonjour  et merci de ta réponse je l'ai fait mais cela ne fonctionne pas ...
        • Partager sur Facebook
        • Partager sur Twitter
          13 février 2024 à 22:25:50

          Salut

          J'ai de la peine à cerner. le souci, donc je vais proposer plusieurs pistes différentes en attendant de voir si l'une d'entre elles t'aide ou s'il nous faut plus d'information.

          S'il faut lier un objet Review à l'utilisateur courant lors de la création, alors dans l'action de création, en ajoutant un paramètre UserInterface $user, on récupère l'utilisateur.
          Si c'est pour lier à l'agence de l'utilisateur, alors en plus de l'étape ci-dessus, on peut récupérer l'agence de l'utilisateur courant.
          Pour afficher l'utilisateur ou l'agence qui a fait le commentaire, du moment que les relations sont bien faites, alors review.user ou review.agence, voire review.user.agence dans le template.

          • Partager sur Facebook
          • Partager sur Twitter
            14 février 2024 à 18:49:38

            Ymox a écrit:

            Salut

            J'ai de la peine à cerner. le souci, donc je vais proposer plusieurs pistes différentes en attendant de voir si l'une d'entre elles t'aide ou s'il nous faut plus d'information.

            S'il faut lier un objet Review à l'utilisateur courant lors de la création, alors dans l'action de création, en ajoutant un paramètre UserInterface $user, on récupère l'utilisateur.
            Si c'est pour lier à l'agence de l'utilisateur, alors en plus de l'étape ci-dessus, on peut récupérer l'agence de l'utilisateur courant.
            Pour afficher l'utilisateur ou l'agence qui a fait le commentaire, du moment que les relations sont bien faites, alors review.user ou review.agence, voire review.user.agence dans le template.

            Salut et merci de ta réponse j'ai fait les choses que tu m(as dit sut twig mais cela ne fonctionne pas..

            J'ai fait un github , je pense que pourrais voir mieux le soucis : https://github.com/xavgdt66/LOCALO 

            • Partager sur Facebook
            • Partager sur Twitter
              14 février 2024 à 19:36:59

              Je ne comprends toujours pas le souci…

              Pour afficher les objets Review liés à un utilisateur, tu peux boucler sur user.reviews, et après dans la boucle, tu as toutes les propriétés d'un des objets avec review.author ou autre review.nom_agence. Evidemment pas review.user, qui va lui afficher l'utilisateur pour lequel l'objet Review a été créé. Serait-ce là ton souci, tu n'as qu'une relation pour le "destinataire" et tu ne vois pas comment en faire une deuxième ou du moins avoir une autre information, l'auteur/expéditeur, indépendamment de l'agence ?

              • Partager sur Facebook
              • Partager sur Twitter
                15 février 2024 à 21:02:43

                Merci de ta réponse

                Voila, je ne comprend pas comment faire pour que quand une agence publie un avis il est indique cette avis à était publier par le nom de l'agence qui l'as publier tu comprend ?

                Review.nomagence ne fonctionne pas ... 

                • Partager sur Facebook
                • Partager sur Twitter
                  15 février 2024 à 21:33:36

                  Donc le souci, c'est de lier on objet Agence à un objet Review ?

                  L'utilisateur connecté, lui, est bien lié à une agence ? Si oui, alors en récupérant l'utilisateur connecté comme expliqué précédemment, tu fais $review->setAgence($user->getAgence()) — à faire avant de persister l'objet. Si tu ne souhaites qu'enregistrer le nom, alors ce sera plutôt $review->setNomAgence($user->getAgence()->getNom())

                  Tu sembles déjà avoir tenté quelque chose de ce genre, quelle était l'erreur, ou du moins ce à quoi tu t'attendais et ce que tu observais ?

                  -
                  Edité par Ymox 15 février 2024 à 21:38:11

                  • Partager sur Facebook
                  • Partager sur Twitter
                    16 février 2024 à 12:10:35

                    Oui normalement il est bien liée à l'agence, peux tu me le confirmer en regardent mon projet ? 

                    Jai essayer : $review->setAgence($user->getAgence()) et $review->setNomAgence($user->getAgence()->getNom()) et j'ai des erreus comme quoi mes getter et setter n'arripe pas a etre appeller ..

                    J'ai essayer $review->setNomAgence($user);

                    Et j'ai eu cette erreur "     App\Entity\User::__toString(): Return value must be of type string, null returned "

                    J'ai donc créer une function toString pour convertir mais cela ne fonctionne pas 

                    • Partager sur Facebook
                    • Partager sur Twitter
                      16 février 2024 à 14:22:57

                      En toute logique, $review->setNomAgence($user) ne va pas fonctionner comme tu t'y attends, même s'il n'y avait pas d'erreur, parce que tu voudrais mettre le nom de l'utilisateur dans le nom de l'agence. Ça me fera toujours penser à ces jouets pour enfants avec des formes découpées et des solides à y faire passer, et là tu tentes de mettre l'étoile dans le carré…

                      Il serait très intéressant que tu nous cites les erreurs rencontrées avec quel code.

                      Mais j'espère aussi que tu saurais adapter ce que je t'ai proposé à ton code, je t'avais donné des pistes et non pain bénit.

                      -
                      Edité par Ymox 14 mars 2024 à 12:19:08

                      • Partager sur Facebook
                      • Partager sur Twitter
                        16 février 2024 à 16:54:27

                        Merci encore pour tes réponse. 

                        Enfaite je veux que la donnée nomagence de mon user soit sur la vue (Quand il publie l'avis) , comme j'ai indiquer dans le post du sujet.

                        Voila mon code : 

                        src/entity/user.php

                         #[ORM\OneToMany(mappedBy: 'user', targetEntity: "Review")]
                            private  $reviews;



                           public function getNomAgence(): ?string
                            {
                                return $this->nom_agence;
                            }
                        
                            public function setNomAgence(string $nom_agence): static
                            {
                                $this->nom_agence = $nom_agence;
                        
                                return $this;
                            }


                        src/entity/review.php

                        #[ORM\ManyToOne(targetEntity: User::class, inversedBy: 'reviews')]
                            #[ORM\JoinColumn(name: 'user_id', referencedColumnName: 'id')]
                            private $user;
                        
                        
                            #[ORM\Column(type: "string", length: 555, nullable: true)]
                            private $nom_agence;

                        public function getNomAgence() {

                                return $this->nom_agence;
                            }
                        
                            public function setNomAgence($nom_agence) {
                                $this->nom_agence = $nom_agence;
                            }
                        




                        src/controller/profilecontroller.php

                        #[Route('/profile/{id}', name: 'app_profile')]
                            public function index(Request $request, User $user, EntityManagerInterface $entityManager, Security $security): Response
                            {
                                $this->denyAccessUnlessGranted('IS_AUTHENTICATED');
                        
                                if (!$security->isGranted('ROLE_AGENCY') && !$security->isGranted('ROLE_ADMIN')) {
                                    return $this->redirectToRoute('app_home');
                                }
                        
                                $review = new Review();
                                $form = $this->createForm(ReviewType::class, $review);
                        
                                $form->handleRequest($request);
                        
                                if ($form->isSubmitted() && $form->isValid()) {
                                    // Vérifier si une note existe déjà pour la période donnée
                                    $existingReview = $entityManager->getRepository(Review::class)->findOneBy([
                                        'user' => $user,
                                        'startDate' => $review->getStartDate(),
                                        'endDate' => $review->getEndDate()
                                    ]);
                        
                                    if ($existingReview) {
                                        $this->addFlash('error', 'Une note existe déjà pour cette période.');
                                    } else {
                                        // Associer l'utilisateur à l'objet Review
                                        $review->setUser($user);
                                      
                        
                                        // Enregistrer la nouvelle note
                                        $entityManager->persist($review);
                                        $entityManager->flush();
                        
                                        $this->addFlash('success', 'Votre avis a été enregistré avec succès.');
                                    }
                        
                                    return $this->redirectToRoute('app_profile', ['id' => $user->getId()]);
                                }
                        
                                $reviews = $user->getReviews();
                        
                                // Calculer le nombre total de mois de loyers payés
                                $totalMonthsPaid = 0;
                                foreach ($reviews as $review) {
                                    $start = $review->getStartDate();
                                    $end = $review->getEndDate();
                        
                                    // Calculer le nombre de mois couverts par cet avis
                                    $interval = $start->diff($end);
                                    $months = $interval->y * 12 + $interval->m;
                                    if ($interval->d > 0) {
                                        $months++; // Considérer les jours partiels comme un mois entier
                                    }
                        
                                    $totalMonthsPaid += $months;
                                }
                        
                                // Récupérer l'agence de l'utilisateur
                               // $agenceNom = $entityManager->getRepository(User::class)->findOneBy(['id' => $user->getId()])->getNomAgence();
                        $agenceNom = $user->getNomAgence();
                        
                                return $this->render('profile/index.html.twig', [
                                    'user' => $user,
                                    'form' => $form->createView(),
                                    'reviews' => $reviews,
                                    'totalMonthsPaid' => $totalMonthsPaid,
                                    'agenceNom' => $agenceNom,
                                ]);
                            }


                        templates/profile/index.html.twig 

                        <p>
                        <strong>Publier par l'agence:</strong>
                        {{ review.nomagence }}
                        
                        </p>

                        La je n'ai pas d'erreur quand je mets le code que j'ai cite précédemment , mais le nom de l'agence ne se mets pas : 

                        voila l'image : https://i.goopics.net/db6cc7.png 

                        -
                        Edité par Spawnkiller66 16 février 2024 à 16:56:00

                        • Partager sur Facebook
                        • Partager sur Twitter
                          16 février 2024 à 23:39:44

                          Avec le code que tu montres, il faut "simplement" faire {{ agenceNom }} dans le template, parce que tu le mets dans une variable "à part", qui n'est pas dans l'objet Review. Seulement, cela implique que toutes les notes seront affichées comme ayant été prises par l'utilisateur courant. SI c'est le cas, tant mieux, si un locataire peut avoir des notes de plusieurs agences, ça ne va pas le faire.

                          Probablement qu'il te faudra adapter cet objet Review, si tu souhaites dire qu'une note (Review) a été prise par un utilisateur qui fait partie d'une agence — et ce indépendamment (donc en plus) de l'utilisateur pour lequel la note a été prise. Donc une nouvelle relation (Many)Review#auther(ToOne)User#notesRedigees. A la création d'une note, donc, tu ajouterais l'utilisateur courant comme auteur de la note.

                          Et après, dans le template, tu ferais {{ review.auteur.nomAgence }}.

                          • Partager sur Facebook
                          • Partager sur Twitter
                            17 février 2024 à 20:49:25

                            Merci de ta réponse , alors j'ai fait une requête sql pour Jointer les tables et cela marche parfaitement come ceci :

                             UPDATE user JOIN review ON user.nom_agence = review.nom_agence SET user.nom_agence = review.nom_agence;

                            J'ai aussi modifier mon contrôleur est la requête qui vient chercher le nom-agence comme ceci : 

                             $currentUser = $this->getUser(); $review->setNomAgence($currentUser->getNomAgence());

                            Je suis content c'est grâce à toi ;) Je suis soulager à un point. Merci beaucoup 

                            • Partager sur Facebook
                            • Partager sur Twitter

                            Probleme reviews post user symfony

                            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                            • Editeur
                            • Markdown