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 :

Validation sur un edit mais pas en ajout [2.x]


Sujet :

Symfony PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2012
    Messages : 44
    Par défaut Validation sur un edit mais pas en ajout
    Bonjour,

    Voila je rencontre un petit problème avec mon code.
    J'ai un soucis de validation qui ne fonctionne pas lorsque je crée un nouvel objet "resa" mais qui fonctionne si je modifie un objet existant.

    Je ne trouve pas d'où ça vient!?
    Ce que je fais

    Mon entité

    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
    <?php
     
    namespace Damias\ResaBundle\Entity;
     
    use Doctrine\ORM\Mapping as ORM;
    use Doctrine\Common\Collections\ArrayCollection;
    use Symfony\Component\Validator\Constraints as Assert;
    use Damias\ResaBundle\Validator\Constraints as ResaAssert;
     
    /**
     * Reservation
     *
     * @ORM\Table()
     * @ORM\Entity(repositoryClass="Damias\ResaBundle\Entity\ReservationRepository")
     * @ResaAssert\ResaUnique
     */
    class Reservation
    {
    ...
    Ma constrainte

    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
    <?php
     
    namespace Damias\ResaBundle\Validator\Constraints;
     
    use Symfony\Component\Validator\Constraint;
     
    /**
     * @Annotation
     */
    class ResaUnique extends Constraint
    {
        public $message = 'Réservation en conflit (chambre déjà occupée dans cette période)';
     
        public function getTargets()
        {
            return self::CLASS_CONSTRAINT;
        }
     
        public function validatedBy()
        {
            return 'damiasresa_resaunique';
        }
    }
    Mon Validateur

    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
    <?php
     
    namespace Damias\ResaBundle\Validator\Constraints;
     
    use Doctrine\ORM\EntityManagerInterface;
    use Symfony\Component\HttpFoundation\RequestStack;
    use Symfony\Component\Validator\Constraint;
    use Symfony\Component\Validator\ConstraintValidator;
     
    class ResaUniqueValidator extends ConstraintValidator
    {
        private $requestStack;
        private $em;
     
        public function __construct(RequestStack $requestStack, EntityManagerInterface $em)
        {
            $this->requestStack=$requestStack;
            $this->em=$em;
        }
     
        public function validate($value, Constraint $constraint)
        {
            $dateArrivee=clone $value->getDateArrivee();
            $dateArrivee->modify('+1 day');
            $dateDepart=clone $value->getDateDepart();
            $dateDepart->modify('-1 day');
            $ressources=$value->getRessources()->getValues();
            $id_ressources=array();
            foreach ($ressources as $ressource)
            {
                $id_ressources[]=$ressource->getId();
            }
            $autre_resa=$this   ->em
                                ->getRepository('DamiasResaBundle:Reservation')
                                ->autreResa($id_ressources, $dateArrivee, $dateDepart);
     
            if (count($autre_resa)>1)
            {
                    $this->context  ->buildViolation($constraint->message)
                                    ->atPath('Ressources')
                                    ->addViolation();
            }
    Mon action en édition qui fonctionne
    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
     
       public function reservationAction($id)
        {
            // SESSION
            $session = $this->get('session');
     
            $em = $this ->getDoctrine()
                        ->getManager();
            $resa = $em ->getRepository('DamiasResaBundle:Reservation')->find($id);
     
            $form_reservation = $this   ->createForm(new ReservationType, $resa);
     
            $request = $this->get('request');
            if($request->getMethod()=='POST')
            {            
                //Récupération de la Réservation - Modification
                if($this ->get('request') ->get('damias_resabundle_reservation')!==null)
                {
                    $form_reservation->handleRequest($request);
                    if ($form_reservation->isSubmitted() && $form_reservation-> isValid())
                    {
                        $em=$this->getDoctrine()->getManager();
                        $em->flush();
                        $date=$resa->getDateArrivee();
                        $session->set('date', $date);
                        $response = $this->redirect($this->generateUrl('damias_resa_homepage'));
                        return $response;
                    }
                }
            }
     
            $response = $this->render(
                'DamiasResaBundle:Default:reservation_edit.html.twig',
                array(
                    'form_reservation' => $form_reservation->createView(),
                    'resa' => $resa
                )
            );
            return $response;
        }
    Mon action en ajouter où la validation ne fonctionne pas

    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
     public function ajouter_reservationAction()
        {
            // SESSION
            $session = $this->get('session');
            if ($session->get('resa')!=null) {
                $resa = new Reservation($session->get('resa'));
            }
            else {
                $resa = new Reservation();
            }
            $client = new Client();
            $request = $this->get('request');
     
            $form_client = $this        ->createForm(new ClientType,$client);
            $form_reservation = $this   ->createForm(new ReservationType, $resa);
     
            // Récupération des choix
            if($request->getMethod()=='GET')
            {
                // Récupération de la date de début
                if($this ->get('request') -> get('choix') !==null)
                {
                    $choix=$this ->get('request') -> get('choix');
                    $date_arrivee=$choix['date_encours']['date'];
                    $date_arrivee = new \Datetime($date_arrivee);
                    $date_depart = clone $date_arrivee;
                    $date_depart->modify('+1 day');
                    $ressourceId=$choix['ressource'];
                    $em = $this ->getDoctrine()
                                ->getManager();
                    $ressource = $em->getRepository('DamiasResaBundle:Ressource')->find($ressourceId);
                    $id_categories=$choix['categories'];
                    $resa   ->setDateArrivee($date_arrivee)
                            ->setDateDepart($date_depart)
                            ->addRessource($ressource);
                    $session->set('resa', $resa);
     
                    $categories = $ressource->getCategories();
     
                    $form_reservation = $this   ->createForm(new ReservationType, $resa);
                }
            }
            // Récupération du formulaire
            if($request->getMethod()=='POST')
            {            
                // Récupération du nouveau client
                if($this ->get('request') ->get('damias_resabundle_client')!==null)
                {
                    if ($form_client->handleRequest($request)-> isValid())
                    {
                        $em=$this->getDoctrine()->getManager();
                        $em->persist($client);
                        $em->flush();
                        $resa->setClient($client);
                        $session->set('resa', $resa);
                    }
                }
     
                //Récupération de la Réservation
                if($this ->get('request') ->get('damias_resabundle_reservation')!==null)
                {
                    $form_reservation->handleRequest($request);
                    if ($form_reservation->isSubmitted() && $form_reservation-> isValid())
                    {
                        $em=$this->getDoctrine()->getManager();
                        $em->persist($resa);
                        $em->flush();
                        $date=$resa->getDateArrivee();
                        $session->set('date', $date);
                        $session->set('resa', null);
                        $response = $this->redirect($this->generateUrl('damias_resa_homepage'));
                        return $response;
                    }
                }
            }
     
            $response = $this->render(
                'DamiasResaBundle:Default:reservation_new.html.twig',
                array(
                    'form_reservation' => $form_reservation->createView(),
                    'form_client' => $form_client->createView()
                )
            );
            return $response;
        }
    Ce que je veux

    Avant un enregistrement de nouvelle réservation, je veux vérifier que la ressource utilisé est disponible dans l'interval de dates de départ et d'arrivée.
    Ce que j'obtiens

    Lorsque je crée une nouvelle réservation dans une chambre (ressource) à une période déjà occuppé, la réservation est enregistrée.
    Si je modifie une réservation pour que la période déborde sur une autre réservation, ma validation fonctionne et mle retourne une erreur sur mon formulaire.

    Une idée? une piste?
    Merci

  2. #2
    Membre extrêmement actif
    Avatar de dukoid
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2012
    Messages
    2 100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2012
    Messages : 2 100
    Par défaut
    tu dis qu'il y a une erreur, ça serais bien de nous dire laquelle ?

    t'as été voir dans les logs si il y a une trace de l'erreur ?
    as tu fais un dump de l'objet avant son enregistrement pour voir si il n'y a pas de soucis ?

  3. #3
    Membre averti
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2012
    Messages : 44
    Par défaut
    Bonjour Dukoid et merci de t'intéresser à mon problème.

    En fait, je n'ai pas d'erreur; mes réservations s'enregistrent normalement, même lorsqu'elle ne le devrait pas.

    ex:
    J'ai une chambre occupé du 10 janv au 11 janv (réservation 1)
    Je prend une autre réservation (réservation 2) pour la même chambre du 9 au 11 janv. La réservation est enregistré alors que j'attends une alerte sur mon formulaire pour me signifier que la chambre est déjà occupée.
    Si j'édite ma réservation 2 pour modifier une des 2 dates tout en conservant la superposition de date avec la réservation 1, lorsque je valide, j'ai bien mon message d'alerte et je ne peux pas valider ma réservation. Ce qui est normale.

    Il semble que la validation ne fonctionne que sur un objet déjà existant mais pas avant l'enregistrement d'un nouveau!?

  4. #4
    Membre averti
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2012
    Messages : 44
    Par défaut
    Bon ben, ça fait un moment que je cherchais a comprendre mon erreur... et enfin c'est résolu!

    Ca venait de mon validateur:
    j'avais mis: if (count($autre_resa)>1)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     if (count($autre_resa)>0)
            {
                    $this->context  ->buildViolation($constraint->message)
                                    ->atPath('Ressources')
                                    ->addViolation();
            }

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

Discussions similaires

  1. Fade in sur plusieurs images mais pas simultanément
    Par dynexd dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 01/02/2007, 09h10
  2. Réponses: 2
    Dernier message: 11/07/2006, 13h01
  3. CSS : Bordure sur les liens mais pas sur les images ?
    Par monstroplante dans le forum Mise en page CSS
    Réponses: 1
    Dernier message: 04/02/2006, 14h18
  4. [CSS] border-collapse sur les TR mais pas sur les TD.
    Par hpfx dans le forum Mise en page CSS
    Réponses: 6
    Dernier message: 03/04/2005, 16h16

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