source: spip-zone/_plugins_/_stable_/forms/forms_et_tables_1_9_1/forms_options.php @ 9909

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

formalisation de l'API autoriser pour les donnees :
un couche intermediaire autoriser_donnee_dist dispatche les appels autoriser en fonction du type de la table({$type_form}_donnee , ou a defaut sur table_donne ou a defaut sur form_donnee
simplifie le code intrinseque en faisant systematiquement appel a autoriser(faire,'donnee',$id_donnee..) tout en permettant la definition personalisee des autorisations par les plugins

File size: 6.4 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 */
13if (!defined('_DIR_PLUGIN_FORMS')){
14        $p=explode(basename(_DIR_PLUGINS)."/",str_replace('\\','/',realpath(dirname(__FILE__))));
15        define('_DIR_PLUGIN_FORMS',(_DIR_PLUGINS.end($p))."/");
16}
17include_spip('base/forms');
18$GLOBALS['forms_actif_exec'][] = 'donnees_edit';
19
20function autoriser_form_dist($faire, $type='', $id=0, $qui = NULL, $opt = NULL) {
21        if ($type=='form')
22                if ($faire=='administrer'){
23                        return ($qui['statut'] == '0minirezo');
24                }
25                else
26                        return ($qui['statut'] == '0minirezo');
27        return false;
28}
29function autoriser_donnee_dist($faire,$type,$id_donnee,$qui,$opt){
30        static $types = array();
31        if (!isset($opt['id_form'])){
32                $res = spip_query("SELECT id_form FROM spip_forms_donnees WHERE id_donnee="._q($id_donnee));
33                if (!$row = spip_fetch_array($res)) return false;
34                $opt['id_form'] = $row['id_form'];
35        }
36        $id_form = $opt['id_form'];
37        if (!isset($opt['type_form'])){
38                if (!isset($types[$id_form])){
39                        $res = spip_query("SELECT type_form FROM spip_forms WHERE id_form="._q($id_form));
40                        if (!$row = spip_fetch_array($res)) return false;
41                        $types[$id_form] = $row['type_form'];
42                }
43                $opt['type_form'] = $types[$id_form];
44        }
45        $type_form = in_array($opt['type_form'],array('','sondage'))?'form':$opt['type_form'];
46        // Chercher une fonction d'autorisation explicite
47        if (
48        // 1. Sous la forme "autoriser_type_form_donnee_faire"
49                (
50                $type_form
51                AND $f = 'autoriser_'.$type_form.'_donnee_'.$faire
52                AND (function_exists($f) OR function_exists($f.='_dist'))
53                )
54
55        // 2. Sous la forme "autoriser_type_form_donnee"
56        OR (
57                $type_form
58                AND $f = 'autoriser_'.$type_form.'_donnee'
59                AND (function_exists($f) OR function_exists($f.='_dist'))
60                )
61        // 3. Sous la forme "autoriser_table_donnee_faire"
62        OR (
63                $f = 'autoriser_table_donnee_'.$faire
64                AND (function_exists($f) OR function_exists($f.='_dist'))
65        )
66        // 4. Sous la forme "autoriser_table_donnee_faire"
67        OR (
68                $f = 'autoriser_table_donnee'
69                AND (function_exists($f) OR function_exists($f.='_dist'))
70        )
71
72        // 5. Sinon autorisation generique
73        OR (
74                $f = 'autoriser_form'
75                AND (function_exists($f) OR function_exists($f.='_dist'))
76        )
77
78        )
79                $a = $f($faire,$type,intval($id),$qui,$opt);
80        if (_DEBUG_AUTORISER) spip_log("autoriser_form_donnee_dist delegue a $f($faire,$type,$id): ".($a?'OK':'niet'));
81        return $a;
82}
83
84function autoriser_form_donnee_modifier_dist($faire, $type, $id_donnee, $qui, $opt) {
85        if (!isset($opt['id_form']) OR !$id_form = $opt['id_form']) return false;
86        // un admin dans le back office a toujours le droit de modifier
87        if (($qui['statut'] == '0minirezo')) return true;
88        $result = spip_query("SELECT * FROM spip_forms WHERE id_form="._q($id_form));
89        if (!$row = spip_fetch_array($result)) return false;
90        $dejareponse=Forms_verif_cookie_sondage_utilise($id_form);
91        global $auteur_session;
92        $id_auteur = $auteur_session ? intval($auteur_session['id_auteur']) : 0;
93        $cookie = $_COOKIE[Forms_nom_cookie_form($id_form)];
94        if (($row['modifiable'] == 'oui') && $dejareponse) {
95                $q = "SELECT id_donnee FROM spip_forms_donnees WHERE id_form="._q($id_form);
96                if ($cookie) $q.=" AND (cookie="._q($cookie)." OR id_auteur="._q($id_auteur).")";
97                else $q.=" AND id_auteur="._q($id_auteur)." ";
98                //si unique, ignorer id_donnee, si pas id_donnee, ne renverra rien
99                if ($row['multiple']=='oui' || !_DIR_RESTREINT) $q.=" AND id_donnee="._q($opt['id_donnee']);
100                $r=spip_query($q);
101                if ($r=spip_fetch_array($r)) return true;
102        }
103        return false;
104}
105function autoriser_table_donnee_modifier_dist($faire, $type, $id_donnee, $qui, $opt) {
106        return autoriser_form_donnee_modifier_dist($faire, $type, $id_donnee, $qui, $opt);
107}
108function autoriser_form_donnee_creer_dist($faire, $type, $id_donnee, $qui, $opt) {
109        if (!isset($opt['id_form']) OR !$id_form = $opt['id_form']) return false;
110        // un admin dans le back office a toujours le droit d'inserer
111        if (($qui['statut'] == '0minirezo')) return true;
112        $result = spip_query("SELECT * FROM spip_forms WHERE id_form="._q($id_form));
113        if (!$row = spip_fetch_array($result)) return false;
114        if ($row['multiple']=='oui') return true;
115        $dejareponse=Forms_verif_cookie_sondage_utilise($id_form);
116        if ($dejareponse) return false;
117        return true;
118}
119function autoriser_table_donnee_creer_dist($faire, $type, $id_donnee, $qui, $opt) {
120        return autoriser_form_donnee_creer($faire, $type, $id_donnee, $qui, $opt);
121}
122function autoriser_form_donnee_instituer_dist($faire,$type,$id_donnee,$qui,$opt) {
123        if (($qui['statut'] != '0minirezo')
124        OR !isset($opt['nouveau_statut'])
125        OR ($opt['nouveau_statut']=='prepa')) return false;
126        return true;
127}
128function autoriser_table_donnee_instituer_dist($faire,$type,$id_donnee,$qui,$opt) {
129        return autoriser_form_donnee_instituer_dist($faire,$type,$id_donnee,$qui,$opt);
130}
131
132// le reglage du cookie doit se faire avant l'envoi de tout HTML au client
133function Forms_poser_cookie_sondage($id_form) {
134        if ($id_form = intval($id_form)) {
135                $nom_cookie = $GLOBALS['cookie_prefix'].'cookie_form_'.$id_form;
136                // Ne generer un nouveau cookie que s'il n'existe pas deja
137                if (!$cookie = $_COOKIE[$nom_cookie]) {
138                        include_spip("inc/acces");
139                        $cookie = creer_uniqid();
140                }
141                $GLOBALS['cookie_form'] = $cookie; // pour utilisation dans inc_forms...
142                // Expiration dans 30 jours
143                setcookie($nom_cookie, $cookie, time() + 30 * 24 * 3600);
144        }
145}
146
147function Forms_generer_url_sondage($id_form) {
148        return generer_url_public("sondage","id_form=$id_form",true);
149}
150
151if ((intval(_request('ajout_reponse'))) && (_request('ajout_cookie_form') == 'oui'))
152        Forms_poser_cookie_sondage(_request('ajout_reponse'));
153
154// test si un cookie sondage a ete pose
155foreach($_COOKIE as $cookie=>$value){
156        if (preg_match(",".$GLOBALS['cookie_prefix']."cookie_form_([0-9]+),",$cookie,$reg)){
157                $idf = intval($reg[1]);
158                $res = spip_query("SELECT id_article FROM spip_forms_articles WHERE id_form=".intval($idf));
159                while($row=spip_fetch_array($res)){
160                        $ida = $row['id_article'];
161                        if (
162                                                (isset($GLOBALS['article'])&&($GLOBALS['article']==$ida))
163                                        ||(isset($GLOBALS['id_article'])&&($GLOBALS['id_article']==$ida))
164                                        ||(isset($GLOBALS["article$ida"]))
165                                        ||(isset($GLOBALS['contexte_inclus']['id_article'])&&($GLOBALS['contexte_inclus']['id_article']==$ida)) ){
166                                        // un article qui utilise le form va etre rendu
167                                        // il faut utiliser le marquer cache pour ne pas polluer la page commune
168                                        $GLOBALS['marqueur'].=":sondage $idf";
169                                        break;
170                                }
171                }
172        }
173}
174
175?>
Note: See TracBrowser for help on using the repository browser.