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 :

[entity] manipulation d'un champ


Sujet :

Symfony PHP

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2014
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 11
    Points : 2
    Points
    2
    Par défaut [entity] manipulation d'un champ
    Bonsoir à tous,

    je plante le décore! dans mon application, j'ai une entité appartement qui est constituée de divers champs.. (nombre de pièce, surface, etc.). j'ai une autre entité qui est appartImg qui est donc des images associés à un appartement.
    J'ai donc créé une relation OneToMany:

    dans l'entity appartement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
        /**
         * @ORM\OneToMany(targetEntity="appartImg", mappedBy="appartement")
         */
        protected $appartImg;
     
        public function __construct()
        {
            $this->products = new ArrayCollection();
        }
    dans l'entity appartImg
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        /**
         * @ORM\ManyToOne(targetEntity="appartement", inversedBy="appartImg")
         * @ORM\JoinColumn(name="photoid", referencedColumnName="id")
         */
        protected $appartement;
    par la suite j'ai donc crée dans mon controler tout ce qu'il faut pour uploader mes images comme indiqué dans la doc http://symfony.com/fr/doc/current/co...e_uploads.html

    dans l'entity il y à donc plusieurs fonction afin de gérer l'upload ( initialisation des path , puis bouger le fichier au bon endroit) cf

    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
     
        public function getAbsolutePath()
        {
            return null === $this->path ? null : $this->getUploadRootDir().'/'.$this->path;
        }
     
        public function getWebPath()
        {
            return null === $this->path ? null : $this->getUploadDir().'/'.$this->path;
        }
     
        protected function getUploadRootDir()
        {
            // le chemin absolu du répertoire où les documents uploadés doivent être sauvegardés
            return __DIR__.'/../../../../web/'.$this->getUploadDir();
     
        }
     
        protected function getUploadDir()
        {
            // on se débarrasse de « __DIR__ » afin de ne pas avoir de problème lorsqu'on affiche
            // le document/image dans la vue.
            // echo $this->getPhotoid(); .
            return '/img/appartements/';
        }
     
     
     
     
        /////////////////////////////////////////////////////////////////////////////////
     
        /**
         * @ORM\PrePersist()
         * @ORM\PreUpdate()
         */
        public function preUpload()
        {
            if (null !== $this->file) {
                // faites ce que vous voulez pour générer un nom unique
                $this->path = sha1(uniqid(mt_rand(), true)).'.'.$this->file->guessExtension();
            }
        }
     
        /**
         * @ORM\PostPersist()
         * @ORM\PostUpdate()
         */
        public function upload()
        {
            if (null === $this->file) {
                return;
            }
     
            // s'il y a une erreur lors du déplacement du fichier, une exception
            // va automatiquement être lancée par la méthode move(). Cela va empêcher
            // proprement l'entité d'être persistée dans la base de données si
            // erreur il y a
     
            $this->file->move($this->getUploadRootDir(), $this->path);
     
            unset($this->file);
        }
     
     
        /**
         * @ORM\PostRemove()
         */
        public function removeUpload()
        {
            if ($file = $this->getAbsolutePath()) {
                unlink($file);
            }
        }
    cela fonctionne parfaitement et mes photos sont bien dans /img/appartements/'.

    Maintenant mon but est d'uloader mes photos en fonction 'photoid' c'est a dire dans:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    /img/appartements/$photoid
    j'ai donc utilisé la fonction getPhotoid (créé par symfony) qui "devrait" me retourner mon $photoid et concaténer le tout:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
            protected function getUploadRootDir()
        {
            // le chemin absolu du répertoire où les documents uploadés doivent être sauvegardés
            return __DIR__.'/../../../../web/'.$this->getUploadDir();
     
        }
     
        protected function getUploadDir()
        {
            // on se débarrasse de « __DIR__ » afin de ne pas avoir de problème lorsqu'on affiche
            // le document/image dans la vue.
            // echo $this->getPhotoid(); .
            return '/img/appartements/'.$this->getphotoid();
        }
    voilà bien sur cela ne fonctionne pas mon image est toujours dans '/img/appartements/'

    Merci pour votre aide.


  2. #2
    Membre expert
    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
    Points : 3 004
    Points
    3 004
    Par défaut
    c'est dans le preupload que tu dois modifier le repertoire.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
        public function preUpload()
        {
            if (null!=$this->file && $this->getDoUpload()) {
                // faites ce que vous voulez pour générer un nom unique
                $this->path = 'monChemin'.'/'.$this->file->getClientOriginalName();
    ...

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2014
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 11
    Points : 2
    Points
    2
    Par défaut
    Merci Dukoid,

    oui je suis d'accord, mais je veux que mon chemin d'upload vari en fonction de mon $photoid qui est d'ailleurs l'id d'appartement!

    mon problème est que je n'arrive pas récup mon photoid même en appelant getPhotoid.

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2010
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2010
    Messages : 25
    Points : 34
    Points
    34
    Par défaut
    Un bundle qui peut te simplifier la tâche: https://github.com/dustin10/VichUplo...s/doc/index.md

    Il suffirait de définir un DirectoryNamer (service très simple) chargé de définir le nom du dossier.

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2014
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 11
    Points : 2
    Points
    2
    Par défaut
    ok merci, mais il y a pas moyen de faire ça directement sans ajouter un bundle?

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2014
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 11
    Points : 2
    Points
    2
    Par défaut
    Personne, pour une solution directement dans l'entity?

  7. #7
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Septembre 2009
    Messages
    875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2009
    Messages : 875
    Points : 1 313
    Points
    1 313
    Par défaut
    l'id est renseigné qu'une fois sauvegardé en base de données, donc c'est impossible.

    En gros tu lui demandes de uploader sous son id alors que son id n'existe pas a ce moment la...

  8. #8
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2014
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 11
    Points : 2
    Points
    2

  9. #9
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Septembre 2009
    Messages
    875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2009
    Messages : 875
    Points : 1 313
    Points
    1 313
    Par défaut
    Ah oui tu as raison, j'ai lu ton code en diagonal


    Si tu débug, comment est rempli ton entité dans ton postPersist?

  10. #10
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2014
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 11
    Points : 2
    Points
    2
    Par défaut
    Salut,

    alors pour tout te dire je bidouille dans symfony et je n'ai jamais utilisé le debugage...

    c'est donc le moment.... si tu as deux trois liens

    je continue mes investigations.

  11. #11
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Septembre 2009
    Messages
    875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2009
    Messages : 875
    Points : 1 313
    Points
    1 313
    Par défaut
    tu peux installer xdebug si ton IDE le permet pour avoir des points d'arret, sinon un bon vieux var_dump($variable);exit; dans ton entity pour connaitre son état au moment de l'insertion.
    Après les outils de debug en ligne de commandes concerne le routing et le container, tu as aussi le profiler qui te permet de connaitre le nombre de requete, tes variables globales etc...

  12. #12
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2014
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 11
    Points : 2
    Points
    2
    Par défaut
    ok je vais regarder.

    mais hier j'ai fait le test du move avec le $id de l'entité appartImg et ça marche très bien! de plus tout mes champs sont bien rempli dans la base de données...

    Comprend pas ou est le truc!

  13. #13
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Septembre 2009
    Messages
    875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2009
    Messages : 875
    Points : 1 313
    Points
    1 313
    Par défaut
    Ah, mais c'est peut être que ton dossier ID n'est pas créé avant le move()

    essaye un truc du genre juste avant le move

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    //si le repertoire de destination n'existe pas
    if(is_dir('path/to/dir') && !is_dir('path/to/dir/'.$id)) {
      mkdir('path/to/dir/'.$id));
    }

  14. #14
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2014
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 11
    Points : 2
    Points
    2
    Par défaut
    héhé,

    testé avec un dossier deja créé et sans dossier, c'est la même chose!

    de plus quand je mets un path en dur le move crée bien le dossier!!

  15. #15
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Septembre 2009
    Messages
    875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2009
    Messages : 875
    Points : 1 313
    Points
    1 313
    Par défaut
    si un path en dur ca marche alors le path dynamique est surement éronné. il n'y'a pas de / en trop, en moins? j'avoue que je seche un peu.

    Perso comme j'aime pas donner a ma classe entity la responsabilité de bouger des fichiers, et que je veux pas qu'elle est une quelconque connaissance des path d'uploads, je met tout ca ailleurs. J'ai jamais implémenté cette solution.

  16. #16
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2014
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 11
    Points : 2
    Points
    2
    Par défaut
    non je ne pense pas qu'il soit erroné car lorsque je lui mets ça:

    /fic1/web/img/12

    la photo est bien la mais lorsque je fmets ça

    /fic1/web/img/$idphoto

    le photo se retrouve ici

    /fic1/web/img/

    !!!

    sinon tu fais ça comment? sachant que la solution de déléguer ça un autre bundle que je devrais installer ne me réjouie pas!?

  17. #17
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Septembre 2009
    Messages
    875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2009
    Messages : 875
    Points : 1 313
    Points
    1 313
    Par défaut
    Pour moi, l'entité représente l'entité métier

    En gros j'ai un service appartement_service qui concentre les spécificités fonctionnelles relatives a l'entité appartement.
    ->bindAppartementForm($form); ne sert qu'a binder mes valeurs a mon entité, car je n'utilise pas les formulaires mappés aux entités.(le mappage n'est utile que pour des entités non complexes)

    Le contrôleur, avec ce qui nous interesse:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    if ($form->isValid() ) {
      //on récupère l'objet file
      $file= $form['input_file']->getData();
      //je récupère l'entité appartement pour lui binder les valeurs qui la concerne dans le formulaire (facultatif, voir notes)
      $appartement = $this->get('appartement_service')->bindAppartementForm($form);
     
      //je sauvegarde et enregistre le(s) fichier(s)
      try {
        $this->get('appartement_service')->createAppartement($appartement , $file);
        //message succès redirection etc..
      } catch(Exception $e) {
        //message erreur redirection etc...
    }
    Dans ce service appartement_service (il se fait injecter l'entity manager et le parameters path_appartement_file), j'ai createAppartement
    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
    public function createAppartement(Appartement $appartement, $file) {
         //on commence la transaction, j'ai pas envie que mon objet soit sauvegardé si on ne déplace pas le fichier, et inversement
         $this->em->getConnection()->beginTransaction();
          try {
              $this->em->persist($appartement);
              $this->em->flush();
              $file->move($this->path_appartement_file, $file->getClientOriginalName());
     
              $this->em->getConnection()->commit();
           } catch (\Exception $e) {
               //le rollback
               $this->em->getConnection()->rollback();
               throw $e;
            }
    }

Discussions similaires

  1. [WD9] Manipulation d'un champ combo
    Par infhaddar dans le forum WinDev
    Réponses: 6
    Dernier message: 15/06/2010, 19h32
  2. Problème de manipulation avec un champ Label
    Par Minos2 dans le forum Apple
    Réponses: 2
    Dernier message: 19/01/2010, 14h30
  3. manipulation d un champ de type datetime
    Par decisionnel dans le forum Langage SQL
    Réponses: 3
    Dernier message: 23/07/2009, 09h14
  4. manipulation complexe de champ
    Par PAYASS59 dans le forum Langage SQL
    Réponses: 5
    Dernier message: 24/09/2007, 16h42
  5. manipulation d'un champ de type Memo
    Par ivanleterrible dans le forum Bases de données
    Réponses: 6
    Dernier message: 29/05/2006, 21h53

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