source: spip-zone/_plugins_/forms/forms_et_tables_2_5/forms_fonctions-v1.php @ 65982

Last change on this file since 65982 was 65982, checked in by sblanc@…, 9 years ago
File size: 13.2 KB
Line 
1<?php
2// Fichier historique mal nommé pour spip V3
3// doit être inclus dans la partie public
4/*
5 * forms
6 * Gestion de formulaires editables dynamiques
7 *
8 * Auteurs :
9 * Antoine Pitrou
10 * Cedric Morin
11 * Renato
12 * © 2005,2006 - Distribue sous licence GNU/GPL
13 *
14 */
15
16        // if ($GLOBALS['spip_version_code']<1.92)
17                // include_spip('inc/forms_compat_191');
18        include_spip('forms_filtres');
19       
20        include_spip('inc/actions');
21include_spip('inc/actions_compat');
22
23if(!function_exists('ajax_action_auteur')) {
24
25        // Retourne un formulaire d'execution de $action sur $id,
26        // revenant a l'envoyeur $script d'arguments $args.
27        // Utilise Ajax si dispo, en ecrivant le resultat dans le innerHTML du noeud
28        // d'attribut  id = $action-$id (cf. AjaxSqueeze dans layer.js)
29        function ajax_action_auteur($action, $id, $script, $args='', $corps=false, $args_ajax='', $fct_ajax='') {
30                if (strpos($args,"#")===FALSE)
31                        $ancre = "$action-" . intval($id);
32                else
33                        list($args, $ancre) = explode("#",$args);
34                // Formulaire (POST)
35                // methodes traditionnelle et ajax a unifier...
36                if (is_string($corps)) {
37                        // Methode traditionnelle
38                        if (_SPIP_AJAX !== 1)
39                                return redirige_action_post($action, $id, $script, "$args#$ancre", $corps);
40                        // Methode Ajax
41                        else {
42                                if ($args AND !$args_ajax) $args_ajax = "&$args";
43                                if (isset($_GET['var_profile'])) $args_ajax .= '&var_profile=1';
44                                return redirige_action_post($action, $id, $action, "script=$script$args_ajax",
45                                        $corps, (" onsubmit=" . ajax_action_declencheur('this', $ancre, $fct_ajax)));
46       
47                        }
48                }
49                // Lien (GET)
50                else {
51                        $href = redirige_action_auteur($action, $id, $script, "$args#$ancre", false);
52                        if ($args AND !$args_ajax) $args_ajax = "&$args";
53                        if (isset($_GET['var_profile'])) $args_ajax .= '&var_profile=1';
54                        $ajax = redirige_action_auteur($action, $id, $action, "script=$script$args_ajax");
55                        $cli = array_shift($corps);
56                        return "<a href='$href'\nonclick=" .  ajax_action_declencheur($ajax, $ancre, $fct_ajax)
57                                . ">" . (!$corps ?  $cli : ("\n<span" . $corps[0] . ">$cli</span>")) . "</a>";
58                }
59        }
60}
61        function forms_calcule_les_valeurs($type, $id_donnee, $champ, $id_form, $separateur=" ",$etoile=false,$traduit=true){
62                static $raw_vals,$raw_id=0;
63                $lesvaleurs = array();
64                if (strncmp($champ,'joint_',6)!=0){
65                        if ($raw_id!=$id_donnee){
66                                $raw_vals = array();
67                                $res = spip_query("SELECT champ,valeur FROM spip_forms_donnees_champs WHERE id_donnee="._q($id_donnee));
68                                while ($row = spip_fetch_array($res)) $raw_vals[$row['champ']][] = $row['valeur'];
69                                $raw_id = $id_donnee;
70                        }
71                        if (isset($raw_vals[$champ]))
72                                foreach($raw_vals[$champ] as $val)
73                                        $lesvaleurs[] = (!$traduit)?$val:forms_calcule_valeur_en_clair($type, $id_donnee, $champ, $val, $id_form, $etoile);
74                        return implode($separateur,$lesvaleurs);
75                }
76                else 
77                        return forms_calcule_valeur_jointure($type, $id_donnee, $champ, $id_form, $separateur,$etoile);
78        }
79        function forms_calcule_valeur_jointure($type, $id_donnee, $champ, $id_form,$separateur,$etoile=false){
80                static $type_joint = array();
81                static $prefixi18n = array();
82                static $liste_table = array();
83                if (!isset($type_joint[$id_form][$champ])){
84                        $res = spip_query("SELECT extra_info FROM spip_forms_champs WHERE id_form="._q($id_form)." AND champ="._q($champ));
85                        if ($row = spip_fetch_array($res))
86                                $type_joint[$id_form][$champ] = $row["extra_info"];
87                        else return "";
88                }
89                $type = $type_joint[$id_form][$champ];
90                if (!isset($prefixi18n[$type]))
91                        $prefixi18n[$type] = forms_prefixi18n($type);
92                if (!isset($liste_table[$type])){
93                        include_spip("base/forms_base_api");
94                        $liste_table[$type] = implode(",",Forms_liste_tables($type));
95                }
96                include_spip("base/abstract_sql");
97                $in = calcul_mysql_in("d.id_form",$liste_table[$type]); 
98                $pre = $prefixi18n[$type];
99                $res = spip_query(
100                  "SELECT id_donnee_liee
101                  FROM spip_forms_donnees_donnees AS l
102                  JOIN spip_forms_donnees AS d ON d.id_donnee=l.id_donnee_liee
103                  WHERE $in AND l.id_donnee="._q($id_donnee));
104                //adapatation SPIP2
105                //$cpt = spip_num_rows($res);
106                $cpt =  sql_count($res);
107                $out = "";
108                if (!$etoile){
109                        if ($cpt==0) $out .= "";//_T("$pre:aucune_reponse");
110                        elseif ($cpt>5) $out .= _T("$pre:nombre_reponses",array('nombre'=>$cpt));
111                        //else if ($cpt==1) $out .= _T("$pre:une_reponse");
112                        else {
113                                while ($row = spip_fetch_array($res))
114                                        $out .= implode(" ",Forms_decrit_donnee($row['id_donnee_liee'])).$separateur;
115                        }
116                }
117                else {
118                        $out .="0";
119                        while ($row = spip_fetch_array($res))
120                                $out .= $separateur.$row['id_donnee_liee'];
121                }
122                return $out;
123        }
124       
125        function forms_format_monnaie($valeur,$decimales,$unite=true){
126                return sprintf("%.{$decimales}f",$valeur).($unite?"~EUR":"");
127        }
128       
129        function forms_calcule_valeur_en_clair($type, $id_donnee, $champ, $valeur, $id_form, $etoile=false){
130                static $structure=array();
131                // s'assurer que l'on est bien sur une boucle forms, sinon retourner $valeur
132                $ok = $id_donnee && $champ;
133                $ok = $ok && in_array($type, array('forms_donnees_champs','forms_champs','forms_donnees'));
134                // on recupere la valeur du champ si pas deja la
135                if ($ok && !$valeur){
136                        $res = spip_query("SELECT valeur FROM spip_forms_donnees_champs WHERE id_donnee="._q($id_donnee)." AND champ="._q($champ));
137                        if ($row = spip_fetch_array($res))
138                                $valeur = $row['valeur'];
139                        else
140                                $ok = false;
141                }
142                // on recupere le type du champ si pas deja fait (une seule requete par table et par champ)
143                if ($ok && !isset($structure[$id_form]))
144                        $structure[$id_form] = Forms_structure($id_form, false);
145                $rendu = 'typo';
146                if ($ok) {
147                        $t = $structure[$id_form][$champ]['type'];
148
149                        switch ($t) {
150                                case 'select':
151                                case 'multiple':
152                                        if (!isset($structure[$id_form][$champ]['choix'][$valeur])){
153                                                $res = spip_query("SELECT choix,titre FROM spip_forms_champs_choix WHERE id_form="._q($id_form)." AND champ="._q($champ));
154                                                while ($row = spip_fetch_array($res))
155                                                        $structure[$id_form][$champ]['choix'][$row['choix']] = $row['titre'];
156                                        }
157                                        if (isset($structure[$id_form][$champ]['choix'][$valeur]))
158                                                $valeur = $structure[$id_form][$champ]['choix'][$valeur];
159                                        break;
160                                case 'mot':
161                                        if (!isset($mots_s[$valeur])){
162                                                $res = spip_query("SELECT titre FROM spip_mots WHERE id_mot="._q($valeur));
163                                                if ($row = spip_fetch_array($res)) $mots_s[$valeur] = $row['titre'];
164                                                else $mots_s[$valeur] = $valeur;
165                                        }
166                                        $valeur = $mots_s[$valeur];
167                                        break;
168                                case 'password':
169                                        $rendu = "";
170                                        $valeur="******"; # ne jamais afficher en clair un password, si on veut vraiment le faire on utilise l'etoile sur le champ
171                                        break;
172                                case 'url':
173                                        $rendu = "calculer_url";
174                                        break;
175                                case 'num':
176                                case 'monnaie':
177                                        if (!$etoile) {
178                                                $valeur = forms_format_monnaie($valeur,$structure[$id_form][$champ]['taille'],$t=='monnaie');
179                                                $valeur = "<span class='numerique'>$valeur</span>";
180                                        }
181                                        break;
182                                case 'texte':
183                                        $rendu = 'propre';
184                                        break;
185                                case 'ligne':
186                                case 'separateur':
187                                case 'textestatique':
188                                        break;
189                                default :
190                                        if (!isset($GLOBALS['forms_types_champs_etendus']))
191                                                include_spip('inc/forms_type_champs');
192                                        if (isset($GLOBALS['forms_types_champs_etendus'][$t])
193                                          && isset($GLOBALS['forms_types_champs_etendus'][$t]['formate'])
194                                        )
195                                                foreach($GLOBALS['forms_types_champs_etendus'][$t]['formate'] as $formate)
196                                                        $valeur = preg_replace($formate['match'],$formate['replace'],$valeur);
197                                        break;
198                        }
199
200                        if (!$etoile AND $rendu)
201                                include_spip('inc/texte');
202                        $valeur = pipeline('forms_calcule_valeur_en_clair',
203                                array('args'=>array(
204                                        'valeur'=>$valeur,
205                                        'rendu'=>$rendu,
206                                        'wrap'=>$wrap_champ[$id_form][$champ],
207                                        'type'=>$type,
208                                        'id_donnee'=>$id_donnee,
209                                        'champ'=>$champ,
210                                        'id_form'=>$id_form,
211                                        'type_champ'=>$t,
212                                        'etoile'=>$etoile),'data'=>wrap_champ((!$etoile AND $rendu)?$rendu($valeur):$valeur,$structure[$id_form][$champ]['html_wrap']))
213                                );
214                }
215                return $valeur;
216        }
217        function forms_boite_jointure($id_donnee,$champ,$id_form){
218                if (!_DIR_RESTREINT && in_array(_request('exec'),$GLOBALS['forms_actif_exec'])){
219                        $forms_lier_donnees = charger_fonction('forms_lier_donnees','inc');
220                        $out = $forms_lier_donnees('donnee',"$id_donnee-$champ-$id_form",_request('exec'));
221                }
222                return $out;
223        }
224
225               
226        //
227        // Afficher le diagramme de resultats d'un sondage
228        //
229
230        function Forms_afficher_reponses_sondage($id_form) {
231                $r = '';
232                $id_form = intval($id_form);
233       
234                $result = spip_query("SELECT * FROM spip_forms WHERE id_form="._q($id_form));
235                if (!$row = spip_fetch_array($result)) return '';
236                $type_form = $row['type_form'];
237       
238                $r .= "<div class='spip_sondage'>\n";
239               
240                $res2 = spip_query("SELECT * FROM spip_forms_champs AS champs
241                WHERE id_form="._q($id_form)." AND type IN ('select','multiple','mot') ORDER BY champ");
242                while ($row2 = spip_fetch_array($res2)) {
243                        // On recompte le nombre total de reponses reelles
244                        // car les champs ne sont pas forcement obligatoires
245                        $row3=spip_fetch_array(spip_query("SELECT COUNT(DISTINCT c.id_donnee) AS num ".
246                                "FROM spip_forms_donnees AS r LEFT JOIN spip_forms_donnees_champs AS c USING (id_donnee) ".
247                                "WHERE r.id_form="._q($id_form)." AND r.confirmation='valide' AND r.statut='publie' AND c.champ="._q($row2['champ'])));
248                        if (!$row3 OR !($total_reponses=$row3['num']))
249                                continue;
250       
251                        // Construire la liste des valeurs autorisees pour le champ
252                        $liste = array();
253                        if ($row2['type'] != 'mot'){
254                                $res3 = spip_query("SELECT * FROM spip_forms_champs_choix WHERE id_form="._q($id_form)." AND champ="._q($row2['champ']));
255                                while ($row3=spip_fetch_array($res3))
256                                        $liste[$row3['choix']] = $row3['titre'];
257                        }
258                        else {
259                                $id_groupe = intval($row2['extra_info']);
260                                $res3 = spip_query("SELECT id_mot, titre FROM spip_mots WHERE id_groupe=$id_groupe ORDER BY titre");
261                                while ($row3 = spip_fetch_array($res3))
262                                        $liste[$row3['id_mot']] = $row3['titre'];
263                        }
264       
265                        // Nombre de reponses pour chaque valeur autorisee
266                        $query = "SELECT c.valeur, COUNT(*) AS num ".
267                                "FROM spip_forms_donnees AS r LEFT JOIN spip_forms_donnees_champs AS c USING (id_donnee) ".
268                                "WHERE r.id_form="._q($id_form)." AND r.confirmation='valide' AND r.statut='publie' ".
269                                "AND c.champ="._q($row2['champ'])." GROUP BY c.valeur";
270                        $result = spip_query($query);
271                        $chiffres = array();
272                        // Stocker pour regurgiter dans l'ordre
273                        while ($row = spip_fetch_array($result)) {
274                                $chiffres[$row['valeur']] = $row['num'];
275                        }
276                       
277                        // Afficher les resultats
278                        $r .= ($t=typo($row2['titre']))?"<strong>$t :</strong>":"";
279                        $r .= "<br />\n";
280                        $r .= "<div class='sondage_table'>";
281                        foreach ($liste as $valeur => $nom) {
282                                $r .= "<div class='sondage_ligne'>";
283                                $n = $chiffres[$valeur];
284                                $taux = floor($n * 100.0 / $total_reponses);
285                                $r .= "<div class='ligne_nom'>".typo($nom)." </div>";
286                                $r .= "<div style='width: 60%;'><div class='ligne_barre' style='width: $taux%;'></div></div>";
287                                $r .= "<div class='ligne_chiffres'>$n ($taux&nbsp;%)</div>";
288                                $r .= "</div>\n";
289                        }
290                        $r .= "</div>\n";
291                        $r .= "<br />\n";
292                }
293       
294                $query = "SELECT COUNT(*) AS num FROM spip_forms_donnees ".
295                        "WHERE id_form="._q($id_form)." AND confirmation='valide' AND statut='publie'";
296                $result = spip_query($query);
297                list($num) = spip_fetch_array($result,SPIP_NUM);
298                $r .= "<strong>"._T("forms:total_votes")." : $num</strong>";
299       
300                $r .= "</div>\n";
301               
302                return $r;
303        }
304
305
306        // construit une balise textarea avec la barre de raccourcis std de Spip.
307        // ATTENTION: cette barre injecte un script JS que le squelette doit accepter
308        // donc ce filtre doit IMPERATIVEMENT assurer la securite a sa place
309       
310        // http://doc.spip.org/@barre_textarea
311        function forms_textarea($texte, $rows, $cols, $name, $id='', $class='forml', $lang='', $active='') {
312                static $num_textarea = 0;
313                if ($active=='oui')
314                        include_spip('inc/layer'); // definit browser_barre
315                if ($id=='') {$id="textarea_$num_textarea";$num_textarea++;}
316       
317                $texte = entites_html($texte);
318                if (($active!='oui') || (!$GLOBALS['browser_barre']))
319                        return "<textarea name='$name' rows='$rows' class='$class' cols='$cols' id='$id'>$texte</textarea>";
320       
321                include_spip ('inc/barre');
322                return afficher_barre("document.getElementById('$id')", true, $lang) .
323                  "
324        <textarea name='$name' rows='$rows' class='$class' cols='$cols'
325        id='$id'
326        onselect='storeCaret(this);'
327        onclick='storeCaret(this);'
328        onkeyup='storeCaret(this);'
329        ondblclick='storeCaret(this);'>$texte</textarea>";
330        }
331       
332        function forms_label_details($type){
333                $out = "";
334                if ($type=='email') $out = _T("forms:champ_email_details");
335                if ($type=='url') $out = _T("forms:champ_url_details");
336                return pipeline('forms_label_details',array('args'=>array('type'=>$type),'data'=>$out));
337        }
338        function forms_input_champs($texte,$id_form,$type,$champ,$extra_info,$obligatoire,$env){
339                return pipeline('forms_input_champs',
340                        array(
341                                'args'=>array(
342                                        'type'=>$type,
343                                        'id_form'=>$id_form,
344                                        'champ'=>$champ,
345                                        'extra_info'=>$extra_info,
346                                        'obligatoire'=>$obligatoire,
347                                        'env'=>$env
348                                        ),
349                                'data'=>$texte
350                        )
351                );
352        }
353        function forms_ajoute_styles($texte){
354                return pipeline('forms_ajoute_styles',$texte);
355        }
356
357        if(!function_exists("mySel")){
358function mySel($varaut,$variable, $option = NULL) {
359        $res = ' value="'.$varaut.'"' . (($variable==$varaut) ? ' selected="selected"' : '');
360
361        return  (!isset($option) ? $res : "<option$res>$option</option>\n");
362}
363}
364?>
Note: See TracBrowser for help on using the repository browser.