source: spip-zone/_plugins_/_stable_/forms/forms2/inc/forms_export.php @ 7407

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

l'import csv dans les Tables de forms&tables gere les champs multiples.
A l'import, les donnees sont verifiees comme a la saisie et doivent respecter les memes contraintes

File size: 4.6 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
56                                foreach($t['choix'] as $choix=>$titre)
57                                        if (in_array($choix,$v))
58                                                $ligne[$champ][$choix] = strval($titre);
59                                        else
60                                                $ligne[$champ][$choix] = "";
61                        }
62                        else
63                                $ligne[] = strval(join(', ', $v));
64                }
65        }
66        return Forms_formater_ligne($ligne,$format,$separateur);
67}
68
69function Forms_formater_les_reponses($id_form, $format, $separateur, &$fichiers, &$filename, $head=true, $traduit=true){
70        //
71        // Telechargement du tableau de reponses au format CSV ou autre
72        // le support d'un autre format ne necessite que l'implementation de la fonction
73        // Forms_formater_ligne_xxx avec xxx le nom du format
74        //
75        $nb_reponses = 0;
76        $row = spip_fetch_array(spip_query("SELECT COUNT(*) AS tot FROM spip_forms_donnees WHERE id_form="._q($id_form)." AND confirmation='valide'"));
77        if ($row)       $nb_reponses = $row['tot'];
78
79        if (!$id_form || !autoriser('administrer','form',$id_form))
80                acces_interdit();
81
82        $result = spip_query("SELECT * FROM spip_forms WHERE id_form="._q($id_form));
83        if ($row = spip_fetch_array($result)) {
84                $titre = $row['titre'];
85                $descriptif = $row['descriptif'];
86                $type_form = $row['type_form'];
87        }
88
89        $filename = preg_replace(',[^-_\w]+,', '_', translitteration(textebrut(typo($titre))));
90
91        $s = '';
92        $structure = Forms_structure($id_form);
93       
94        if ($head) {
95                // Une premiere ligne avec les noms de champs
96                $ligne1 = $ligne2 = array();
97                $ligne1[] = $ligne2[] = 'id_donnee';
98                $ligne1[] = 'date';
99                $ligne2[] = _T("forms:date");
100                $ligne1[] = 'url';
101                $ligne2[] = _T("forms:page");
102                foreach ($structure as $champ => $t) {
103                        $ligne1[] = $champ;
104                        $ligne2[] = textebrut(typo($t['titre']));
105                        if ($t['type']=='multiple'){
106                                // pour un choix multiple on cree une colonne par reponse potentielle
107                                $choix = $t['choix'];
108                                foreach($t['choix'] as $choix=> $v){
109                                        $ligne1[] = $choix;
110                                        $ligne2[] = textebrut(typo($v));
111                                }
112                        }
113                }
114                $s .= Forms_formater_ligne($ligne1,$format,$separateur);
115                if ($traduit)
116                        $s .= Forms_formater_ligne($ligne2,$format,$separateur);
117        }
118
119        // Ensuite les reponses
120        $fichiers = array();
121        $id_donnee = 0;
122        $result = spip_query("SELECT r.id_donnee, r.date,r.url, c.champ, c.valeur ".
123                "FROM spip_forms_donnees AS r LEFT JOIN spip_forms_donnees_champs AS c USING (id_donnee) ".
124                "WHERE id_form="._q($id_form)." AND confirmation='valide' AND c.id_donnee IS NOT NULL ".
125                "ORDER BY date, r.id_donnee");
126        while ($row = spip_fetch_array($result)) {
127                if ($id_donnee != $row['id_donnee']) {
128                        if ($id_donnee)
129                                $s .= Forms_formater_reponse($ligne,$valeurs,$structure,$format,$separateur);
130                        $id_donnee = $row['id_donnee'];
131                        $date = $row['date'];
132                        $ligne = array();
133                        $ligne[] = $id_donnee;
134                        $ligne[] = jour($date).'/'.mois($date).'/'.annee($date);
135                        $ligne[] = str_replace("&amp;","&",$row['url']);
136                        $valeurs = array();
137                }
138                $champ = $row['champ'];
139                if ($structure[$champ]['type'] == 'fichier') {
140                        $fichiers[] = $row['valeur'];
141                        $valeurs[$champ][] = 'fichiers/'.basename($row['valeur']);
142                }
143                else {
144                        $v = $row['valeur'];
145                        if ($traduit AND isset($structure[$champ][$v])) $v = $structure[$champ][$v];
146                        else if ($traduit AND isset($structure[$champ]['choix'][$v])) $v = $structure[$champ]['choix'][$v];
147                        $valeurs[$champ][] = $v;
148                }
149        }
150
151        // Ne pas oublier la derniere reponse
152        if ($id_donnee)
153                $s .= Forms_formater_reponse($ligne,$valeurs,$structure,$format,$separateur);
154        return $s;
155}
156
157?>
Note: See TracBrowser for help on using the repository browser.