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

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