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

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