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

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

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

File size: 16.3 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 Formato
12 * (c) 2005-2007 - Distribue sous licence GNU/GPL
13 *
14 */
15
16/* Operation sur les tables -------------------------------*/
17// creation d'une table a partir de sa structure xml
18// le type est surcharge par $type
19// $unique : ne pas creer la table si une du meme type existe deja
20function Forms_creer_table($structure_xml,$type=NULL, $unique = true, $c=NULL){
21        include_spip('inc/xml');
22
23        $xml = spip_xml_load($structure_xml);
24        foreach($xml as $k1=>$forms)
25                foreach($forms as $k2=>$formscont)
26                        foreach($formscont as $k3=>$form)
27                                foreach($form as $k4=>$formcont)
28                                        foreach($formcont as $prop=>$datas)
29                                        if ($prop=='type_form'){
30                                                if ($type)
31                                                        $xml[$k1][$k2][$k3][$k4][$prop] = array($type);
32                                                else 
33                                                        $type = trim(spip_xml_aplatit($datas));
34                                                        /*$type = trim(applatit_arbre($datas));*/
35                                                        // ADAPTATION SPIP2
36                                        }
37
38        if (!$type) return;
39        if ($unique){
40                $res = spip_query("SELECT id_form FROM spip_forms WHERE type_form="._q($type));
41                //adaptation SPIP2
42                //if (spip_num_rows($res))
43                if (sql_count($res))
44                        return;
45        }
46        // ok on peut creer la table
47        $snippets_forms_importer = charger_fonction('importer','snippets/forms');
48        $id_form = $snippets_forms_importer(0,$xml);
49        if ($c!==NULL){
50                include_spip('forms_crayons');
51                form_revision($id_form,$c);
52        }
53        return $id_form;
54}
55
56function Forms_liste_tables($type){
57        static $liste = array();
58        if (is_array($type) && count($type)) {
59                $l = array();
60                foreach($type as $t)
61                        $l = array_merge($l,Forms_liste_tables($t));
62                return $l;
63        }
64        if (!isset($liste[$type])){
65                $liste[$type] = array();
66                $res = spip_query("SELECT id_form FROM spip_forms WHERE type_form="._q($type));
67                while ($row = spip_fetch_array($res)){
68                        $liste[$type][] = $row['id_form'];
69                }
70        }
71        return $liste[$type];
72}
73
74function Forms_supprimer_tables($type_ou_id){
75        if (!$id_form = intval($type_ou_id) OR !is_numeric($type_ou_id)){
76                $liste = Forms_liste_tables($type_ou_id);
77                foreach($liste as $id)
78                        Forms_supprimer_tables($id);
79                return;
80        }
81        $res = spip_query("SELECT id_donnee FROM spip_forms_donnees WHERE id_form="._q($id_form));
82        while ($row = spip_fetch_array($res)){
83                spip_query("DELETE FROM spip_forms_donnees_champs WHERE id_donnee="._q($row['id_donnee']));
84                spip_query("DELETE FROM spip_forms_donnees_articles WHERE id_donnee="._q($row['id_donnee']));
85                spip_query("DELETE FROM spip_forms_donnees_rubriques WHERE id_donnee="._q($row['id_donnee']));
86        }
87        spip_query("DELETE FROM spip_forms_donnees WHERE id_form="._q($id_form));
88        spip_query("DELETE FROM spip_forms_champs_choix WHERE id_form="._q($id_form));
89        spip_query("DELETE FROM spip_forms_champs WHERE id_form="._q($id_form));
90        spip_query("DELETE FROM spip_forms WHERE id_form="._q($id_form));
91        spip_query("DELETE FROM spip_forms_articles WHERE id_form="._q($id_form));
92}
93
94include_spip('forms_fonctions');
95function Forms_les_valeurs($id_form, $id_donnee, $champ, $separateur=",",$etoile=false, $traduit=true){
96        if (is_array($champ))
97                foreach($champ as $k=>$ch)
98                        $champ[$k] = forms_calcule_les_valeurs('forms_donnees_champs', $id_donnee, $ch, $id_form, $separateur,$etoile,$traduit);
99        else
100                $champ = forms_calcule_les_valeurs('forms_donnees_champs', $id_donnee, $champ, $id_form, $separateur,$etoile,$traduit);
101        return $champ;
102}
103function Forms_creer_champ($id_form,$type,$titre,$c=NULL,$champ=""){
104        include_spip('inc/forms_edit');
105        $champ = Forms_insere_nouveau_champ($id_form,$type,$titre,$champ);
106        if ($c!==NULL){
107                include_spip('forms_crayons');
108                forms_champ_revision("$id_form-$champ",$c);
109        }
110        return $champ;
111}
112
113/* Operation sur les donnees -------------------------------*/
114
115function Forms_creer_donnee($id_form,$c = NULL, $rang=NULL){
116        include_spip('inc/autoriser');
117        if (!autoriser('creer','donnee',0,NULL,array('id_form'=>$id_form)))
118                return array(0,_L("droits insuffisants pour creer une donnee dans table $id_form"));
119        include_spip('inc/forms');
120        $new = 0;
121        $erreur = array();
122        Forms_enregistrer_reponse_formulaire($id_form, $new, $erreur, $reponse, '', '' , $c, $rang);
123        return array($new,$erreur);
124}
125function Forms_supprimer_donnee($id_form,$id_donnee){
126        include_spip('inc/autoriser');
127        if (!autoriser('supprimer','donnee',$id_donnee,NULL,array('id_form'=>$id_form)))
128                return _L("droits insuffisants pour supprimer la donnee $id_donnee");
129        spip_query("UPDATE spip_forms_donnees SET statut='poubelle',bgch=0,bdte=0,niveau=0 WHERE id_donnee="._q($id_donnee));
130        return true;
131}
132function Forms_modifier_donnee($id_donnee,$c = NULL){
133        include_spip('inc/forms');
134        return Forms_revision_donnee($id_donnee,$c);
135}
136
137function Forms_instituer_donnee($id_donnee,$statut){
138                spip_query("UPDATE spip_forms_donnees SET statut="._q($statut)." WHERE id_donnee="._q($id_donnee));
139}
140function Forms_ordonner_donnee($id_donnee,$rang){
141                include_spip("inc/forms");
142                Forms_rang_update($id_donnee,$rang);
143}
144
145function Forms_rechercher_donnee($recherche,$id_form=0,$champ=NULL,$sous_ensemble=NULL){
146        $liste = array();
147        $in = "";
148        if (is_array($sous_ensemble)){
149                include_spip('base/abstract_sql');
150                $in = sql_in('dc.id_donnee',implode(',',$sous_ensemble));
151        }
152        $res = spip_query(
153            "SELECT dc.id_donnee FROM spip_forms_donnees_champs AS dc"
154          . ($id_form?" LEFT JOIN spip_forms_donnees AS d ON dc.id_donnee=d.id_donnee":"")
155          . " WHERE dc.valeur LIKE "._q($recherche)
156          . ($id_form?" AND d.id_form="._q($id_form):"")
157          . ($in?" AND $in":"")
158          . ($champ?" AND dc.champ="._q($champ):"")
159        );
160        while ($row = spip_fetch_array($res))
161                $liste[] = $row['id_donnee'];
162        return $liste;
163}
164
165function Forms_infos_donnee($id_donnee,$specifiant=true,$linkable=false){
166        list($id_form,$titreform,$type_form,$t) = Forms_liste_decrit_donnee($id_donnee,$specifiant,$linkable);
167        if (!count($t) && $specifiant)
168                list($id_form,$titreform,$type_form,$t) = Forms_liste_decrit_donnee($id_donnee, false,$linkable);
169        if (!count($t) && !$id_form) { 
170                // verifier qu'une donnee vide n'existe pas suite a enregistrement errone..
171                $res2 = spip_query("SELECT f.titre AS titreform,f.id_form,f.type_form FROM spip_forms_donnees AS d
172                JOIN spip_forms AS f ON f.id_form=d.id_form
173                WHERE d.id_donnee="._q($id_donnee));
174                if ($row2 = spip_fetch_array($res2)){
175                        $titreform = $row2['titreform'];
176                        $id_form = $row2['id_form'];
177                        $type_form = $row2['type_form'];
178                }
179        }
180        return array($id_form,$titreform,$type_form,$t);
181}
182function Forms_decrit_donnee($id_donnee,$specifiant=true,$linkable=false){
183        list($id_form,$titreform,$type_form,$t) = Forms_infos_donnee($id_donnee,$specifiant,$linkable);
184        return $t;
185}
186
187function Forms_donnees_liees($id_donnee,$type_form_lie){
188        include_spip('base/abstract_sql');
189        $liste = Forms_liste_tables($type_form_lie);
190        $in_liste = sql_in('id_form',implode(',',$liste));
191        $res = spip_query("SELECT * FROM spip_forms_donnees_donnees WHERE id_donnee="._q($id_donnee)." OR id_donnee_liee="._q($id_donnee));
192        $valeurs = array();
193        while ($row = spip_fetch_array($res)){
194                $liee = $row['id_donnee']+$row['id_donnee_liee']-$id_donnee;
195                $res2 = spip_query("SELECT * FROM spip_forms_donnees WHERE id_donnee="._q($liee)." AND $in_liste");
196                if ($row2 = spip_fetch_array($res2))
197                        $valeurs[] = $liee;
198        }
199        return $valeurs;
200}
201function Forms_delier_donnee($id_donnee,$id_donnee_liee=0,$type_form_lie = ""){
202        if ($id_donnee_liee!=0){
203                spip_query("DELETE FROM spip_forms_donnees_donnees WHERE id_donnee="._q($id_donnee)." AND id_donnee_liee="._q($id_donnee_liee));
204                spip_query("DELETE FROM spip_forms_donnees_donnees WHERE id_donnee_liee="._q($id_donnee)." AND id_donnee="._q($id_donnee_liee));
205        }
206        else {
207                include_spip('base/abstract_sql');
208                $liste = Forms_liste_tables($type_form_lie);
209                $in_liste = sql_in('id_form',implode(',',$liste));
210                $res = spip_query("SELECT * FROM spip_forms_donnees_donnees WHERE id_donnee="._q($id_donnee)." OR id_donnee_liee="._q($id_donnee));
211                while ($row = spip_fetch_array($res)){
212                        $liee = $row['id_donnee']+$row['id_donnee_liee']-$id_donnee;
213                        $res2 = spip_query("SELECT * FROM spip_forms_donnees WHERE id_donnee="._q($liee)." AND $in_liste");
214                        if ($row2 = spip_fetch_array($res2))
215                                spip_query("DELETE FROM spip_forms_donnees_donnees WHERE id_donnee=".$row['id_donnee']." AND id_donnee_liee=".$row['id_donnee_liee']);
216                }
217        }
218}
219
220
221/* Operation sur les donnees arborescentes -------------------------------*/
222/*
223 * $id_form : la table
224 * $id_parent : la donnee 'parente'
225 * position : la relation avec le parent
226 *   fils_cadet, fils_aine, grand_frere, petit_frere, pere
227 * retourne un array($id_donnee,$erreur)
228 */
229function Forms_arbre_inserer_donnee($id_form,$id_parent,$position="fils_cadet",$c=NULL){
230        if (!$id_parent>0){
231                if ($res = spip_query("SELECT id_donnee FROM spip_forms_donnees WHERE id_form="._q($id_form)." AND statut!='poubelle' LIMIT 0,1")
232                  //adapation SPIP2
233                  //AND spip_num_rows($res)==0){
234                  AND sql_count($res)==0){
235                  // pas d'elements existants, c'est la racine, on l'insere toujours
236                        if ($position=='fils_aine' OR $position=='fils_cadet'){
237                                spip_log("Insertion impossible dans un arbre pour un fils sans pere dans table $id_form");
238                                return array(0,_L("Insertion impossible dans un arbre pour un fils sans pere dans table $id_form"));
239                        }
240                        // premiere insertion
241                                return Forms_creer_donnee($id_form,$c,array('niveau'=>0,'bgch'=>1,'bdte'=>2));
242                }
243                else {
244                        // Insertion d'un collateral : il faut preciser le 'parent' !
245                        spip_log("Insertion impossible dans un arbre pour un collatŽral sans precision du parent dans table $id_form");
246                        return array(0,_L("Insertion impossible dans un arbre pour un collatŽral sans precision du parent dans table $id_form"));
247                }
248        }
249        // Le parent existe toujours ?
250        $res = spip_query("SELECT * FROM spip_forms_donnees WHERE id_form="._q($id_form)." AND id_donnee="._q($id_parent)." AND statut!='poubelle'");
251        if (!($rowp = spip_fetch_array($res))){
252                spip_log("Insertion impossible, le parent $id_parent n'existe plus dans table $id_form");
253                return array(0,_L("Insertion impossible, le parent $id_parent n'existe plus dans table $id_form"));
254        }
255       
256        // insertion d'un pere
257        if ($position == 'pere'){
258                if (
259                  // Decalage de l'ensemble colateral droit
260                  spip_query("UPDATE spip_forms_donnees SET bdte=bdte+2 WHERE id_form="._q($id_form)." AND bdte>"._q($rowp['bdte'])." AND bgch<="._q($rowp['bdte']))
261                  AND spip_query("UPDATE spip_forms_donnees SET bgch=bgch+2,bdte=bdte+2 WHERE id_form="._q($id_form)." AND bgch>"._q($rowp['bdte']))
262                        // Decalalage ensemble vise vers le bas
263                  AND spip_query("UPDATE spip_forms_donnees SET bgch=bgch+1,bdte=bdte+1,niveau=niveau+1 WHERE id_form="._q($id_form)." AND bgch>="._q($rowp['bgch'])." AND bdte<="._q($rowp['bdte']))
264                )
265                        // Insertion du nouveau pere
266                        return Forms_creer_donnee($id_form,$c,array('niveau'=>$rowp['niveau'],'bgch'=>$rowp['bgch'],'bdte'=>$rowp['bdte']+2));
267        }
268        // Insertion d'un grand frere
269        elseif ($position == 'grand_frere'){
270                if (
271                  // Decalage de l'ensemble colateral droit
272                  spip_query("UPDATE spip_forms_donnees SET bdte=bdte+2 WHERE id_form="._q($id_form)." AND bdte>"._q($rowp['bgch'])." AND bgch<"._q($rowp['bgch']))
273                  AND spip_query("UPDATE spip_forms_donnees SET id_form="._q($id_form)." AND bgch=bgch+2,bdte=bdte+2 WHERE bgch>="._q($rowp['bgch']))
274                  )
275                        return Forms_creer_donnee($id_form,$c,array('niveau'=>$rowp['niveau'],'bgch'=>$rowp['bgch'],'bdte'=>$rowp['bgch']+1));
276        }
277        // Insertion d'un petit frere
278        elseif ($position == 'petit_frere'){
279                if (
280                  // Decalage de l'ensemble colateral droit
281                  spip_query("UPDATE spip_forms_donnees SET bdte=bdte+2 WHERE id_form="._q($id_form)." AND bdte>"._q($rowp['bdte'])." AND bgch<"._q($rowp['bdte']))
282                  AND spip_query("UPDATE spip_forms_donnees SET bgch=bgch+2,bdte=bdte+2 WHERE id_form="._q($id_form)." AND bgch>="._q($rowp['bdte']))
283                  )
284                        return Forms_creer_donnee($id_form,$c,array('niveau'=>$rowp['niveau'],'bgch'=>$rowp['bdte']+1,'bdte'=>$rowp['bdte']+2));
285        }
286        // Insertion d'un fils aine
287        elseif ($position == 'fils_aine'){
288                if (
289                  // Decalage de l'ensemble colateral droit
290                  spip_query("UPDATE spip_forms_donnees SET bdte=bdte+2 WHERE id_form="._q($id_form)." AND bdte>"._q($rowp['bgch'])." AND bgch<="._q($rowp['bgch']))
291                  AND spip_query("UPDATE spip_forms_donnees SET bgch=bgch+2,bdte=bdte+2 WHERE id_form="._q($id_form)." AND bgch>"._q($rowp['bgch']))
292                  )
293                        return Forms_creer_donnee($id_form,$c,array('niveau'=>$rowp['niveau']+1,'bgch'=>$rowp['bgch']+1,'bdte'=>$rowp['bgch']+2));
294        }
295        // Insertion d'un fils aine
296        elseif ($position == 'fils_cadet'){
297                if (
298                  // Decalage de l'ensemble colateral droit
299                  spip_query("UPDATE spip_forms_donnees SET bdte=bdte+2 WHERE id_form="._q($id_form)." AND bdte>="._q($rowp['bdte'])." AND bgch<="._q($rowp['bdte']))
300                  AND spip_query("UPDATE spip_forms_donnees SET bgch=bgch+2,bdte=bdte+2 WHERE id_form="._q($id_form)." AND bgch>"._q($rowp['bdte']))
301                  )
302                        return Forms_creer_donnee($id_form,$c,array('niveau'=>$rowp['niveau']+1,'bgch'=>$rowp['bdte'],'bdte'=>$rowp['bdte']+1));
303        }
304        spip_log("Operation inconnue insertion en position $position dans table $id_form");
305        return array(0,_L("Operation inconnue insertion en position $position dans table $id_form"));
306}
307function Forms_arbre_supprimer_donnee($id_form,$id_donnee,$recursif=true){
308        $res = spip_query("SELECT * FROM spip_forms_donnees WHERE id_form="._q($id_form)." AND id_donnee="._q($id_donnee));
309        if (!($row = spip_fetch_array($res)))
310                return false;
311        if ($recursif){
312                // OUI ! tout le sous arbre doit etre supprime
313                $delta = $row['bdte']-$row['bgch']+1;
314                $res2 = spip_query("SELECT id_donnee FROM spip_forms_donnees WHERE id_form="._q($id_form)." AND bgch>="._q($row['bgch'])." AND bdte<="._q($row['bdte']));
315                $ok = true;
316                while ($row2 = spip_fetch_array($res2))
317                        $ok = $ok && Forms_supprimer_donnee($id_form,$row2['id_donnee']);
318               
319                if (
320                        spip_query("UPDATE spip_forms_donnees SET bgch=bgch-$delta,bdte=bdte-$delta WHERE id_form="._q($id_form)." AND bgch>"._q($row['bdte']))
321                        AND spip_query("UPDATE spip_forms_donnees SET bdte=bdte-$delta WHERE id_form="._q($id_form)." AND bdte>"._q($row['bdte'])." AND bgch<="._q($row['bdte']))
322                        )
323                        return true;
324                return false;
325        }
326        else {
327                // NON ! on ne supprime que l'element
328                if (
329                  Forms_supprimer_donnee($id_form,$id_donnee)
330                  AND spip_query("UPDATE spip_forms_donnees SET bgch=bgch-1,bdte=bdte-1,niveau=niveau-1 WHERE id_form="._q($id_form)." AND bdte<"._q($row['bdte'])." AND bgch>"._q($row['bgch']))
331                  AND spip_query("UPDATE spip_forms_donnees SET bgch=bgch-2,bdte=bdte-2 WHERE id_form="._q($id_form)." AND bgch>"._q($row['bdte']))
332                  AND spip_query("UPDATE spip_forms_donnees SET bdte=bdte-2 WHERE id_form="._q($id_form)." AND bdte>"._q($row['bdte'])." AND bgch<="._q($row['bdte']))
333                  )
334                        return true;
335                return false;
336        }
337}
338function Forms_arbre_liste_relations($id_form,$id_parent,$position="enfant"){
339        $liste = array();
340        if ($id_parent){
341                $res = spip_query("SELECT id_donnee,niveau,bgch,bdte FROM spip_forms_donnees WHERE id_donnee="._q($id_parent)." AND id_form="._q($id_form));
342                if (!$row = spip_fetch_array($res)) return $liste;
343                $niveau = $row['niveau'];
344                $bgch = $row['bgch'];
345                $bdte = $row['bdte'];
346               
347                if ($position=='enfant' || $position=='branche') {
348                        $res = spip_query( 
349                          "SELECT id_donnee FROM spip_forms_donnees WHERE id_form="._q($id_form)
350                          . " AND bgch>"._q($bgch)." AND bdte<"._q($bdte)
351                          . ($position=='enfant'?" AND niveau="._q($niveau+1):"")
352                          . " ORDER BY bgch"
353                        );
354                }
355                elseif ($position=='grand_frere') {
356                        $res = spip_query(
357                          "SELECT id_donnee FROM spip_forms_donnees WHERE id_form="._q($id_form)
358                          . " AND bdte<"._q($bgch)
359                          . " AND niveau="._q($niveau)
360                          . " ORDER BY bgch"
361                        );
362                }
363                elseif ($position=='petit_frere') {
364                        $res = spip_query(
365                          "SELECT id_donnee FROM spip_forms_donnees WHERE id_form="._q($id_form)
366                          . " AND bgch>"._q($bdte)
367                          . " AND niveau="._q($niveau)
368                          . " ORDER BY bgch"
369                        );
370                }
371                elseif ($position=='parent' || position=='hierarchie') {
372                        $res = spip_query(
373                          "SELECT id_donnee FROM spip_forms_donnees WHERE id_form="._q($id_form)
374                          . " AND bgch<"._q($bgch)." AND bdte>"._q($bdte)
375                          . ($position=='parent'?" AND niveau="._q($niveau-1):"")
376                          . " ORDER BY bgch"
377                        );
378                }
379
380        }
381        else {
382                if ($position!='enfant' && $position!='branche') return $liste;
383                $res = spip_query(
384                  "SELECT id_donnee FROM spip_forms_donnees WHERE id_form="._q($id_form)
385                  . ($position=='enfant'?" AND niveau=1":"")
386                  . " ORDER BY bgch"
387                );
388        }
389        while ($row = spip_fetch_array($res))
390                $liste[] = $row['id_donnee'];
391        return $liste;
392}
393
394?>
Note: See TracBrowser for help on using the repository browser.