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 :

Upload de fichier sans passer par l'entity [2.x]


Sujet :

Symfony PHP

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2012
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Octobre 2012
    Messages : 46
    Points : 34
    Points
    34
    Par défaut Upload de fichier sans passer par l'entity
    Bonjour a tous,

    Ma question peux vous paraître fort simple mais après avoir pas mal cherché, je n'ai malgré tout rien trouvé de concluent comme solution...

    Je possède un formulaire entièrement construit à la main:
    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
     
    class AdminProduitType extends AbstractType
    {
        public function buildForm(FormBuilderInterface $builder, array $options)
        {
            $builder->add('name', 'text')
                    ->add('description', 'textarea', array('required' => false))
                    ...
                    ->add('photo0', 'file', array('required' => false))
                    ->add('photo1', 'file', array('required' => false))
                    ->add('photo2', 'file', array('required' => false))
                    ->add('photo3', 'file', array('required' => false))
                    ->add('photo4', 'file', array('required' => false))
                    ...;
        }
    }
    voici l'action de mon controler:
    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
     
    public function produitnewAction(Request $request)
        {
            $request = $this->getRequest();
     
            //On genere le formulaire d'apres le TYPE
            $form = $this->createForm(new AdminProduitType());
     
            //Si le formulaire a été transmis
            if ($request->getMethod() == 'POST')
            {
                $form->bindRequest($request);
     
                //si le formulaire est valide
                if ($form->isValid()) {
                    //On prépare la requete
                    $em = $this->getDoctrine()->getManager();
     
                    //On recupere les donnees
                    $data = $form->getData();
     
                    //On récupère les infos
                    $Shopproduit = new ShopProduit();
                    $Shopproduit->setName($data['name']);
                    $Shopproduit->setDescription($data['description']);
     
                    //on recupère les photos
                    ????????????????????????????????????
     
                    //On persiste shopproduit
                    $em->persist($Shopproduit);
     
                    //On envoie tout dans la db
                    $em->flush();
     
                    //on prépare le FLASHTEXT
                    $this->get('session')->setFlash('flashtext', 'Produit créé avec id '.$Shopproduit->getId().' !');
     
                    //On redirige vers la liste des produits
                    return $this->redirect($this->generateUrl('KevinrolinbeShopBundle_AdminProduit'));
                }
            }
     
            return $this->render('KevinrolinbeShopBundle:Admin:adminProduitNew.html.twig', array('form' => $form->createView() ));
        }//End produitnewAction
    En lisant la doc ( http://symfony.com/fr/doc/current/re...ypes/file.html ) je suis arrivé à ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
                    $extension = $data['photo0']->guessExtension();
                    if (!$extension) {
                        // l'extension n'a pas été trouvée
                        $extension = 'bin';
                    }
                    $idph = 1; //uniquement pour l'exemple
                    $data['photo0']->move($dir, 'produit-'.$idph.'-photo0.'.$extension);
     
                    $shopphoto = new ShopPhoto();
                    $shopphoto->setName('produit-'.$idph.'-photo0.'.$extension);
                    $shopphoto->setPath($dir.'produit-'.$idph.'-photo0.'.$extension);
                    $em->persist($shopphoto);
    Mais il y a une chose qui m’échappe totalement c'est la variable $dir. que dois-je lui faire donner comme valeur?
    Mais aussi est ce que ce raisonnement est logique?
    Il est prévu que je répète ce code 5 fois afin d'upload mes 5 photos (en rajoutant bien entendu une vérification afin de m'assurer que le champ n'est pas vide.)

    Y aurait il un bundle me permettant de me facilité la vie ou vaut-il mieux rester sur cette idée?

    Merci à vous,
    Kevin

  2. #2
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 051
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hautes Pyrénées (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 051
    Points : 1 638
    Points
    1 638
    Par défaut
    La variable $dir contient le chemin où tu veux déposer ton image.

    Généralement moi je met une méthode upload() dans mon entité images qui s'occupe de l'upload.

    Exemple d'une entité image que j'utilise

    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
    <?php
     
    namespace Name\NewsBundle\Entity;
     
    use Doctrine\ORM\Mapping as ORM;
    use Symfony\Component\Validator\Constraints as Assert;
     
    /**
     * Name\NewsBundle\Entity\Image
     *
     * @ORM\Table(name="lf_images")
     * @ORM\Entity(repositoryClass="Name\NewsBundle\Entity\ImageRepository")
     */
    class Image
    {
        /**
         * @var integer $id
         *
         * @ORM\Column(name="id", type="integer")
         * @ORM\Id
         * @ORM\GeneratedValue(strategy="AUTO")
         */
        private $id;
     
        /**
         * @var string $url
         *
         * @ORM\Column(name="url", type="string", length=255)
         */
        private $url;
     
        /**
         * @var string $alt
         *
         * @ORM\Column(name="alt", type="string", length=255)
         */
        private $alt;
     
        /**
         * @Assert\File(maxSize="6000000")
         */
        public $file;
     
     
        /**
         * Get id
         *
         * @return integer 
         */
        public function getId()
        {
            return $this->id;
        }
     
        /**
         * Set url
         *
         * @param string $url
         * @return Image
         */
        public function setUrl($url)
        {
            $this->url = $url;
     
            return $this;
        }
     
        /**
         * Get url
         *
         * @return string 
         */
        public function getUrl()
        {
            return $this->url;
        }
     
        /**
         * Set alt
         *
         * @param string $alt
         * @return Image
         */
        public function setAlt($alt)
        {
            $this->alt = $alt;
     
            return $this;
        }
     
        /**
         * Get alt
         *
         * @return string 
         */
        public function getAlt()
        {
            return $this->alt;
        }
     
        public function getAbsolutePath()
        {
            return null === $this->url ? null : $this->getUploadRootDir().'/'.$this->url;
        }
     
        public function getWebPath()
        {
            return null === $this->url ? null : $this->getUploadDir().'/'.$this->url;
        }
     
        protected function getUploadRootDir()
        {
            // the absolute directory path where uploaded documents should be saved
            return __DIR__.'/../../../../web/'.$this->getUploadDir();
        }
     
        protected function getUploadDir()
        {
            // get rid of the __DIR__ so it doesn't screw when displaying uploaded doc/image in the view.
            return 'uploads/news';
        }
     
        protected function getExtension()
        {
            return $this->file->guessExtension();;
        }
     
        protected function getRandomeName()
        {
            $nom_fichier = '';			
    	for($i=0; $i<15; $i++) 
    		$nom_fichier .= chr(rand(0, 25) + ord('a'));
     
    	return "news_".$nom_fichier."_".time().".".$this->getExtension(); 
        }
     
        public function upload()
        {
            // Si l'image est null, on return direct null
            if (null === $this->file) {
                return;
            }
            $name_file = $this->getRandomeName();
            // on déplace la photo, en lui donnant un nom aléatoire
            $this->file->move($this->getUploadRootDir(), $name_file);
     
            // set the path property to the filename where you'ved saved the file
            $this->url = $name_file;
     
            $this->alt = "Actualité";
     
            // Vider l'image
            $this->file = null;
        }
    }
    Tu peux appeler la méthode pour chacune de tes images uploadé.
    Règle N° 1 : Si tout va bien, ne touchez à rien.

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2012
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Octobre 2012
    Messages : 46
    Points : 34
    Points
    34
    Par défaut
    Merci de ta réponse.

    pour le $dir, j'ignorais d'où devait partir le chemin mais ta réponse ma aidé a comprendre.


    Pour en revenir à ta solution. Je vais poser une question idiote:
    Comment fait-tu pour appeler la méthode que tu as créé dans le controler?

  4. #4
    Membre habitué
    Profil pro
    Développeur Web
    Inscrit en
    Avril 2010
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2010
    Messages : 141
    Points : 157
    Points
    157
    Par défaut
    ça ne t'aidera pas quant à ton problème mais concernant la question de bundle gérant l'upload, j'ai utilisé récemment celui-ci :
    https://github.com/punkave/symfony2-...ploader-bundle
    Bundle basé sur jQuery File Upload, permettant de gérer de l'upload de fichiers multiples, le tout en ajax, avec possibilité de redimensionnement d'images, etc...

  5. #5
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 051
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hautes Pyrénées (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 051
    Points : 1 638
    Points
    1 638
    Par défaut
    Citation Envoyé par dyron Voir le message
    Merci de ta réponse.

    pour le $dir, j'ignorais d'où devait partir le chemin mais ta réponse ma aidé a comprendre.


    Pour en revenir à ta solution. Je vais poser une question idiote:
    Comment fait-tu pour appeler la méthode que tu as créé dans le controler?
    Lorsque tu as ton champ d'upload à l'écran, tu valides un bouton qui t'envoies vers une action du contrôleur.

    A ce moment là, tu as ton objet image fonctionnel. Tu as juste à appliquer cette méthode depuis ton contrôleur. Moi je le fait depuis le Handler, vu que j'ai externalisé le traitement du formulaire (c'est dans les tutos ça).

    Mon code NewsHandler :
    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
    <?php
    
    namespace Name\NewsBundle\Form;
    
    use Symfony\Component\Form\Form;
    use Symfony\Component\HttpFoundation\Request;
    use Doctrine\ORM\EntityManager;
    use Name\NewsBundle\Entity\News;
    
    class NewsHandler
    {
        protected $form;
        protected $request;
        protected $em;
    
        public function __construct(Form $form, Request $request, EntityManager $em)
        {
            $this->form    = $form;
            $this->request = $request;
            $this->em      = $em;
        }
    
        public function process($type_action)
        {
            if( $this->request->getMethod() == 'POST' )
            {
                // On map le formulaire et la requête
                $this->form->bindRequest($this->request);
    
                if( $this->form->isValid() )
                {
                    //var_dump($this->form->getData());
                    $this->onSuccess($this->form->getData(), $type_action);
                        
                    return true;
                }
            }
    
            return false;
        }
    
        public function onSuccess(News $news, $type_action)
        {
            $this->em->persist($news);
            
            if('ajouter' == $type_action)
            {
                $news->getImage()->upload();
                $this->em->persist($news->getImage());
            }
            
            $this->em->flush();
        }
    }
    Pour infos, dans mes entités, chaque news contient une image. donc Mon formulaire est celui de news, auquel j'ai rajouté l'image.
    Règle N° 1 : Si tout va bien, ne touchez à rien.

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2012
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Octobre 2012
    Messages : 46
    Points : 34
    Points
    34
    Par défaut
    Un tout grand merci a toi pour tes conseils.

    Cette méthode me servira énormément.

    Merci a toi!
    Kevin

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 27/11/2014, 08h52
  2. Chargement de fichiers sans passer par la méthode POST
    Par arthur.moreau dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 9
    Dernier message: 20/06/2014, 14h13
  3. Upload de fichier sans passer par FTP
    Par Invité(e) dans le forum Applets
    Réponses: 2
    Dernier message: 06/06/2008, 11h16
  4. upload d'un fichier sans passer par <input type=file
    Par al3alwa dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 31/05/2007, 17h48
  5. Modifier une valeur dans un fichier sans passer par l'éditeur
    Par elkhy dans le forum Shell et commandes GNU
    Réponses: 3
    Dernier message: 09/06/2006, 00h15

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