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 :

Est-il possible d'annuler l'enregistrement d'une entité dans le prepersist


Sujet :

Symfony PHP

  1. #1
    Membre à l'essai
    Profil pro
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 33
    Points : 16
    Points
    16
    Par défaut Est-il possible d'annuler l'enregistrement d'une entité dans le prepersist
    Bonjour,

    J'utilise fosuserbundle, à l'entité User, j'ai rajouté une propriété photo où l'utilisateur peut uploader sa photo, cette propriété est une relation avec l'entité Media

    Voici le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    /**
         * @ORM\ManyToOne(targetEntity="App\AppBundle\Entity\Media", cascade={"persist"})
         * @ORM\JoinColumn(name="photo_id", referencedColumnName="id")
         */
        protected $photo;
    J'ai créé un listener pour l'upload des médias.

    Mon problème est lors de l'enregistrement d'un utilisateur, si celui-ci ne renseigne pas de photo, l'enregistrement du média se fait quand même sauf qu'il y a une erreur car le champs "path" ne peut-être NULL.

    Est-il donc possible dans mon listener de vérifier si ma propriété path n'est pas renseigné alors je n'effectue pas l'enregistrement ?
    J'ai essayé $em->detach($media); or cela ne marche pas.

    Merci de votre aide.

  2. #2
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    725
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2011
    Messages : 725
    Points : 1 050
    Points
    1 050
    Par défaut
    Bonjour,
    Tu veux enregistrer uniquement l'entité User lorsque la photo n'est pas rempli, et les deux entités lorsque c'est valide c'est bien ça?
    Tu dois changer ton mapping pour que la relation photo ne soit pas obligatoire, il faudrait ajouter:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    /**
    * @ORM\ManyToOne(targetEntity="App\AppBundle\Entity\Media", cascade={"persist"})
    * @ORM\JoinColumn(name="photo_id", referencedColumnName="id",nullable=true)
    */
    protected $photo;
    Sinon,il doit y avoir un conflit entre l'instruction $em->detach et l'annotation persist.
    Essaie avec un callback dans ton entité user pour supprimer la relation.
    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
     
    /**
    *@ORM\Entity
    *@ORM\HasLifeCycleCallback
    */
    class User{
    /**
    *@ORM\PrePersist
    *@ORM\PreUpdate
    **/
    public function removePhotoIfNoPath(){
      if(!$this->photo){
       return;
      }
      if($this->photo->getPath()){
       return;
      }
      $this->photo=null;//on supprime la relation lorsque path est null
    }
    }

  3. #3
    Membre à l'essai
    Profil pro
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 33
    Points : 16
    Points
    16
    Par défaut
    Merci arnooo999 pour ta réponse.

    Ta solution fonctionne (le nullable=true n'est pas nécessaire), c'est juste embêtant d'insérer ce bout de code pour chaque entité nécessitant une photo.

    N'y a t-il pas moyen de rendre un formulaire intégré optionnel car j'ai essayé ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ->add('photo', new PhotoType(), array('required' => false))
    mais j'ai le problème cité précédemment.

  4. #4
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    725
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2011
    Messages : 725
    Points : 1 050
    Points
    1 050
    Par défaut
    Peut-être que ça peut se gérer par un form Listener
    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
     
    class PhotoType
    {
      public function buildForm(FormBuilder $builder, array $options)
      {
        $builder
          ->add('file')      
          ->addEventListener(FormEvents::SET_DATA,function(FilterDataEvent $event){
              $photoEntity=$event->getData();//l'entité media
              if(!$photoEntity){//l'evenement est parfois appelé alors qu'il n'y a pas de données
                return;
              }
              if($photoEntity->getPath()){
                return;
              }
              $event->setData(null);//on met le data à null
          });
      }
    }
    //non testé
    Il faut s'assurer que le getter de ton user ne fait pas de controle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     public function setPhoto($photo) 
    //et pas
    setPhoto(Media $photo)

  5. #5
    Membre à l'essai
    Profil pro
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 33
    Points : 16
    Points
    16
    Par défaut
    Malheureusement cela ne fonctionne pas j'ai la même erreur.

  6. #6
    Membre à l'essai
    Profil pro
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 33
    Points : 16
    Points
    16
    Par défaut
    arnooo999, ta méthode qui fonctionnait ne fonctionne uniquement à l'insertion et la modification lorsqu'une propriété est modifiée sauf que quand on modifie l'entité sans modifier de propriété, ça ne passe plus dans le preupdate et donc j'ai la même erreur qu'auparavant

Discussions similaires

  1. Est il possible de modifier la position d'une scroll dans iframe
    Par Mho37 dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 03/11/2008, 11h05
  2. Est-il possible de retourner la source d'une page dans une variable ?
    Par sachav dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 30/12/2007, 18h02
  3. Réponses: 6
    Dernier message: 07/08/2006, 11h26
  4. [SQL] Est-il possible d'afficher le résultat d'une requête dans un cadre
    Par dessinateurttuyen dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 18/07/2006, 17h52

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