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

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

"bug d'autorisation dans les liaisons (dangereuses ?)
enrichissement de l'api"

File size: 33.1 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        if ($GLOBALS['spip_version_code']<1.92)
15                include_spip('inc/forms_compat_191');
16
17        function _Forms_install(){
18                if ($GLOBALS['spip_version_code']<1.9204){
19                        include_spip('base/forms_upgrade');
20                        Forms_upgrade();
21                }
22        }
23       
24        function Forms_structure($id_form){
25                // Preparer la table de traduction code->valeur & mise en table de la structure pour eviter des requettes
26                // a chaque ligne
27                $structure = array();
28                $res = spip_query("SELECT * FROM spip_forms_champs WHERE id_form="._q($id_form)." ORDER BY rang");
29                while ($row = spip_fetch_array($res)){
30                        $type = $row['type'];
31                        $champ = $row['champ'];
32                        foreach ($row as $k=>$v)
33                                $structure[$champ][$k] = $v;
34                        if (($type == 'select') OR ($type == 'multiple')){
35                                $res2 = spip_query("SELECT * FROM spip_forms_champs_choix WHERE id_form="._q($id_form)." AND champ="._q($champ)." ORDER BY rang");
36                                while ($row2 = spip_fetch_array($res2)){
37                                        $structure[$champ]['choix'][$row2['choix']] = $c = trim(textebrut(typo($row2['titre'])));
38                                        $structure[$champ]['choixrev'][$c] = $row2['choix'];
39                                }
40                        }
41                        else if ($type == 'mot') {
42                                $id_groupe = intval($row['extra_info']);
43                                $res2 = spip_query("SELECT id_mot, titre FROM spip_mots WHERE id_groupe="._q($id_groupe));
44                                while ($row2 = spip_fetch_array($res2)) {
45                                        $structure[$champ]['choix'][$row2['id_mot']] = $c = trim(textebrut(typo($row2['titre'])));
46                                        $structure[$champ]['choixrev'][$c] = $row2['id_mot'];
47                                }
48                        }
49                }
50                return $structure;
51        }
52        function Forms_valeurs($id_form,$id_donnee){
53                static $unseul = array();
54                $valeurs = array();
55                $res = spip_query("SELECT * FROM spip_forms_donnees_champs AS d JOIN spip_forms_champs AS c ON c.champ=d.champ AND c.id_form="._q($id_form)." WHERE id_donnee="._q($id_donnee));
56                while ($row = spip_fetch_array($res)){
57                        if ($row['type']=='multiple')
58                                $valeurs[$row['champ']][]= $row['valeur'];
59                        elseif ($row['type']=='mot'){
60                                $id_groupe = intval($row['extra_info']);
61                                if (!isset($unseul[$id_groupe])){
62                                        $res2 = spip_query("SELECT unseul FROM spip_groupes_mots WHERE id_groupe="._q($id_groupe));
63                                        $row2=spip_fetch_array($res2);
64                                        $unseul[$id_groupe] = $row2['unseul'];
65                                }
66                                if ($unseul[$id_groupe]=='oui')
67                                        $valeurs[$row['champ']]= $row['valeur'];
68                                else
69                                        $valeurs[$row['champ']][]= $row['valeur'];
70                        }
71                        else
72                                $valeurs[$row['champ']]= $row['valeur'];
73                }
74                return $valeurs;
75        }
76       
77        function Forms_donnees_vide($id_form){
78                if (!include_spip('inc/autoriser'))
79                        include_spip('inc/autoriser_compat');
80                // on teste si autorisation en masse
81                if (autoriser('supprimer','donnee',0,NULL,array('id_form'=>$id_form)))
82                        spip_query("UPDATE spip_forms_donnees SET statut='poubelle' WHERE id_form="._q($id_form));
83                // sinon, on teste une par une
84                else {
85                        $res = spip_query("SELECT id_donnee FROM spip_forms_donnees WHERE id_form="._q($id_form));
86                        while ($row = spip_fetch_array($res)){
87                                if (autoriser('supprimer','donnee',$row['id_donnee'],NULL,array('id_form'=>$id_form)))
88                                        spip_query("UPDATE spip_forms_donnees SET statut='poubelle' WHERE id_donnee="._q($row['id_donnee']));
89                        }
90                }
91        }
92
93        function forms_type_table_lier($type,$id){
94                $type_table = 'table';
95                if ($type == 'donnee'){
96                        $id = explode('-',$id);
97                        $id_donnee_source = $id[0];
98                        $champ = $id[1];
99                        $id_form = $id[2];
100                        $res = spip_query("SELECT extra_info FROM spip_forms_champs WHERE id_form="._q($id_form)." AND champ="._q($champ));
101                        if($row = spip_fetch_array($res))
102                                $type_table = $row['extra_info'];
103                }
104                return $type_table;
105        }
106        function forms_prefixi18n($type_table){
107                $prefixi18n = in_array($type_table,array('sondage',''))?'forms':$type_table;
108                return $prefixi18n = str_replace("_","",strtolower($prefixi18n));
109        }
110        function Forms_csvimport_ajoute_table_csv($data, $id_form, $assoc_field, &$erreur, $simu = false){
111                include_spip('inc/forms_type_champs');
112                $assoc = array_flip($assoc_field);
113                $res = spip_query("SELECT * FROM spip_forms WHERE id_form="._q($id_form)." AND type_form NOT IN ('','sondage')");
114                if (!$row = spip_fetch_array($res)) {
115                        $erreur[0][] = _L("Table introuvable");
116                        return;
117                }
118               
119                $structure = Forms_structure($id_form);
120                $cle = isset($assoc_field['id_donnee'])?$assoc_field['id_donnee']:false;
121               
122                $output = "";
123                if ($data!=false){
124                        $count_lignes = 0;
125                        foreach($data as $key=>$ligne) {
126              $count_lignes ++;
127                                // creation de la donnee si necessaire
128                                $creation = true;
129                                $cle_libre = true;
130                                $id_donnee = 0;
131                                // verifier la validite de l'import
132                                $c = array();
133                                foreach($structure as $champ=>$infos){
134                                        if ($infos['type'] != 'multiple'){
135                                                $c[$champ] = "";
136                                          if ((isset($assoc[$champ]))&&(isset($ligne[$assoc[$champ]]))){
137                                                $c[$champ] = $ligne[$assoc[$champ]];
138                                                if (isset($infos['choix']) && !isset($infos['choix'][$c[$champ]]) && isset($infos['choixrev'][$c[$champ]]))
139                                                        $c[$champ] = $infos['choixrev'][$c[$champ]];
140                                          }
141                                        }
142                                        else {
143                                                $c[$champ] = array();
144                                                foreach($infos['choix'] as $choix=>$t)
145                                                  if ((isset($assoc[$choix]))&&(isset($ligne[$assoc[$choix]])))
146                                                        if (strlen($ligne[$assoc[$choix]]))
147                                                                $c[$champ][] = $choix;
148                                        }
149                                }
150                                $err = Forms_valide_champs_reponse_post($id_auteur, $c , $structure);
151                                if (is_array($err) && count($err)) $erreur[$count_lignes] = $err;
152                                else if (!$simu) {
153                                        if ($cle) {
154                                                $id_donnee = $ligne[$cle];
155                                                $res = spip_query("SELECT id_form,statut FROM spip_forms_donnees WHERE id_donnee="._q($id_donnee));
156                                                if ($row = spip_fetch_array($res) AND ($cle_libre = ($row['id_form']==$id_form))){
157                                                        $creation = false;
158                                                        $set = "";
159                                                        foreach(array('date','url','ip','id_auteur') as $champ)
160                                                                if (isset($assoc_field[$champ])) $set .= "$champ="._q($ligne[$assoc_field['date']]).", ";
161                                                        $set.=" maj=NOW()";
162                                                        if ($row['statut']=='poubelle')
163                                                                $set .= ", statut = 'publie'";
164                                                        spip_query("UPDATE spip_forms_donnees SET $set WHERE id_donnee="._q($id_donnee)." AND id_form="._q($id_form));
165                                                }
166                                        }
167                                        if ($creation){
168                                                $id_auteur = $GLOBALS['auteur_session'] ? intval($GLOBALS['auteur_session']['id_auteur']) : 0;
169                                                $ip = $GLOBALS['REMOTE_ADDR'];
170                                                $url = _DIR_RESTREINT_ABS;
171                                                if ($cle AND $cle_libre){
172                                                        if (intval($id_donnee))
173                                                                spip_abstract_insert("spip_forms_donnees","(id_donnee,id_form,date,ip,id_auteur,url,confirmation,statut,maj)","("._q($id_donnee).","._q($id_form).", NOW(),"._q($ip).","._q($id_auteur).","._q($url).", 'valide', 'publie', NOW() )");
174                                                }
175                                                else
176                                                        spip_abstract_insert("spip_forms_donnees","(id_form,date,ip,id_auteur,url,confirmation,statut,maj)","("._q($id_form).", NOW(),"._q($ip).","._q($id_auteur).","._q($url).", 'valide', 'publie', NOW() )");
177                                                $id_donnee = spip_insert_id();
178                                        }
179                                        if ($id_donnee){
180                                                foreach($c as $champ=>$values){
181                                                        if (!$creation)
182                                                                spip_query("DELETE FROM spip_forms_donnees_champs WHERE id_donnee="._q($id_donnee)." AND champ="._q($champ));
183                                                        if (!is_array($values)) $values = array($values);
184                                                        foreach($values as $v)
185                                                                if (strlen($v))
186                                                                        spip_query("INSERT INTO spip_forms_donnees_champs (id_donnee,champ,valeur,maj) VALUES ("._q($id_donnee).","._q($champ).","._q($v).", NOW() )");
187                                                }
188                                        }
189                                        else 
190                                          $erreur[$count_lignes][] = "ajout impossible ::id_donnee nul::<br />";
191                                }
192                        }
193                }
194        }
195       
196        function Forms_deplacer_fichier_form($source, $dest) {
197                /* le core interdit l'upload depuis l'espace prive... pourquoi tant de haine ?
198                include_spip('inc/getdocument');
199                if ($ok = deplacer_fichier_upload($source, $dest, true))
200                        if (file_exists($source)) // argument move pas pris en compte avant spip 1.9.2
201                                @unlink($source);*/
202                $ok = @rename($source, $dest);
203                if (!$ok) $ok = @move_uploaded_file($source, $dest);
204                if ($ok)
205                        @chmod($dest, _SPIP_CHMOD & ~0111);
206                else {
207                        $f = @fopen($dest,'w');
208                        if ($f) {
209                                fclose ($f);
210                        } else {
211                                include_spip('inc/headers');
212                                redirige_par_entete(generer_url_action("test_dirs", "test_dir=". dirname($dest), true));
213                        }
214                        @unlink($dest);
215                }
216                return $ok;
217        }
218
219        function Forms_nommer_fichier_form($orig, $dir) {
220                include_spip("inc/charsets");
221                include_spip("inc/filtres");
222                if (ereg("^(.*)\.([^.]+)$", $orig, $match)) {
223                        $ext = strtolower($match[2]);
224                        $orig = $match[1];
225                }
226                $base = ereg_replace("[^.a-zA-Z0-9_=-]+", "_", 
227                        translitteration(supprimer_tags(basename($orig))));
228                $n = 0;
229                $fichier = $base.'.'.$ext;
230                while (@file_exists($dir . $fichier)) {
231                        $fichier = $base.'-'.(++$n).'.'.$ext;
232                }
233                return $fichier;
234        }
235
236        function Forms_type_fichier_autorise($nom_fichier) {
237                if (ereg("\.([^.]+)$", $nom_fichier, $match)) {
238                        $ext = addslashes(strtolower($match[1]));
239                        switch ($ext) {
240                        case 'htm':
241                                $ext = 'html';
242                                break;
243                        case 'jpeg':
244                                $ext = 'jpg';
245                                break;
246                        case 'tiff':
247                                $ext = 'tif';
248                                break;
249                        }
250                        $query = "SELECT * FROM spip_types_documents WHERE extension='$ext' AND upload='oui'";
251                        $result = spip_query($query);
252                        return (spip_num_rows($result) > 0);
253                }
254                return false;
255        }
256
257        // Fonction utilitaires
258        function Forms_nom_cookie_form($id_form) {
259                return $GLOBALS['cookie_prefix'].'cookie_form_'.$id_form;
260        }
261
262        function Forms_verif_cookie_sondage_utilise($id_form) {
263                global $auteur_session;
264                $id_auteur = $auteur_session ? intval($auteur_session['id_auteur']) : 0;
265                $cookie = $_COOKIE[Forms_nom_cookie_form($id_form)];
266                $q="SELECT id_donnee FROM spip_forms_donnees " .
267                        "WHERE statut='publie' AND id_form=".intval($id_form)." ";
268                if ($cookie) $q.="AND (cookie="._q($cookie)." OR id_auteur="._q($id_auteur).")";
269                else
270                        if ($id_auteur)
271                                $q.="AND id_auteur=".$id_auteur;
272                        else 
273                                return false;
274                //On retourne le tableau des id_donnee de l'auteur ou false
275                $res = spip_query($q);
276                if ($res && spip_num_rows($res)>0) {
277                        while ($row=spip_fetch_array($res))
278                                $tab[]=$row['id_donnee'];
279                        return $tab;
280                }
281                else return false;
282        }
283
284        function Forms_extraire_reponse($id_donnee){
285                // Lire les valeurs entrees
286                $result = spip_query("SELECT * FROM spip_forms_donnees_champs AS r
287                        JOIN spip_forms_champs AS ch ON ch.champ=r.champ
288                        JOIN spip_forms_donnees AS d ON d.id_donnee = r.id_donnee
289                        WHERE d.id_form = ch.id_form AND r.id_donnee="._q($id_donnee)." ORDER BY ch.rang");
290                $valeurs = array();
291                $retour = urlencode(self());
292                $libelles = array();
293                $values = array();
294                $url = array();
295                while ($row = spip_fetch_array($result)) {
296                        $rang = $row['rang'];
297                        $champ = $row['champ'];
298                        $libelles[$champ]=$row['titre'];
299                        $type = $row['type'];
300                        if ($type == 'fichier') {
301                                $values[$champ][] = $row['valeur'];
302                                $url[$champ][] = generer_url_ecrire("forms_telecharger","id_donnee=$id_donnee&champ=$champ&retour=$retour");
303                        }
304                        else if (in_array($type,array('select','multiple'))) {
305                                if ($row3=spip_fetch_array(spip_query("SELECT titre FROM spip_forms_champs_choix WHERE id_form="._q($row['id_form'])." AND champ="._q($champ)." AND choix="._q($row['valeur']))))
306                                        $values[$champ][]=$row3['titre'];
307                                else
308                                        $values[$champ][]= $row['valeur'];
309                                $url[$champ][] = '';
310                        }
311                        else if ($type == 'mot') {
312                                $id_groupe = intval($row['extra_info']);
313                                $id_mot = intval($row['valeur']);
314                                if ($row3 = spip_fetch_array(spip_query("SELECT id_mot, titre FROM spip_mots WHERE id_groupe="._q($id_groupe)." AND id_mot="._q($id_mot)))){
315                                        $values[$champ][]=$row3['titre'];
316                                        $url[$champ][]= generer_url_ecrire("mots_edit","id_mot=$id_mot");
317                                }
318                                else {
319                                        $values[$champ][]= $row['valeur'];
320                                        $url[$champ][] = '';
321                                }
322                        }
323                        else {
324                                $values[$champ][] = $row['valeur'];
325                                $url[$champ][] = '';
326                        }
327                }
328                return array($libelles,$values,$url);
329        }
330       
331        //
332        // Afficher un pave formulaires dans la colonne de gauche
333        // (edition des articles)
334       
335        function Forms_afficher_insertion_formulaire($id_article) {
336                global $connect_id_auteur, $connect_statut;
337                global $couleur_foncee, $couleur_claire, $options;
338                global $spip_lang_left, $spip_lang_right;
339       
340                $s = "";
341                // Ajouter un formulaire
342                $s .= "\n";
343                $s .= debut_cadre_relief("../"._DIR_PLUGIN_FORMS."img_pack/form-24.png", true);
344       
345                $s .= "<div style='padding: 2px; background-color: $couleur_claire; text-align: center; color: black;'>";
346                $s .= bouton_block_invisible("ajouter_form");
347                $s .= "<strong class='verdana3' style='text-transform: uppercase;'>"
348                        ._T("forms:article_inserer_un_formulaire")."</strong>";
349                $s .= "</div>\n";
350       
351                $s .= debut_block_invisible("ajouter_form");
352                $s .= "<div class='verdana2'>";
353                $s .= _T("forms:article_inserer_un_formulaire_detail");
354                $s .= "</div>";
355       
356                $query = "SELECT id_form, titre FROM spip_forms ORDER BY titre";
357                $result = spip_query($query);
358                if (spip_num_rows($result)) {
359                        $s .= "<br />\n";
360                        $s .= "<div class='bandeau_rubriques' style='z-index: 1;'>";
361                        $s .= "<div class='plan-articles'>";
362                        while ($row = spip_fetch_array($result)) {
363                                $id_form = $row['id_form'];
364                                $titre = typo($row['titre']);
365                               
366                                $link = generer_url_ecrire('forms_edit',"id_form=$id_form&retour=".urlencode(self()));
367                                $s .= "<a href='".$link."'>";
368                                $s .= $titre."</a>\n";
369                                $s .= "<div class='arial1' style='text-align:$spip_lang_right;color: black; padding-$spip_lang_left: 4px;' "."title=\""._T("forms:article_recopier_raccourci")."\">";
370                                $s .= "<strong>&lt;form".$id_form."&gt;</strong>";
371                                $s .= "</div>";
372                        }
373                        $s .= "</div>";
374                        $s .= "</div>";
375                }
376       
377                // Creer un formulaire
378                if (!include_spip('inc/autoriser'))
379                        include_spip('inc/autoriser_compat');
380                if (autoriser('creer','form')) {
381                        $s .= "\n<br />";
382                        $link = generer_url_ecrire('forms_edit',"new=oui&retour=".urlencode(self()));
383                        $s .= icone_horizontale(_T("forms:icone_creer_formulaire"),
384                                $link, "../"._DIR_PLUGIN_FORMS."img_pack/form-24.png", "creer.gif", false);
385                }
386       
387                $s .= fin_block();
388       
389                $s .= fin_cadre_relief(true);
390                return $s;
391        }
392       
393        function Forms_insertions_reponse_un_champ($id_form,$id_donnee,$champ,$type,$val,&$erreur,&$ok){
394                $inserts = array();
395                if ($type == 'fichier') {
396                        if (($val = $_FILES[$champ]) AND ($val['tmp_name'])) {
397                                // Fichier telecharge : deplacer dans IMG, stocker le chemin dans la base
398                                $dir = sous_repertoire(_DIR_IMG, "protege");
399                                $dir = sous_repertoire($dir, "form".$id_form);
400                                $source = $val['tmp_name'];
401                                $dest = $dir.Forms_nommer_fichier_form($val['name'], $dir);
402                                if (!Forms_deplacer_fichier_form($source, $dest)) {
403                                        $erreur[$champ] = _T("forms:probleme_technique_upload");
404                                        $ok = false;
405                                }
406                                else {
407                                        $inserts[] = "("._q($id_donnee).","._q($champ).","._q($dest).")";
408                                }
409                        }
410                }
411                else if ($val) {
412                        // Choix multiples : enregistrer chaque valeur separement
413                        if (is_array($val))
414                                foreach ($val as $v)
415                                        $inserts[] = "("._q($id_donnee).","._q($champ).","._q($v).")";
416                        else
417                                $inserts[] = "("._q($id_donnee).","._q($champ).","._q($val).")";
418                }
419                return $inserts;
420        }
421       
422        function Forms_insertions_reponse_post($id_form,$id_donnee,&$erreur,&$ok, $c = NULL){
423                $inserts = array();
424                $res = spip_query("SELECT * FROM spip_forms_champs WHERE id_form="._q($id_form));
425                while($row = spip_fetch_array($res)){
426                        $champ = $row['champ'];
427                        $type = $row['type'];
428                        if (!$c) 
429                                $val = _request($champ);
430                        else
431                                $val = isset($c[$champ])?$c[$champ]:NULL;
432                        $ins = Forms_insertions_reponse_un_champ($id_form,$id_donnee,$champ,$type,$val,$erreur,$ok);
433                        $inserts = array_merge($inserts,$ins);
434                }
435                return $inserts;
436        }
437
438        function Forms_revision_donnee($id_donnee, $c = NULL) {
439                include_spip('base/abstract_sql');
440                $inserts = array();
441                $result = spip_query("SELECT id_form FROM spip_forms_donnees WHERE id_donnee="._q($id_donnee));
442                if (!$row = spip_fetch_array($result)) {
443                        $erreur['@'] = _T("forms:probleme_technique");
444                }
445                $id_form = $row['id_form'];
446                $structure = Forms_structure($id_form);
447                include_spip("inc/forms_type_champs");
448               
449                $erreur = Forms_valide_conformite_champs_reponse_post($id_form, $c, $structure);
450                if (!$erreur) {
451                        $champs_mod = array();
452                        foreach($structure as $champ=>$infos){
453                                $val = _request($champ,$c);
454                                if ($val!==NULL){
455                                        $champs_mod[] = $champ;
456                                        $type = $infos['type'];
457                                        $ins = Forms_insertions_reponse_un_champ($id_form,$id_donnee,$champ,$type,$val,$erreur,$ok);
458                                        $inserts = array_merge($inserts,$ins);
459                                }
460                        }
461                        $in_champs = calcul_mysql_in('champ',join(',',array_map('_q', $champs_mod)));
462                        spip_query("DELETE FROM spip_forms_donnees_champs WHERE $in_champs AND id_donnee="._q($id_donnee));
463                        spip_query("INSERT INTO spip_forms_donnees_champs (id_donnee, champ, valeur) ".
464                                "VALUES ".join(',', $inserts));
465                }
466                else
467                        spip_log("erreur: ".serialize($erreur));
468
469                return $erreur;
470        }
471       
472        function Forms_rang_prochain($id_form){
473                $rang = 1;
474                $res = spip_query("SELECT max(rang) AS rang_max FROM spip_forms_donnees WHERE id_form="._q($id_form));
475                if ($row = spip_fetch_array($res))
476                        $rang = $row['rang_max']+1;
477                return $rang;
478        }
479        function Forms_rang_update($id_donnee,$rang_nouv){
480                $rang_min = $rang_max = 1;
481                // recuperer le rang et l'id_form de la donnee modifiee
482                $res = spip_query("SELECT id_form,rang FROM spip_forms_donnees WHERE id_donnee="._q($id_donnee));
483                if (!$row = spip_fetch_array($res)) return;
484                $rang = $row['rang'];
485                $id_form = $row['id_form'];
486
487                // recuperer le min et le max des rangs en cours
488                $res = spip_query("SELECT min(rang) AS rang_min, max(rang) AS rang_max FROM spip_forms_donnees WHERE id_form="._q($id_form));
489                if ($row = spip_fetch_array($res)){
490                        $rang_min = $row['rang_min'];
491                        $rang_max = $row['rang_max'];
492                }
493       
494                // verifier si des donnees sont pas sans rang et les ramasser
495                $res = spip_query("SELECT id_donnee, rang FROM spip_forms_donnees WHERE (rang=NULL OR rang=0) AND id_form="._q($id_form));
496                while ($row = spip_fetch_array($res)){
497                        $rang_max++;
498                        spip_query("UPDATE spip_forms_donnees SET rang=$rang_max WHERE id_donnee="._q($row['id_donnee']));
499                }
500                // borner le rang
501                $rang_nouv = min(max($rang_nouv,$rang_min),$rang_max);
502               
503                if ($rang_nouv>$rang) $rang_nouv++; // il faut se decaler d'un car on est devant actuellement
504                $rang_nouv = min($rang_nouv,Forms_rang_prochain($id_form));
505               
506                // incrementer tous ceux dont le rang est superieur a la cible pour faire une place
507                $ok = spip_query("UPDATE spip_forms_donnees SET rang=rang+1 WHERE id_form=$id_form AND rang>="._q($rang_nouv));
508                if (!$ok) return $rang;
509                // mettre a jour le rang de l'element demande
510                $ok = spip_query("UPDATE spip_forms_donnees SET rang="._q($rang_nouv)." WHERE id_donnee=$id_donnee");
511                if (!$ok) return $rang;
512               
513                // decrementer tous ceux dont le rang est superieur a l'ancien pour recuperer la place
514                spip_query("UPDATE spip_forms_donnees SET rang=rang-1 WHERE id_form=$id_form AND rang>$rang");
515                $res = spip_query("SELECT id_form,rang FROM spip_forms_donnees WHERE id_donnee="._q($id_donnee));
516                if (!$row = spip_fetch_array($res)) return $rang_nouv;
517                return $row['rang'];
518        }
519       
520        function Forms_enregistrer_reponse_formulaire($id_form, $id_donnee, &$erreur, &$reponse, $script_validation = 'valide_form', $script_args='') {
521                $r = '';
522                if (!include_spip('inc/autoriser'))
523                        include_spip('inc/autoriser_compat');
524       
525                $result = spip_query("SELECT * FROM spip_forms WHERE id_form="._q($id_form));
526                if (!$row = spip_fetch_array($result)) {
527                        $erreur['@'] = _T("forms:probleme_technique");
528                }
529                $moderation = $row['moderation'];
530                // Extraction des donnees pour l'envoi des mails eventuels
531                //   accuse de reception et forward webmaster
532                $email = unserialize($row['email']);
533                $champconfirm = $row['champconfirm'];
534                $mailconfirm = '';
535
536                include_spip("inc/forms_type_champs");
537                $erreur = Forms_valide_champs_reponse_post($id_form);
538
539                // Si tout est bon, enregistrer la reponse
540                if (!$erreur) {
541                        global $auteur_session;
542                        $id_auteur = $auteur_session ? intval($auteur_session['id_auteur']) : 0;
543                        $url = (_DIR_RESTREINT==_DIR_RESTREINT_ABS)?parametre_url(self(),'id_form',''):_DIR_RESTREINT_ABS;
544                        $ok = true;
545                        $confirme = false;
546                        if ($id = intval(_request("deja_enregistre_$id_form"))){
547                                $id_donnee = $id;
548                                $ok = false;
549                                $confirme = true;
550                        }
551                       
552                        if ($row['type_form']=='sondage') {
553                                $confirmation = 'attente';
554                                $cookie = $GLOBALS['cookie_form'];
555                                $nom_cookie = Forms_nom_cookie_form($id_form);
556                        }
557                        else {
558                                $confirmation = 'valide';
559                                include_spip("inc/acces");
560                                $cookie = creer_uniqid();
561                        }
562                        if ($moderation == 'posteriori') 
563                                $statut='publie';
564                        else {
565                                $statut = 'prop';
566                                foreach(array('prepa','prop','publie','refuse') as $s)
567                                        if (autoriser(
568                                                        'instituer',
569                                                        (in_array($row['type_form'],array('','sondage'))?'form':$row['type_form']).'_donnee',
570                                                        0,NULL,array('id_form'=>$id_form,'statut'=>'prepa','nouveau_statut'=>$s))){
571                                                $statut = $s;
572                                                break;
573                                        }
574                        }
575                        // D'abord creer la reponse dans la base de donnees
576                        if ($ok) {
577                                if (autoriser('modifier', 'donnee', $id_donnee, NULL, array('id_form'=>$id_form))){
578                                        spip_query("UPDATE spip_forms_donnees SET date=NOW(), ip="._q($GLOBALS['ip']).", url="._q($url).", confirmation="._q($confirmation).", cookie="._q($cookie)." ".
579                                                "WHERE id_donnee="._q($id_donnee));
580                                        spip_query("DELETE FROM spip_forms_donnees_champs WHERE id_donnee="._q($id_donnee));
581                                } elseif (autoriser('creer', 'donnee', 0, NULL, array('id_form'=>$id_form))){
582                                        $rang = Forms_rang_prochain($id_form);
583                                        spip_query("INSERT INTO spip_forms_donnees (id_form, id_auteur, date, ip, url, confirmation,statut, cookie, rang) ".
584                                        "VALUES ("._q($id_form).","._q($id_auteur).", NOW(),"._q($GLOBALS['ip']).","._q($url).", '$confirmation', '$statut',"._q($cookie).","._q($rang).")");
585                                        $id_donnee = spip_insert_id();
586                                        # cf. GROS HACK exec/template/tables_affichage
587                                        # rattrapper les documents associes a cette nouvelle donnee
588                                        # ils ont un id = 0-id_auteur
589                                        spip_query("UPDATE spip_documents_donnees SET id_donnee = $id_donnee WHERE id_donnee = ".(0-$GLOBALS['auteur_session']['id_auteur']));
590                                }
591                                if (!$id_donnee) {
592                                        $erreur['@'] = _T("forms:probleme_technique");
593                                        $ok = false;
594                                }
595                                else {
596                                        $_GET["deja_enregistre_$id_form"] = $id_donnee;
597                                }
598                        }
599                        // Puis enregistrer les differents champs
600                        if ($ok) {
601                                $inserts = Forms_insertions_reponse_post($id_form,$id_donnee,$erreur,$ok);
602                                if (!count($inserts)) {
603                                        // Reponse vide => annuler
604                                        $erreur['@'] = _T("forms:remplir_un_champ");
605                                        spip_query("DELETE FROM spip_forms_donnees WHERE id_donnee="._q($id_donnee));
606                                        $ok = false;
607                                }
608                        }
609                        if ($ok) {
610                                include_spip('inc/securiser_action');
611                                spip_query("DELETE FROM spip_forms_donnees_champs WHERE id_donnee="._q($id_donnee));
612                                spip_query("INSERT INTO spip_forms_donnees_champs (id_donnee, champ, valeur) ".
613                                        "VALUES ".join(',', $inserts));
614                        }
615                        if ($ok || $confirme) {
616                                if ($champconfirm)
617                                        if ($row=spip_fetch_array(spip_query("SELECT * FROM spip_forms_donnees_champs WHERE id_donnee="._q($id_donnee)." AND champ="._q($champconfirm))))
618                                                $mailconfirm = $row['valeur'];
619                                if (($email) || ($mailconfirm)) {
620                                        include_spip("inc/session");
621                                        $hash = md5("forms confirme reponse $id_reponse $cookie ".hash_env());
622                                        $url = generer_url_public($script_validation,"mel_confirm=oui&id_donnee=$id_donnee&hash=$hash".($script_args?"&$script_args":""));
623                                        $r = $url;
624                                }
625                                if ($row['type_form']=='sondage') {
626                                        include_spip("inc/session");
627                                        $hash = md5("forms valide reponse sondage $id_reponse $cookie ".hash_env());
628                                        $url = generer_url_public($script_validation,"verif_cookie=oui&id_donnee=$id_donnee&hash=$hash".($script_args?"&$script_args":""));
629                                        $r = $url;
630                                }
631                        }
632                }
633       
634                return $r;
635        }
636
637        function Forms_generer_mail_reponse_formulaire($id_form, $id_donnee, $env){
638                if (!is_array($env)) $env=array();
639                $modele_mail_admin = 'form_reponse_email_admin';
640                $modele_mail_confirm = 'form_reponse_email_confirm';
641                if (isset($env['modele']))
642                        $modele_mail_admin = $env['modele'];
643                $result = spip_query("SELECT * FROM spip_forms WHERE id_form="._q($id_form));
644                if ($row = spip_fetch_array($result)) {
645                        $modele_admin = "modeles/$modele_mail_admin";
646                        $modele_confirm = "modeles/$modele_mail_confirm";
647                        if ($f = find_in_path(($m_admin = "$modele_admin-$id_form").".html"))
648                                $modele_admin = $m_admin;
649                        if ($f = find_in_path(($m_confirm = "$modele_confirm-$id_form").".html"))
650                                $modele_confirm = $m_confirm;
651                        $corps_mail_confirm = recuperer_fond($modele_confirm,array_merge($env,array('id_donnee'=>$id_donnee)));
652                        $corps_mail_admin = recuperer_fond($modele_admin,array_merge($env,array('id_donnee'=>$id_donnee,'mail_admin'=>'oui')));
653                        $champconfirm = $row['champconfirm'];
654                        $email = unserialize($row['email']);
655                        $email_dest = $email['defaut'];
656                        $mailconfirm = "";
657                       
658                        // recuperer l'email de confirmation
659                        $result2 = spip_query("SELECT * FROM spip_forms_donnees_champs WHERE id_donnee="._q($id_donnee)." AND champ="._q($champconfirm));
660                        if ($row2 = spip_fetch_array($result2)) {
661                                $mailconfirm = $row2['valeur'];
662                        }
663
664                        // recuperer l'email d'admin
665                        $result2 = spip_query("SELECT * FROM spip_forms_donnees_champs WHERE id_donnee="._q($id_donnee)." AND champ="._q($email['route']));
666                        if ($row2 = spip_fetch_array($result2)) {
667                                if (isset($email[$row2['valeur']]))
668                                        $email_dest = $email[$row2['valeur']];
669                        }
670
671                        include_spip('inc/mail');
672                        if ($mailconfirm !== '') {
673                                $head="From: formulaire@".$_SERVER["HTTP_HOST"]."\n";
674                                $sujet = $row['titre'];
675                                $dest = $mailconfirm;
676                                // mettre le texte dans un charset acceptable et sans entites
677                                //$mess_iso = unicode2charset(html2unicode(charset2unicode($corps_mail)),'iso-8859-1');
678                                //mail($dest, $sujet, $mess_iso, $head);
679                                $headers = "";
680                                if (preg_match(",<html>(.*)</html>,Uims",$corps_mail_confirm,$regs)){
681                                        $charset = $GLOBALS['meta']['charset'];
682                                        $headers .=
683                                        "MIME-Version: 1.0\n".
684                                        "Content-Type: text/html; charset=$charset\n".
685                                        "Content-Transfer-Encoding: 8bit\n";
686                                        if (preg_match(",<h[1-6]>(.*)</h[1-6]>,Uims",$regs[1],$hs))
687                                                $sujet=$hs[1];
688                                }
689                                envoyer_mail($dest, $sujet, $corps_mail_confirm, "formulaire@".$_SERVER["HTTP_HOST"], $headers);
690                        }
691                        if ($email_dest != '') {
692                                $head="From: formulaire_$id_form@".$_SERVER["HTTP_HOST"]."\n";
693                                $sujet = $row['titre'];
694                                $dest = $email_dest;
695                                // mettre le texte dans un charset acceptable et sans entites
696                                //$mess_iso = unicode2charset(html2unicode(charset2unicode($corps_mail_admin)),'iso-8859-1');
697                                //mail($dest, $sujet, $mess_iso, $head);
698                                $headers = "";
699                                if (preg_match(",<html>.*</html>,Uims",$corps_mail_admin,$regs)){
700                                        $charset = $GLOBALS['meta']['charset'];
701                                        $headers .=
702                                        "MIME-Version: 1.0\n".
703                                        "Content-Type: text/html; charset=$charset\n".
704                                        "Content-Transfer-Encoding: 8bit\n";
705                                        if (preg_match(",<h[1-6]>(.*)</h[1-6]>,Uims",$regs[1],$hs))
706                                                $sujet=$hs[1];
707                                }
708                                envoyer_mail($dest, $sujet, $corps_mail_admin, "formulaire@".$_SERVER["HTTP_HOST"], $headers);
709                        }
710                }
711        }
712function Forms_obligatoire($row,$forms_obligatoires){
713        $returned=$row;
714        global $auteur_session;
715        $id_auteur = $auteur_session ? intval($auteur_session['id_auteur']) : 0;
716        $form_tab=explode(',',$forms_obligatoires);
717        $chercher=true;
718        $i=0;
719        while ($chercher && $i<count($form_tab)){
720                $form_id=$form_tab[$i];
721                $cookie = $_COOKIE[Forms_nom_cookie_form($form_id)];
722                $q="SELECT id_form FROM spip_forms_donnees WHERE statut='publie' AND id_form="._q($form_id)." ";
723                if ($cookie) $q.="AND (cookie="._q($cookie)." OR id_auteur="._q($id_auteur).") ";
724                else
725                        if ($id_auteur)
726                                $q.="AND id_auteur="._q($id_auteur)." ";
727                        else
728                                $q.="AND 0=1 ";
729                $res=spip_query($q);
730                if (!spip_fetch_array($res)){
731                        $res2 = spip_query("SELECT * FROM spip_forms WHERE id_form="._q($form_id));
732                        $returned = spip_fetch_array($res2);
733                        $chercher=false;
734                }
735                $i++;   
736        }
737        return $returned;       
738}
739
740function Forms_afficher_liste_donnees_liees($type_source, $id, $type_lie, $type_table, $script, $bloc_id, $arg_ajax, $retour){
741        // article, donnee
742        // donnee, donnee_liee
743        // donnee_liee, donnee
744        $lieeliante = ($type_source=='donnee_liee')?'liante':'liee';
745        $linkable = strncmp($type_source,'donnee',6)!=0;
746        $in_type_table="";
747        if ($type_table){
748                include_spip("base/abstract_sql");
749                include_spip("base/forms_base_api");
750                $in_type_table = calcul_mysql_in('d.id_form',implode(",",Forms_liste_tables($type_table)))." AND";
751        }
752       
753        $out = "";
754        $iid = intval($id);
755
756        $les_donnees = "0";
757        $nombre_donnees = 0;
758        $liste = array();
759        $forms = array();
760        $types = array();
761        $prefixi18n = array();
762       
763        $champ_donnee_liee = "id_$type_lie";
764        $champ_donnee_source = "id_$type_source";
765        $table_liens = strncmp($type_source,"donnee",6)==0?"spip_forms_donnees_donnees":"spip_forms_donnees_{$type_source}s";
766       
767        $res = spip_query("SELECT dl.$champ_donnee_liee
768          FROM $table_liens AS dl
769          JOIN spip_forms_donnees AS d ON d.id_donnee=dl.$champ_donnee_liee
770          WHERE $in_type_table dl.$champ_donnee_source="._q($iid));
771        $nombre_donnees = $cpt = spip_num_rows($res);
772        while ($row = spip_fetch_array($res,SPIP_NUM))  $les_donnees.=",".$row[0];
773
774        $tranches = ($cpt>1000)?2*_TRANCHES:_TRANCHES;
775        $tmp_var = $bloc_id;
776        $nb_aff = floor(1.5 * $tranches);
777        if ($cpt > $nb_aff) {
778                $nb_aff = $tranches; 
779                $tranches = afficher_tranches_requete($cpt, $tmp_var, generer_url_ecrire($script,$arg_ajax), $nb_aff);
780        } else $tranches = '';
781       
782        $deb_aff = _request($tmp_var);
783        $deb_aff = ($deb_aff !== NULL ? intval($deb_aff) : 0);
784       
785        $limit = (($deb_aff < 0) ? '' : " LIMIT $deb_aff, $nb_aff");   
786       
787        $res = spip_query(
788        "SELECT dl.$champ_donnee_liee 
789        FROM $table_liens AS dl
790        JOIN spip_forms_donnees AS d ON d.id_donnee=dl.$champ_donnee_liee
791        WHERE $in_type_table dl.$champ_donnee_source="._q($iid)."
792        ORDER BY d.id_form $limit");
793        while ($row = spip_fetch_array($res)){
794                list($id_form,$titreform,$type_form,$t) = Forms_liste_decrit_donnee($row[$champ_donnee_liee],true,$linkable);
795                if (!count($t))
796                        list($id_form,$titreform,$type_form,$t) = Forms_liste_decrit_donnee($row[$champ_donnee_liee], false,$linkable);
797                if (count($t)){
798                        $liste[$id_form][$row[$champ_donnee_liee]]=$t;
799                        $forms[$id_form] = $titreform;
800                        $types[$id_form] = $type_form;
801                }
802        }
803        foreach($types as $type_form)
804                $prefixi18n[$type_form] = forms_prefixi18n($type_form);
805        if ($lieeliante=='liee')
806                $type_autoriser = strncmp($type_source,'donnee',6)==0?'donnee':$type_source;
807        else 
808                $type_autoriser = 'donnee';
809       
810        if (count($liste) OR $tranches) {
811                $out .= "<div class='liste liste-donnees'>";
812                $out .= $tranches;
813                $out .= "<table width='100%' cellpadding='3' cellspacing='0' border='0' background=''>";
814                $table = array();
815                foreach($liste as $id_form=>$donnees){
816                        $vals = array();
817                        $vals[] = "";
818                        $vals[] = "<a href='".generer_url_ecrire("donnees_tous","id_form=$id_form&retour=".urlencode($retour))."'>".$forms[$id_form]."</a>";
819                        $vals[] = "";
820                        $table[] = $vals;
821                        foreach($donnees as $id_donnee=>$champs){
822                                $vals = array();
823                                $vals[] = $id_donnee;
824                                if ($lieeliante=='liee')
825                                        $auth_modifier = autoriser('modifier',$type_autoriser,$iid,NULL,array('id_donnee_liee'=>$id_donnee));
826                                else
827                                        $auth_modifier = autoriser('modifier',$type_autoriser,$id_donnee,NULL,array('id_form'=>$id_form,'id_donnee_liee'=>$iid));
828                                $vals[] = 
829                                  ($auth_modifier?"<a href='".generer_url_ecrire("donnees_edit","id_form=$id_form&id_donnee=$id_donnee&retour=".urlencode($retour))."'>":"")
830                                  .implode(", ",$champs)
831                                  .($auth_modifier?"</a>":"");
832                                $redirect = ancre_url((_DIR_RESTREINT?"":_DIR_RESTREINT_ABS).self(),'tables');
833                                $action = "";
834                                if ($lieeliante=='liee'){
835                                        if (autoriser("delier_donnee",$type_autoriser,$iid,NULL,array('id_donnee_liee'=>$id_donnee)))
836                                                $action = generer_action_auteur("forms_lier_donnees","$id,$type_source,retirer,$id_donnee",urlencode($redirect));
837                                }
838                                else
839                                        if (autoriser("delier_donnee",$type_autoriser,$id_donnee,NULL,array('id_form'=>$id_form,'id_donnee_liee'=>$iid)))
840                                                $action = generer_action_auteur("forms_lier_donnees","$id_donnee,$type_lie,retirer,$id",urlencode($redirect));
841                                if ($action){
842                                        $action = ancre_url($action,$bloc_id);
843                                        $redirajax = generer_url_ecrire($script,$arg_ajax);
844                                        $vals[] = "<a href='$action' rel='$redirajax' class='ajaxAction' >"
845                                                . _T($prefixi18n[$types[$id_form]].":lien_retirer_donnee_$lieeliante")."&nbsp;". http_img_pack('croix-rouge.gif', "X", "width='7' height='7' border='0' align='middle'")
846                                                . "</a>";
847                                }
848                                else $vals[] = "";
849                                $table[] = $vals;
850                        }
851                }
852                $largeurs = array('', '', '', '', '');
853                $styles = array('arial11', 'arial11', 'arial2', 'arial11', 'arial11');
854                $out .= afficher_liste($largeurs, $table, $styles, false);
855       
856                $out .= "</table></div>\n";
857        }
858        return array($out,$les_donnees,$nombre_donnees) ;
859}
860
861function Forms_liste_decrit_donnee($id_donnee, $specifiant=true, $linkable=true){
862        $t = array();$titreform="";
863        if ($specifiant) $specifiant = "c.specifiant='oui' AND ";
864        else $specifiant="";
865        if ($linkable) $linkable = " AND f.linkable='oui'";
866        else $linkable = "";
867        $res2 = spip_query("SELECT c.titre,dc.valeur,f.titre AS titreform,f.id_form,f.type_form FROM spip_forms_donnees_champs AS dc
868        JOIN spip_forms_donnees AS d ON d.id_donnee=dc.id_donnee
869        JOIN spip_forms_champs AS c ON c.champ=dc.champ AND c.id_form=d.id_form
870        JOIN spip_forms AS f ON f.id_form=d.id_form
871        WHERE $specifiant dc.id_donnee="._q($id_donnee)."$linkable ORDER BY c.rang");
872        while ($row2 = spip_fetch_array($res2)){
873                $t[$row2['titre']] = $row2['valeur'];
874                $titreform = $row2['titreform'];
875                $id_form = $row2['id_form'];
876                $type_form = $row2['type_form'];
877        }
878        return array($id_form,$titreform,$type_form,$t);
879}
880
881?>
Note: See TracBrowser for help on using the repository browser.