4 * version plug-in de spip_form
8 * adaptation en 182e puis plugin par cedric.morin@yterium.com
9 * © 2005,2006 - Distribue sous licence GNU/GPL
14 include_spip('inc/forms');
15 include_spip("inc/charsets");
16 include_spip("inc/presentation");
18 function csv_champ($champ) {
19 $champ = preg_replace(',[\s]+,', ' ', $champ);
20 $champ = str_replace(',",', '""', $champ);
21 return '"'.$champ.'"';
24 function csv_ligne($ligne,$delim=',') {
25 return join($delim, array_map('csv_champ', $ligne))."\r\n";
28 function formater_reponse($ligne, $structure, $valeurs,$delim=',') {
29 static $groupes, $mots;
31 // Prendre les differents champs dans l'ordre
32 foreach ($structure as $index => $t) {
33 if (!$v = $valeurs[$t['code']]) {
37 if ($t['type']=='multiple'){
38 // pour un choix multiple on cree une colonne par reponse potentielle
39 $type_ext = $t['type_ext'];
40 foreach($type_ext as $choix)
41 if (in_array($choix,$v))
42 $ligne[] = strval($choix);
47 $ligne[] = strval(join(', ', $v));
50 return csv_ligne($ligne,$delim);
53 function acces_interdit() {
54 debut_page(_T('avis_acces_interdit'), "documents", "forms");
57 echo "<strong>"._T('avis_acces_interdit')."</strong>";
64 // Telechargement d'un fichier particulier
66 function exec_forms_telecharger(){
67 $id_reponse = _request('id_reponse');
68 $id_form = _request('id_form');
69 $champ = _request('champ');
71 if ($id_reponse = intval($id_reponse) AND $champ) {
72 $result = spip_query("SELECT id_form FROM spip_reponses WHERE id_reponse=".spip_abstract_quote($id_reponse));
73 if ($row = spip_fetch_array($result)) {
74 $id_form = $row['id_form'];
76 if (!$id_form ||
!Forms_form_administrable($id_form)) {
79 $query = "SELECT structure FROM spip_forms WHERE id_form=$id_form";
80 $result = spip_query($query);
81 if ($row = spip_fetch_array($result)) {
82 $structure = unserialize($row['structure']);
85 foreach ($structure as $index => $t) {
86 if ($t['code'] == $champ) {
87 $ok = ($t['type'] == 'fichier');
94 $result = spip_fetch_array(spip_query("SELECT valeur FROM spip_reponses_champs WHERE id_reponse=$id_reponse AND champ='$champ'"));
95 $fichier = $result['valeur'];
96 if (is_int(strpos($fichier, "..")) ||
!preg_match(',^IMG/,', $fichier)) {
99 $filename = basename($fichier);
101 if (preg_match(',\.([^\.]+)$,', $fichier, $r)) {
103 $query = "SELECT * FROM spip_types_documents WHERE extension='".addslashes($ext)."'";
104 $result = spip_query($query);
105 if ($row = spip_fetch_array($result)) {
106 $mimetype = $row['mime_type'];
109 if (!$mimetype) $mimetype = "application/octet-stream";
110 $chemin = "../".$fichier;
111 if (!is_file($chemin)) {
115 Header("Content-Type: $mimetype");
116 Header("Content-Disposition: inline; filename=$filename");
117 Header("Content-Length :".filesize($chemin));
123 $delim = _request('delim');
124 if ($delim == 'TAB') $delim = "\t";
126 $retour = _request('retour');
128 $retour = urldecode($retour);
130 $retour = generer_url_ecrire('forms_tous');
132 $titre = _T("forms:telecharger_reponses");
134 $icone = "../"._DIR_PLUGIN_FORMS
."/img_pack/form-24.png";
136 debut_page($titre, "documents", "forms");
139 echo "<br /><br />\n";
142 debut_cadre_relief($icone);
145 echo _T("forms:format_fichier");
147 // Extrait de la table en commencant par les dernieres maj
148 echo generer_url_post_ecrire('forms_telecharger');
149 echo form_hidden(self());
150 echo "<select name='delim'>\n";
151 echo "<option value=','>"._T("forms:csv_classique")."</option>\n";
152 echo "<option value=';'>"._T("forms:csv_excel")."</option>\n";
153 echo "<option value='TAB'>"._T("forms:csv_tab")."</option>\n";
155 echo "<br /><br />\n";
156 echo "<input type='submit' name='ok' value='"._T("forms:telecharger")."' />\n";
166 echo "<div align='$spip_lang_right'>";
167 icone(_T('icone_retour'), $retour, $icone, "rien.gif");
176 // Telechargement du tableau de reponses au format CSV
178 $id_form = intval($id_form);
180 $query = "SELECT COUNT(*) FROM spip_reponses WHERE id_form=$id_form AND statut='valide'";
181 $result = spip_query($query);
182 list($nb_reponses) = spip_fetch_array($result,SPIP_NUM
);
184 else $nb_reponses = 0;
186 if (!$id_form ||
!Forms_form_administrable($id_form)) {
190 $query = "SELECT * FROM spip_forms WHERE id_form=$id_form";
191 $result = spip_query($query);
192 if ($row = spip_fetch_array($result)) {
193 $id_form = $row['id_form'];
194 $titre = $row['titre'];
195 $descriptif = $row['descriptif'];
196 $sondage = $row['sondage'];
197 $structure = unserialize($row['structure']);
200 $charset = $GLOBALS['meta']['charset'];
201 $filename = preg_replace(',[^-_\w]+,', '_', translitteration(textebrut(typo($titre))));
205 // Preparer la table de traduction code->valeur
208 foreach ($structure as $index => $t) {
211 $types[$code] = $type;
212 $trans[$code] = array();
214 if ($type == 'select' ||
$type == 'multiple') {
215 $trans[$code] = $t['type_ext'];
217 else if ($type == 'mot') {
218 $id_groupe = intval($t['type_ext']['id_groupe']);
219 $query = "SELECT id_mot, titre FROM spip_mots WHERE id_groupe=$id_groupe";
220 $result = spip_query($query);
221 while ($row = spip_fetch_array($result)) {
222 $id_mot = $row['id_mot'];
223 $titre = $row['titre'];
224 $trans[$code][$id_mot] = trim(textebrut(typo($titre)));
229 // Une premiere ligne avec les noms de champs
231 $ligne[] = _T("forms:date");
232 $ligne[] = _T("forms:page");
233 foreach ($structure as $index => $t) {
234 $ligne[] = textebrut(typo($t['nom']));
235 if ($t['type']=='multiple'){
236 // pour un choix multiple on cree une colonne par reponse potentielle
237 $type_ext = $t['type_ext'];
238 array_pop($type_ext);
239 foreach($type_ext as $choix)
243 $s .= csv_ligne($ligne,$delim);
246 // Ensuite les reponses
249 $query = "SELECT r.id_reponse, r.date,r.url, c.champ, c.valeur ".
250 "FROM spip_reponses AS r LEFT JOIN spip_reponses_champs AS c USING (id_reponse) ".
251 "WHERE id_form=$id_form AND statut='valide' AND c.id_reponse IS NOT NULL ".
252 "ORDER BY date, r.id_reponse";
253 $result = spip_query($query);
254 while ($row = spip_fetch_array($result)) {
255 if ($id_reponse != $row['id_reponse']) {
257 $s .= formater_reponse($ligne, $structure, $valeurs,$delim);
259 $id_reponse = $row['id_reponse'];
262 $date = $row['date'];
263 $ligne[] = jour($date).'/'.mois($date).'/'.annee($date);
264 $ligne[] = str_replace("&","&",$row['url']);
266 $champ = $row['champ'];
267 if ($types[$champ] == 'fichier') {
268 $fichiers[] = $row['valeur'];
269 //$valeurs[$champ][] = $GLOBALS['meta']['adresse_site']."/ecrire/forms_telecharger.php?id_reponse=$id_reponse&champ=$champ";
270 $valeurs[$champ][] = 'fichiers/'.basename($row['valeur']);
272 else if ($v = $trans[$champ][$row['valeur']])
273 $valeurs[$champ][] = $v;
275 $valeurs[$champ][] = $row['valeur'];
278 // Ne pas oublier la derniere reponse
280 $s .= formater_reponse($ligne, $structure, $valeurs,$delim);
288 # Excel n'accepte pas l'utf-8 ni les entites html... on fait quoi?
289 include_spip('inc/charsets');
290 $s = unicode2charset(charset2unicode($s), 'iso-8859-1');
291 $charset = 'iso-8859-1';
294 if (!count($fichiers)) {
295 Header("Content-Type: text/comma-separated-values; charset=$charset");
296 Header("Content-Disposition: attachment; filename=$filename.$extension");
297 //Header("Content-Type: text/plain; charset=$charset");
298 Header("Content-Length: ".strlen($s));
304 // S'il y a des fichiers joints, creer un ZIP
306 include_spip("inc/pclzip");
307 include_spip("inc/session");
309 $zip = "data/form".$id_form."_".rand().".zip";
310 $csv = "data/$filename.$extension";
312 $f = fopen($csv, "wb");
317 $fichiers = $chemin.join(",$chemin", $fichiers);
319 $archive = new PclZip($zip);
320 $archive->add($csv, PCLZIP_OPT_REMOVE_ALL_PATH
, PCLZIP_OPT_ADD_PATH
, $filename);
321 $archive->add($fichiers, PCLZIP_OPT_REMOVE_ALL_PATH
, PCLZIP_OPT_ADD_PATH
, $filename.'/fichiers');
323 Header("Content-Type: application/zip");
324 Header("Content-Disposition: attachment; filename=$filename.zip");
325 Header("Content-Length: ".filesize($zip));