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

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