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 :

Symfony 5.1.3 Récurrence d'événement


Sujet :

Symfony PHP

  1. #1
    Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2020
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2020
    Messages : 5
    Points : 4
    Points
    4
    Par défaut Symfony 5.1.3 Récurrence d'événement
    Bonjour à tous,
    Tout d'abord merci pour l'aide précieuse que vous pourrez me donner.
    Je cherche a mettre en place un récurrence :

    je met le cadre : le site permet de poster des annonces j'aimerais offrir la possibilité au client de créer une récurrence annuel, mensuel,hebdomadaire sur 1 seule récurrence si une annonce doit revenir régulièrement.
    exemple : si le client veut créer un événement pour le 14 juillet 2021 il peut cocher la récurrence puis la période dans le formulaire pour dupliquer son annonce pour le 14 juillet 2022 automatiquement sans avoir a recréer son événement.

    mon problème est que je n'arrive pas à le mettre en place, apparemment il ne prend la duplication en compte. je vous fourni la partie du controller qui concerne le problème.
    Je vous remercie encore par avance au temps que vous pourrez m'accorder bonne journée à tous.

    mon controller :

    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
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
     
    public function add(Request $request, CategoryRepository $categoryRepository, CityRepository $cityRepository, CoverUploader $coverUploader, RegistrationFormUploader $registrationFormUploader, SluggerInterface $slugger, EntityManagerInterface $em, MailerInterface $mailer)
        {
            $event = new Event();
            $form = $this->createForm(EventType::class, $event, ['categories' => $categoryRepository->getCategoryOptions(), 'use_status' => false]);
     
            $form->handleRequest($request);
     
            if ($form->isSubmitted()) {
     
                $location = $form->get('location')->getData();
     
                if ($location !== null) {
                    $cityId = $request->get('cityId');
                    $city = $cityRepository->find($cityId);
     
                    if ($city === null) {
                        $form->get('location')->addError(new FormError("Le code postal ou la ville renseignée est incorrect."));
                    }
                } else {
                    $form->get('location')->addError(new FormError("Vous devez renseigner une ville."));
                }
     
                $tags = $form->get('tags')->getData();
     
                if ($tags === null) {
                    $form->get('tags')->addError(new FormError("Vous devez renseigner un ou des tags."));
                }
     
                if ($form->isValid()) {
                    $event->setUser($this->getUser());
                    $event->setCity($city);
     
                    $shortDescription = substr(str_replace(' ', ' ', $event->getDescription()), 0, 80)."...";
                    $event->setShortDescription($shortDescription);
     
                    $event->setStatus('pending');
                    $event->setCreatedAt(new DateTime());
                    $event->setType('simple');
                    $event->setSource('website');
                    $event->setNbVisits(0);
                    $event->setNbExhibits(0);
     
                    $tags = json_decode($form->get('tags')->getData());
     
                    foreach ($tags as $tag) {
                        $eventTag = new EventTag();
                        // Lowercase, no spaces around and without accent
                        $tag = trim(strtolower($slugger->slug($tag->value, ' ')));
                        $eventTag->setTag($tag);
                        $event->addEventTag($eventTag);
                    }
     
                    $em->persist($event);
                    $em->flush();
     
                    $slug = $city->getZipCode().'-'.$event->getTitle().'-'.$city->getName().'-'.$event->getId();
                    $event->setSlug(strtolower($slugger->slug($slug)));
     
                    $coverFile = $form->get('coverFile')->getData();
                    if ($coverFile) {
                        $coverUploader->setEventId($event->getId());
                        $coverFileName = $coverUploader->upload($coverFile);
                        $event->setCover($coverFileName);
                    }
     
                    $registrationForm = $form->get('registrationForm')->getData();
                    if ($registrationForm) {
                        $registrationFormUploader->setEventId($event->getId());
                        $formFileName = $registrationFormUploader->upload($registrationForm);
                        $event->setRegistrationForm($formFileName);
                    }
     
                    $em->persist($event);
                    $em->flush();
     
                    $email = (new TemplatedEmail())
                        ->from(new Address('no-reply@***', 'No-Reply ***'))
                        ->to('contact@***')
                        ->subject('Votre annonce sur ***')
                        ->htmlTemplate('event/email_notice.html.twig')
                        ->context([
                            'eventTitle' => $event->getTitle()
                        ])
                    ;
                    $mailer->send($email);
     
                    $this->addFlash('success', 'Merci ! Votre événement est maintenant en cours de validation. Lorsque celui-ci sera publié, vous recevrez un email de confirmation.');
                }
                if( $recurrence == 'oui'){
                        $event = new Event();
                        $form->handleRequest($request);
                         $startDate = $form->get('startDate')->getData();
                         $endDate = $form->get('endDate')->getData();
                         $recurrence = $form->get('recurrence')->getData();
                         $periodeOn = $form->get('periodeOn')->getData();
                        if ($form->isValid()) {
                            $event->setUser($this->getUser());
                            $event->setCity($city);
                            $event->setRecurrence($recurrence);
                            $event->setPeriodeOn($periodeOn);
                            $shortDescription = substr(str_replace(' ', ' ', $event->getDescription()), 0, 80)."...";
                            $event->setShortDescription($shortDescription);
                            $event->setStatus('pending');
                            $event->setCreatedAt(new DateTime());
                            $event->setType('simple');
                            $event->setSource('website');
                            $event->setNbVisits(0);
                            $event->setNbExhibits(0);
     
                            if( $periodeOn == 'annuel'){
                                $startDate->add(new DateTime($startDate))->add(new DateInterval('P1Y'));
                                $endDate->add(new DateTime($endDate))->add(new DateInterval('P1Y'));
                                $event->setStartDate($startDate);
                                $event->setEndDate($endDate);
                            }elseif( $periodeOn == 'mensuel'){
                                $startDate->add(new DateInterval('P1M'));
                                $endDate->add(new DateInterval('P1M'));
                                $event->setStartDate($startDate);
                                $event->setEndDate($endDate);
                            }elseif( $periodeOn == 'hebdomadaire'){
                                $startDate->add(new DateInterval('P7D'));
                                $endDate->add(new DateInterval('P7D'));
                                $event->setStartDate($startDate);
                                $event->setEndDate($endDate);
                                new DateTime();
                            }
     
                            $tags = json_decode($form->get('tags')->getData());
     
                            foreach ($tags as $tag) {
                                $eventTag = new EventTag();
                                // Lowercase, no spaces around and without accent
                                $tag = trim(strtolower($slugger->slug($tag->value, ' ')));
                                $eventTag->setTag($tag);
                                $event->addEventTag($eventTag);
                            }
     
                            $em->persist($event);
                            $em->flush();
     
                            $slug = $city->getZipCode().'-'.$event->getTitle().'-'.$city->getName().'-'.$event->getId();
                            $event->setSlug(strtolower($slugger->slug($slug)));
     
                            $coverFile = $form->get('coverFile')->getData();
                            if ($coverFile) {
                                $coverUploader->setEventId($event->getId());
                                $coverFileName = $coverUploader->upload($coverFile);
                                $event->setCover($coverFileName);
                            }
     
                            $registrationForm = $form->get('registrationForm')->getData();
                            if ($registrationForm) {
                                $registrationFormUploader->setEventId($event->getId());
                                $formFileName = $registrationFormUploader->upload($registrationForm);
                                $event->setRegistrationForm($formFileName);
                            }
     
                            $em->persist($event);
                            $em->flush();
     
                            $email = (new TemplatedEmail())
                                ->from(new Address('no-reply@***', 'No-Reply ***'))
                                ->to('contact@***')
                                ->subject('Votre annonce sur ***')
                                ->htmlTemplate('event/email_notice.html.twig')
                                ->context([
                                    'eventTitle' => $event->getTitle()
                                ])
                            ;
                            $mailer->send($email);
     
                            $this->addFlash('success', 'Merci ! Votre événement est maintenant en cours de validation. Lorsque celui-ci sera publié, vous recevrez un email de confirmation.');
                        }
                    }
                }
     
            return $this->render('event/add.html.twig', [
                'form' => $form->createView()
            ]);
        }

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

    Informations professionnelles :
    Activité : Étudiant

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

    À mon avis ça vient du fait que la variable $recurrence que tu utilises dans ton test if( $recurrence == 'oui') est définie à l'intérieur du ton instruction if, or le test retourne toujours false et donc le code qui s'y trouve n'est jamais exécuté.

    Par ailleurs je me permets une remarque plus générale sur ton code : ce n'est pas une bonne pratique d'avoir autant de logique dans un contrôleur, il est plutôt recommandé de créer des services et d'injecter ces derniers dans le contrôleur pour les utiliser. Ça permet d'avoir des contrôleurs moins longs (moins de lignes de code), plus lisibles (si les services et leurs méthodes ont des noms suffisamment explicites, on peut comprendre ce que fait le contrôleur sans connaître l'implémentation précise de toutes les étapes), et enfin ça diminue la duplication de code et facilite l'écriture de tests unitaires.

    Un exemple concret : à la fin de ton contrôleur tu instancies un email et l'envoies via la méthode send() du Mailer, à la place tu pourrais créer un service dédié à cette tâche "envoyer un mail" et ainsi simplifer ton contrôleur en faisant la même chose mais en une seule ligne. Autre avantage, si dans un autre contrôleur ou ailleurs dans ton application, tu souhaites envoyer un mail, pas besoin de ré-écrire du code qui va instancier un email puis l'envoyer, à la place tu injectes ton service custom (vie le TypeHint ou dans le constructeur) et tu utilises ses fonctionnalités. (cf. https://symfony.com/doc/current/serv...-the-container).

  3. #3
    Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2020
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2020
    Messages : 5
    Points : 4
    Points
    4
    Par défaut
    Tout d'abord merci pour ta réponse,
    mais non même en définissant ma variable récurrence a l’extérieur de la condition if($recurrence == 'oui') il ne le prend pas en charge j'ai l'impression qu'il ne rentre pas dans le if.
    mon but est de créer un objet event puis de le dupliquer pour modifier la date.
    il n'y aurait pas moyen de récupérer cette objet par son id dans la base modifier la date et le réenregistrer comme je le fait pour l'update d'un event ?
    parce que en faisant un new event() il me vide le 2eme formulaire, on ne pourrais pas réhydrater celui-ci avec le formulaire précédent en ajoutant+1 pour l'id et modifier la date?

    Je suis complètement paumé ça fait 2 semaines que je suis sur ce problème et je n'avance pas

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    156
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 156
    Points : 136
    Points
    136
    Par défaut
    Bonjour,

    Je ne suis pas un pro de php ni de symfony, peut être que je me trompe, mais voilà ce que je vois :
    Dans le test if( $recurrence == 'oui'), $recurrence n'est alimenté nulle part avant.
    Soit il vient à l'appel de la fonction, et il faut le définir dans les paramètres.
    Soit c'est un champ du formulaire, et il faut l'alimenter par un truc du genre $recurrence = $form->get('recurrence')->getData().

    En espérant que ça aide...

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    156
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 156
    Points : 136
    Points
    136
    Par défaut
    En regardant à nouveau ton code, tu alimentes $reccurence une fois que tu es dans le if( $recurrence == 'oui'). (EDIT : c'est ce que disait _Thomas plus haut, je viens de voir...)

    Tu peux essayer en déplaçant ton if :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
                         $event = new Event();
                         $form->handleRequest($request);
                         $startDate = $form->get('startDate')->getData();
                         $endDate = $form->get('endDate')->getData();
                         $recurrence = $form->get('recurrence')->getData();
                         $periodeOn = $form->get('periodeOn')->getData();
                         if( $recurrence == 'oui'){
    Qu'est ce que ça donne ?

  6. #6
    Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2020
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2020
    Messages : 5
    Points : 4
    Points
    4
    Par défaut
    Bonjour à tous le deux,
    Tout d'abord merci pour vos réponses, alors après vérification et test de mon code le problème n'est pas la prise en compte de $recurrence == 'oui' puisqu'elle est prise,
    le problème vient du faite que je n'arrive pas à dupliquer le résultat de mon formulaire.
    Je m'explique:
    ce que je cherche a faire est avec 1 seule et même formulaire :
    si je coche récurrence égal oui (cette partie la est valide)
    - je créer 2 entrée dans la base :
    -1 auquel je ne touche pas
    -2 qui reprend toute les infos de la 1er mais sur lequel je modifie la valeur de 2 champs.

    résultat attendu quand je valide le formulaire : 2 entrée dans ma base de donnée.

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    156
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 156
    Points : 136
    Points
    136
    Par défaut
    Ha, tant mieux si ton code marche pour $recurrence, désolé pour la fausse piste...

    Alors, là vite fait, sur le principe, as tu essayé quelque chose dans le genre :

    Ce que tu fais déjà :
    Créer $event
    Récupérer le formulaire
    Alimenter $event par les données du formulaire
    Persister et flusher $event

    Et selon mon avis, une piste pour la suite :
    Créer $event2
    L'alimenter à partir de $event, avec $event2 = clone $event
    Modifier les 2 champs spécifiques à $event2
    Persister et flusher

    A vérifier : peut être que le flush final est suffisant, tu pourras peut être enlever le flush du premier $event

    En espérant que ça fasse avancer le schmilblick...

  8. #8
    Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2020
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2020
    Messages : 5
    Points : 4
    Points
    4
    Par défaut
    Je T'aime toi

    super ca marche !!!!!!!!

    merci merci merci

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    156
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 156
    Points : 136
    Points
    136
    Par défaut
    Et 1 problème de résolu

    Merci pour ce retour sympathique et positif

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Symfony 3 événement doctrine
    Par waldpest dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 03/07/2017, 10h39
  2. [1.x] Écouter un évènement symfony
    Par mandzokich dans le forum Symfony
    Réponses: 5
    Dernier message: 30/08/2014, 21h51
  3. [2.x] Écouter un évènement symfony
    Par mandzokich dans le forum Symfony
    Réponses: 2
    Dernier message: 27/08/2014, 23h46
  4. Redéfinir l'événement OnExit de mon composant TEditFloat
    Par Seb des Monts dans le forum C++Builder
    Réponses: 5
    Dernier message: 18/06/2002, 16h10

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