Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Pages: 1 2
Bien le bonjour à tous!
Je reviens vous enquiquiner encore, avec l'upload de plusieurs fichiers simultanément.
Après avoir fait des recherches sur le net, j'ai compris qu'il fallait utiliser le javascript pour arriver à mes fins. Malheureusement, je n'y connais pas grand chose en javascript, voir rien du tout... Donc j'ai trouvé le code d'un monsieur qui faisait exactement ce que je voulais, mais le problème vient ensuite dans la retranscription du code avec le Zend framework... Puisqu'avec le Zend_Form_Element_File, je n'arrive pas à récupérer les fichiers que j'ai 'uploadé', et il me retourne une erreur :
* The file '' could not be found * The file '' was not found
Et mon upload de fichier me donne ceci a chaque fois que je sélectionne un fichier:
Files : //code généré par le javascript Nom_du_fichier.extension [delete]
Logique, puisque du coup, rien n'est inscrit dans mon 'label' (le bout de texte avant le "parcourir...").
Donc je voulais savoir si je pouvais continuer dans cette voix, ou au contraire s'il existait quelque chose avec Zend pour pouvoir le faire plus simplement?
Dernière modification par Chim (13-01-2009 15:00:56)
Hors ligne
non tu n'a pas besoin de javascript
un form avec un multipart et suffisant il suffit d'avoir plusieurs champs file dans le form
et côté serveur php le gère dans un tableau de fichiers
A+JYT
Hors ligne
Hmm Est-ce que je pourrais avoir un peu plus d'informations s'il vous plait? :$
Je suis désolé, j'y connais pas grand chose
Au niveau du 'plusieurs champs file dans le form' je voudrais qu'il s'en affiche autant que ce que l'utilisateur veut en uploader...
Hors ligne
En gros, tu voudrais créer un bouton "Ajouter un autre fichier" qui ajouterais automatiquement un champ FILE à ton formulaire ?
Hors ligne
Ouaip, et ensuite savoir comment le récupérer ensuite (j'imagine que ce serait dans un tableau...?)
Hors ligne
En fait le problème c'est que si tu ne le fais qu'en Javascript (donc ajouter "dynamiquement" un champ FILE à ton formulaire), Zend_Form ne saura pas le gérer et générera des erreurs.
Donc il te faut, lors du POST de ton formulaire, ajouter dynamiquement un champ à ton Zend_Form afin que tu puisses l'utiliser dans tes traitements.
Mais bon le but est aussi de procéder par étape :
- Ajouter des champs FILE en Javascript
- Ajouter des champs à ton Zend_Form
- Traitement des champs
Es-tu à l'étape 1 ou est-ce que c'est ok ?
Pour info, tous les fichiers uploadés seront disponibles en PHP (après le POST du formulaire) dans le tableau $_FILES et pas $_POST.
Dernière modification par acharrex (07-01-2009 18:29:28)
Hors ligne
Hum je sens que je cerne le probleme de plus en plus, merci de votre aide
Sinon, pour la premiere etape, mon script ne fait que rajouter le nom des fichiers à uploader, donc je n'ai toujours qu'un seul champs FILE...
Hors ligne
Tiens j'ai dut faire face a ce probleme, moi c'etait pour des textbox, a quelques differences pres ca doit etre la meme chose
Le code javascript :
i=0; function addchamp() { var Obj = document.getElementById ( 'formress') ; if( Obj) { var pname=document.createElement("input"); pname.type="text"; pname.name="ressource_new"+i; Obj.appendChild( pname); i++; } }
C'est tout simple, je suis pas tres bon en javascript, j'imagine ca peut etre optimisé.
Hors ligne
Je te remercie pour ce bout de code, et j'imagine qu'il faut que je le mette dans ma vue? C'est-a-dire à mon ajouternews.phtml, ou directement dans mon layout? Je pensais plus à l'inclure juste avant de faire un echo de mon form...
Hors ligne
Tu peux le mettre soit dans ta vue soit dans un script JS que tu appeleras dans le header de ta page (entre les balises <head>).
Et sur ton bouton "Ajouter un autre fichier" rajoute un évènement "onclick" dans lequel tu appeleras ta fonction "addchamp".
Hors ligne
Hmm je vais reprendre un peu pour vous montrer où j'en suis...
Mon ajouternews.phtml
<form name="form" action="<?= $this->escape($this->form->getAction() ?>" method="<?= $this->escape($this->form->getMethod() ?>"> <?php echo $this->form->id; echo $this->form->titre; echo $this->form->statut; echo $this->form->section; echo $this->form->news; echo $this->form->file; ?> <input type="button" name="coco" value="Ajouter un fichier" onClick="javascript:addchamp()"> <?php echo $this->form->submit; ?></form>
Edit: J'ai aussi oublié mon addchamp() (enfin celui de Guillhomme) que voila :
<script language="JavaScript"> i=0; function addchamp() { var Obj = document.getElementById ('form') ; if( Obj) { var pname=document.createElement("input"); pname.type="file"; pname.name="file"+i; Obj.appendChild( pname); i++; } } </script>
Mais la, ça ne marche pas non plus
Donc j'ai loupé un truc quelque part, mais quoi??
Dernière modification par Chim (08-01-2009 17:50:56)
Hors ligne
document.getElementById ('form') ;
recherche un élément portant comme attribut un id avec la valeur "form". Or cela n'est pas le cas dans ta vue.
Hors ligne
J'avais pas fait attention à cela merci
Mais ca ne marche toujours pas
J'ai remplacé par :
var Obj = document.getElementById ('file') ;
Et lorsque je clique sur mon bouton ajouter un fichier, rien ne se passe...
Est-ce qu'il y aurait un problème au niveau de l'appel de ma fonction, sur le onClick? Comment procède-t-on pour appeler une fonction en JS? onClick="javascript:addchamp()" ou tout simplement onClick="addchamp()" ?
Merci pour vos réponses
Hors ligne
Je crois que les deux fonctionnent.
Si ce n'est pas encore fait, je te conseil grandement d'installer sous Firefox la barre Web Developper, t'as un bouton a droite qui te previent dès qu'une erreur javascript survient avec la ligne et un message pour le debuggage, tres pratique ( Firebug le fait peut etre aussi )
Hors ligne
Merci pour l'info, mais je n'ai aucune erreur notable -__-
Donc pour le moment j'ai fait une solution de secours en mettant 3 champs de type 'file' dans mon NewsForm, mais si l'utilisateur veut en uploader plus, eh bien je serais dans la ...... ^^
Hors ligne
Je viens de tester et ce code ne semble pas poser de soucis (Firefox 3, IE 6/7) :
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> <title>Add Field</title> <meta http-equiv="content-type" content="text/html; charset=utf-8" /> <script type="text/javascript"> var fileId = 0; function addField() { var container = document.getElementById('files'); if ( container ) { var input = document.createElement('input'); input.type = 'file'; input.name = 'file' + fileId; container.appendChild(input); fileId++; } } </script> </head> <body> <form action="" method="post" name="uploadForm"> <div id="files"> <input type="file" name="file" /> </div> <input type="button" onclick="addField()" value="Add another file" /> </form> </body> </html>
Dernière modification par acharrex (09-01-2009 13:02:58)
Hors ligne
Je te remercie, j'avais pas le <div id="files"> , donc ça risquait pas de marcher..
Mais maintenant, pour récupérer les éléments uploadés, j'ai essayé ça:
if (!$form->file->receive()) { print "Error"; } else { print " Transfer Okey ! "; $fichier = $form->file->getFileName('file'); $fichier1 = $form->file1->getFileName('file1'); $fichier2 = $form->file2->getFileName('file2'); $row->file = basename($fichier).",".basename($fichier1).",".basename($fichier2); }
Je pense bien que c 'est pas le top, mais je sais pas non plus comment pouvoir le récupérer?
A la base, ce code était pour mes 3 uploads de 'base'... Mais je vois pas comment l'implémenter différemment pour le moment...
Hors ligne
Tu fais un "foreach" sur le tableau $_FILES et tu crées pour chacun des fichiers un champ dans Zend_Form :
<?php foreach ( $_FILES as $file ) { // field creation }
Hors ligne
Humm quelque chose me titille un peu... Pourquoi faire un champ pour chacun des fichiers uploadés? Je comprends pas comment je peux le faire, sachant que normalement quand j'appuierai sur Submit, il va prendre les infos avec le 'premier' formulaire non?
Hors ligne
Non parce que dans ton contrôleur, tu testes d'abord si le formulaire a été envoyé puis si ses données sont valides.
En gros tu fais ça :
if ( $this->getRequest()->isPost() ) { if ( $form->isValid($_POST) ) { $model->saveData($form->getValues()); } }
Donc si tu crées ton formulaire après le "$this->getRequest()->isPost()" tu pourras lui ajouter tous tes champs FILE (créé dynamiquement en JS) et les récupérer grâce à la méthode "getValues()".
Dernière modification par acharrex (09-01-2009 17:27:24)
Hors ligne
Ok, je vois ce que tu veux dire, mais je sais pas comment le retranscrire en code >_<
J'ai essayé cela mais ça ne marche pas...
if ($this->_request->isPost()) { $formData = $this->_request->getPost(); $formulaire = new NewsForm(); $formulaire->addElement('file', 'file0'); $formulaire->addElement('file', 'file1'); if ($form->isValid($formData)) {
Je ne suis pas sûr qu'il faille faire comme ça, et je ne vois pas comment je pourrais le faire
Et je comprends pas comment je peux lui dire qu'il faille en créer autant que ce que le script JS en a créé...
Un for certainement, mais après... Le trou noir...
Hors ligne
Compliques-toi pas trop la vie.
Ton formulaire contiendra les champs "file0", "file1", "file2", "fileXXX" selon le nombre de fichiers que souhaite uploader l'utilisateur.
Donc après l'avoir envoyé, tu pourras récupérer dans ton contrôleur/modèle un tableau comme celui-ci :
Array ( [file0] => Array ( [name] => file.docx [type] => application/vnd.openxmlformats-officedocument.wordprocessingml.document [tmp_name] => D:\xampp\tmp\php8124.tmp [error] => 0 [size] => 477655 ) [file1] => Array ( [name] => file.txt [type] => text/plain [tmp_name] => D:\xampp\tmp\php8164.tmp [error] => 0 [size] => 172 ) )
Ces données sont stockées dans le tableau superglobal $_FILES. Comme tu peux l'imaginer un simple foreach sur ce dernier te permettra de créer tes champs :
<?php foreach ( $_FILES as $field => $file ) { $form->addElement("file", $field); }
Ca te semble plus clair ?
Dernière modification par acharrex (10-01-2009 16:53:08)
Hors ligne
Bin ouais je savais bien qu'un foreach s'imposait, mais je ne savais pas comment le remplir... Merci a toi pour toutes ces explications J'éditerai si cela fonctionne!
Edit: Héhé, je sais pas si j'avais pensé à tout, parce que ça ne marche toujours pas...
Voila les erreurs transmises:
Notice: Undefined index: name in C:\wamp\www\zfmvc-projetIntra\library\Zend\File\Transfer\Adapter\Abstract.php on line 1147 Notice: Undefined index: tmp_name in C:\wamp\www\zfmvc-projetIntra\library\Zend\File\Transfer\Adapter\Abstract.php on line 577 Warning: Invalid argument supplied for foreach() in C:\wamp\www\zfmvc-projetIntra\library\Zend\Validate\File\Count.php on line 217 Notice: Undefined index: tmp_name in C:\wamp\www\zfmvc-projetIntra\library\Zend\File\Transfer\Adapter\Abstract.php on line 577 Notice: Undefined index: name in C:\wamp\www\zfmvc-projetIntra\library\Zend\Validate\File\Size.php on line 366 Notice: Undefined index: tmp_name in C:\wamp\www\zfmvc-projetIntra\library\Zend\File\Transfer\Adapter\Abstract.php on line 577 Notice: Undefined index: name in C:\wamp\www\zfmvc-projetIntra\library\Zend\Validate\File\Extension.php on line 198
Et voila le code qui va avec:
if ($this->_request->isPost()) { $formData = $this->_request->getPost(); foreach ( $_FILES as $field => $file ) { $form->addElement("file", $field); } if ($form->isValid($formData)) { $news = new News(); $row = $news->createRow(); if (!$form->file->receive()) { print "Error"; } else { print " Transfer Okey ! "; $fichier = $form->file->getFileName(); $row->file = basename($fichier); } }
Dernière modification par Chim (10-01-2009 17:51:51)
Hors ligne
C'est bon j'ai réussi ! ^^ Merci a tous!
je vous met le code qui me permet d'uploader autant de fichiers que je veux ^^
if ($this->_request->isPost()) { $nbFile=0; $formData = $this->_request->getPost(); foreach ( $_FILES as $field => $file ) { $form->addElement("file", $field); $nbFile++; } if ($form->isValid($formData)) { $news = new News(); $row = $news->createRow(); if (!$form->file->receive()) { print "Error"; } else { print " Transfer Okey ! "; foreach ( $_FILES as $field => $file ) { if(basename($field['name'])=="TEMP"){ $fichier_temp = $_FILES[$field]['tmp_name']; $fichier = $_FILES[$field]['name']; move_uploaded_file($fichier_temp,'C:/wamp/www/zfmvc-projetIntra/file/'.$fichier); } } echo $nbFile; Zend_debug::dump($_FILES); if(basename($form->file->getFileName('file')!="TEMP")){ $fichier[] = $form->file->getFileName('file'); for($a=0;$a<$nbFile-1;$a++){ $file = 'file'.$a; $fichier[] = $form->file->getFileName($file); } } for($b=0;$b<count($fichier);$b++){ if($row->file != "TEMP" && basename($fichier[$b] != "TEMP")){ if(empty($row->file) && basename($fichier[$b])!="TEMP"){ $row->file = basename($fichier[$b]); } else if(basename($fichier[$b])!="TEMP"){ $row->file = $row->file.','.basename($fichier[$b]); } } } } $row->save();
C'est peut etre pas forcément parfait au niveau du code, mais au moins ça marche ^^ encore merci à tous ceux qui m'ont aidé ^^
Hors ligne
Bonjour tout le monde!
J'ai un dernier petit problème... Mon upload ne prend qu'à partir du deuxième fichier. Donc, lorsque j'upload un fichier, rien n'est uploadé dans mon répertoire... Et lorsque j'en upload 2 ou plus, le premier ne s'uploadera pas, alors qu'il sera par contre, inscrit dans la base... (j'entends par là le nom du fichier)
Et lorsque j'essaie le même code pour l'upload sur une vue, l'upload fonctionne niquel... Mais je ne pense pas que ce soit super au top de mettre un upload de fichier dans la vue
Le code à l'appui est juste au dessus de ce post...
Si vous avez des pistes pour m'expliquer pourquoi il ne veut uploader qu'à partir du second fichier... Merci d'avance ^^
Hors ligne
Pages: 1 2