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

Last change on this file since 86005 was 86005, checked in by sblanc@…, 6 years ago

suppression des appels de la fonction calcul_mysql_in() qui est dépréciée et remplacement par la fonction sql_in()

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