Bonjour,
Je viens de me lancer dans un projet utilisant le framework symfony2, malheureusement je ne le gère encore que trop mal. Ce que j'ai voulu faire dans un premier temps, c'est uploader un fichier image dans le dossier web/img/uploads quand on créé un nouvel article. En suivant la docu officiel et son exemple, ça fonctionne !
Mais maintenant j'aimerais pouvoir uploader plusieurs images (multiple upload) et j'aimerais enregistrer dans la base de données de nouvelles entrées de la table "Picture" (donc plusieurs pictures pour un seul article). Pour ce faire je voulais m'organiser en 4 étapes. La première qui consistait à tester un simple upload a déjà été effectuée.
-La deuxième consiste à intégrer un système de multi upload afin de n'être plus limité à une seule et unique image par article.
-La troisième consiste à pouvoir modifier les images liées à un article directement via l'édition de l'article(editAction du controller ArticleController)
-La quatrième et dernière étape consiste à rajouter du jquery/javascript afin d'avoir un multi-uploader d'images correctes
Je suis à la deuxième étape, je n'arrive pas à faire du multi-upload, voici le code que j'ai actuellement :
Picture.php
Article.php
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 ... /** * Set article * * @param \EC\ArticlesBundle\Entity\Article $article * * @return Picture */ public function setArticle(\EC\ArticlesBundle\Entity\Article $article = null) { $this->article = $article; return $this; } /** * Get article * * @return \EC\ArticlesBundle\Entity\Article */ public function getArticle() { return $this->article; }
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 /** * @ORM\Column(type="array") */ private $links; public function getAbsolutePath() { return null === $this->link ? null : $this->getUploadRootDir().'/'.$this->link; } public function getWebPath() { return null === $this->link ? null : $this->getUploadDir().'/'.$this->link; } 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 up // when displaying uploaded doc/image in the view. return 'img/uploads'; } /** * @Assert\File(maxSize="6000000") */ private $file; /** * Sets file. * * @param UploadedFile $file */ public function setFile(UploadedFile $file = null) { $this->file = $file; } /** * Get file. * * @return UploadedFile */ public function getFile() { return $this->file; } public function upload() { foreach($this->files as $file) { $link = sha1(uniqid(mt_rand(), true)).'.'.$file->guessExtension(); array_push ($this->links, $link); $file->move($this->getUploadRootDir(), $link); unset($file); } // the file property can be empty if the field is not required if (null === $this->getFile()) { return; } // use the original file name here but you should // sanitize it at least to avoid any security issues // move takes the target directory and then the // target filename to move to $this->getFile()->move( $this->getUploadRootDir(), $this->getFile()->getClientOriginalName() ); // set the path property to the filename where you've saved the file $this->path = $this->getFile()->getClientOriginalName(); // clean up the file property as you won't need it anymore $this->file = null; }
ArticleController.php
Comme vous pouvez le voir je suis un peu perdu. J'ai regardé plusieurs topics sur le sujet sans vraiment comprendre comment marchait ce multiupload couplé avec une autre table.
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 public function createAction(Request $request) { $entity = new Article(); $form = $this->createCreateForm($entity); $form->handleRequest($request); if ($form->isValid()) { $em = $this->getDoctrine()->getManager(); $entity->upload(); $em->persist($entity); $em->flush(); return $this->redirect($this->generateUrl('ec_article_back_home', array('id' => $entity->getId()))); } return $this->render('ECArticlesBundle:Article/Admin:index.html.twig', array( 'entity' => $entity, 'form' => $form->createView(), )); } /** * Creates a form to create a Article entity. * * @param Article $entity The entity * * @return \Symfony\Component\Form\Form The form */ private function createCreateForm(Article $entity) { $form = $this->createFormBuilder($entity) ->setAction($this->generateUrl('admin_create')) ->setMethod('POST') ->add('title', 'text') ->add('description', 'text') ->add('front', 'text') ->add('back', 'text') ->add('link', 'text') ->add('file', 'file', array( 'multiple' => true, 'data_class' => null, )) ->add('save', 'submit', array('label' => 'Créer')) ->getForm(); return $form; }
Pourtant ce cas de figure doit être très courant, dans la plupart des projets nous sommes confrontés à une galerie contenant plusieurs images, donc si vous avez des exemples qui fonctionnent je suis bien entendu preneur.
Merci de m'avoir lu![]()
Partager