source: spip-zone/_plugins_/_stable_/forms/forms_et_tables_1_9_1/inc/forms_export.php @ 7912

Last change on this file since 7912 was 7912, checked in by cedric@…, 14 years ago

l'export csv perdait les champs multiples ! (alexandre Praz, Stephane Laurent)

File size: 4.7 KB
Line 
1<?php
2/*
3 * forms
4 * Gestion de formulaires editables dynamiques
5 *
6 * Auteurs :
7 * Antoine Pitrou
8 * Cedric Morin
9 * Renato
10 * © 2005,2006 - Distribue sous licence GNU/GPL
11 *
12 */
13
14
15include_spip('inc/forms');
16include_spip("inc/charsets");
17include_spip("inc/presentation");
18if (!include_spip('inc/autoriser'))
19        include_spip('inc/autoriser_compat');
20
21function csv_champ($champ) {
22        $champ = preg_replace(',[\s]+,', ' ', $champ);
23        $champ = str_replace(',",', '""', $champ);
24        return '"'.$champ.'"';
25}
26
27function Forms_formater_ligne_csv($ligne,$delim=',') {
28        $out = "";
29        foreach($ligne as $val){
30                if (is_array($val))
31                        foreach($val as $v) $out .= csv_champ($v).$delim;
32                else
33                        $out .= csv_champ($val).$delim;
34        }
35        $out = substr($out,0,strlen($out)-strlen($delim))."\r\n";
36        return $out;
37}
38
39function Forms_formater_ligne($ligne,$format,$separateur){
40        if (function_exists($f = "Forms_formater_ligne_$format"))
41                return $f($ligne,$separateur);
42        else
43                return Forms_formater_ligne_csv($ligne,$separateur);
44}
45
46function Forms_formater_reponse($ligne, $valeurs, $structure,$format,$separateur) {
47        // Prendre les differents champs dans l'ordre
48        foreach ($structure as $champ => $t) {
49                if (!isset($valeurs[$champ])) {
50                        $ligne[$champ] = "";
51                }
52                else{
53                        $v = $valeurs[$champ];
54                        if ($t['type']=='multiple'){
55                                // pour un choix multiple on cree une colonne par reponse potentielle, plus une vide avant
56                                $ligne[$champ][] = "";
57                                foreach($t['choix'] as $choix=>$titre)
58                                        if (isset($v[$choix]))
59                                                $ligne[$champ][$choix] = $v[$choix];
60                                        else
61                                                $ligne[$champ][$choix] = "";
62                        }
63                        else
64                                $ligne[] = strval(join(', ', $v));
65                }
66        }
67        return Forms_formater_ligne($ligne,$format,$separateur);
68}
69
70function Forms_formater_les_reponses($id_form, $format, $separateur, &$fichiers, &$filename, $head=true, $traduit=true){
71        //
72        // Telechargement du tableau de reponses au format CSV ou autre
73        // le support d'un autre format ne necessite que l'implementation de la fonction
74        // Forms_formater_ligne_xxx avec xxx le nom du format
75        //
76        $nb_reponses = 0;
77        $row = spip_fetch_array(spip_query("SELECT COUNT(*) AS tot FROM spip_forms_donnees WHERE id_form="._q($id_form)." AND confirmation='valide'"));
78        if ($row)       $nb_reponses = $row['tot'];
79
80        if (!$id_form || !autoriser('administrer','form',$id_form))
81                acces_interdit();
82
83        $result = spip_query("SELECT * FROM spip_forms WHERE id_form="._q($id_form));
84        if ($row = spip_fetch_array($result)) {
85                $titre = $row['titre'];
86                $descriptif = $row['descriptif'];
87                $type_form = $row['type_form'];
88        }
89
90        $filename = preg_replace(',[^-_\w]+,', '_', translitteration(textebrut(typo($titre))));
91
92        $s = '';
93        $structure = Forms_structure($id_form);
94       
95        if ($head) {
96                // Une premiere ligne avec les noms de champs
97                $ligne1 = $ligne2 = array();
98                $ligne1[] = $ligne2[] = 'id_donnee';
99                $ligne1[] = 'date';
100                $ligne2[] = _T("forms:date");
101                $ligne1[] = 'url';
102                $ligne2[] = _T("forms:page");
103                foreach ($structure as $champ => $t) {
104                        $ligne1[] = $champ;
105                        $ligne2[] = textebrut(typo($t['titre']));
106                        if ($t['type']=='multiple'){
107                                // pour un choix multiple on cree une colonne par reponse potentielle
108                                $choix = $t['choix'];
109                                foreach($t['choix'] as $choix=> $v){
110                                        $ligne1[] = $choix;
111                                        $ligne2[] = textebrut(typo($v));
112                                }
113                        }
114                }
115                $s .= Forms_formater_ligne($ligne1,$format,$separateur);
116                if ($traduit)
117                        $s .= Forms_formater_ligne($ligne2,$format,$separateur);
118        }
119
120        // Ensuite les reponses
121        $fichiers = array();
122        $id_donnee = 0;
123        $result = spip_query("SELECT r.id_donnee, r.date,r.url, c.champ, c.valeur ".
124                "FROM spip_forms_donnees AS r LEFT JOIN spip_forms_donnees_champs AS c USING (id_donnee) ".
125                "WHERE id_form="._q($id_form)." AND confirmation='valide' AND c.id_donnee IS NOT NULL ".
126                "ORDER BY date, r.id_donnee");
127        while ($row = spip_fetch_array($result)) {
128                if ($id_donnee != $row['id_donnee']) {
129                        if ($id_donnee)
130                                $s .= Forms_formater_reponse($ligne,$valeurs,$structure,$format,$separateur);
131                        $id_donnee = $row['id_donnee'];
132                        $date = $row['date'];
133                        $ligne = array();
134                        $ligne[] = $id_donnee;
135                        $ligne[] = jour($date).'/'.mois($date).'/'.annee($date);
136                        $ligne[] = str_replace("&amp;","&",$row['url']);
137                        $valeurs = array();
138                }
139                $champ = $row['champ'];
140                if ($structure[$champ]['type'] == 'fichier') {
141                        $fichiers[] = $row['valeur'];
142                        $valeurs[$champ][] = 'fichiers/'.basename($row['valeur']);
143                }
144                else {
145                        $v = $row['valeur'];
146                        if (isset($structure[$champ]['choix'][$v])){
147                                $vt = $v;
148                                if ($traduit) $vt = $structure[$champ]['choix'][$v];
149                                $valeurs[$champ][$v] = $vt;
150                        }
151                        else{
152                                if ($traduit AND isset($structure[$champ][$v])) $v = $structure[$champ][$v];
153                                $valeurs[$champ][] = $v;
154                        }
155                }
156        }
157
158        // Ne pas oublier la derniere reponse
159        if ($id_donnee)
160                $s .= Forms_formater_reponse($ligne,$valeurs,$structure,$format,$separateur);
161        return $s;
162}
163
164?>
Note: See TracBrowser for help on using the repository browser.