Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Bonjour tout le monde,
alors aujourd'hui, j'ai un problème d'export CSV, et çà fait plusieurs heures que je m'arrache la tête dessus.
Dans ma vue, j'ai un lien export CSV, qui appelle une function javascript/jquery :
Je lui passe en paramètre mes données à exporter au format csv (je lui passe en json).
Voici le Json passé en paramètre
{"0": [ "nom_eleve", "prenom_eleve", "nom_parent", "prenom_parent", "adresse", "date" ],"1": ["Test","Test","Test","Test","xxxxxx",""],"2": ["","","Test","Test","xxxxxx",""]}
J'ai vérifié sous json lint, il est valide, pas de souci.
L'action déclenché dans mon controlleur est :
public function printcsvAction() { $this->_helper->layout->disableLayout(); $this->_helper->viewRenderer->setNeverRender(); //$this->_helper->viewRenderer->setNoRender(); $json = $this->_getParam('liste'); $json = stripslashes($json); //$json = utf8_encode($json); $liste = json_decode($json, true); $csv = ''; foreach($liste as $ligne) { foreach($ligne as $enregistrement) { $csv .= $enregistrement.';'; } $csv.="\n"; } header("Content-Type: application/csv-tab-delimited-table"); header("Content-disposition: attachement; filename=nom_fichier.csv"); print($csv); }
Le résultat de ma requête ajax est un succès (çà passe par success).
Mais çà ne me propose pas de télécharger le fichier, j'ai par contre via firebug vu le résultat de mon action.
La réponse est :
nom_eleve;prenom_eleve;nom_parent;prenom_parent;adresse;date; Test;Test;Test;Test;xxxxxxx;; ;;Test;Test;xxxxxxx;;
(Oui il y a des fois des champs vide, mais c'est normal :p)
Je suis allé voir sur plein de sites pour changer les headers, tenté de les passer en force-download, etc ...
Rien à y faire.
Et apparemment, d'après le post http://www.z-f.fr/forum/viewtopic.php?id=5003
il est bien possible de ne pas passer par un fichier temporaire.
Je préfére en effet faire le csv à la volée.
PS : je changerais mon code en $this->getResponse()->setHeader(...) quand déjà çà marchera sous FF :p
Voila, aidez moi les gens je pete un cable.
Merci d'avance
Dernière modification par Wiinner (20-05-2010 15:19:04)
Hors ligne
il ne faut pas faire un appel ajax mais ouvrir l'url
il ne faut pas que ce soit l'objet XMLHTTPRequest qui fasse l'appel car sinon il lit le flux
il faut simplement faire un widows.location=
ainsi ton action est invoqué par le navigateur qui lui à le droit de télécharger
si ton action envoie une réponse genre
$this->_response->setHeader('Pragma' , 'public', true); $this->_response->setHeader('Cache-Control', 'max-age=0', true); $this->_response->setHeader('Content-Type', 'application/javascript; charset=iso-8859-1; name="' . $data->site_name . '"', true); $this->_response->setHeader('Content-Transfer-Encoding', 'binary', true); $this->_response->setHeader('Content-disposition', 'attachment; filename="'.$data->site_name.'.txt"', true);
alors le navigateur propose le chargement du fichier et ne change pas l'url de la page en cours
tu peux aussi si tu as peur que ça perturbe ta page ajouter un iframe caché et c'est sur ce dernier que tu mets ton url
n'oublie pas deux chose dans ton header
'Content-Type', 'application/javascript; charset=iso-8859-1; name="' . $data->site_name . '"'
avec le nom du fichier (pour IE dans certaine version)
et
'Content-disposition', 'attachment; filename="'.$data->site_name.'.txt"'
et le mot attachement qui est nécessaire. certain navigateur ne prennent pas le fichier s'il n'est pas là
A+JYT
Dernière modification par sekaijin (18-05-2010 18:08:38)
Hors ligne
Merci beaucoup.
En effet, comme tu le précisais, cela vient de l'ajax dans mon cas.
J'ai donc fait comme tu me l'as indiqué, et je suis passé par un window.location
Merci encore, je met en résolu.
Hors ligne