source: spip-zone/_plugins_/acces_restreint/trunk/accesrestreint_fonctions.php @ 81728

Last change on this file since 81728 was 81728, checked in by teddy.spip@…, 7 years ago

Si j'avais sû ça il y a quelques jours, ça aurait été plus simple.
C'est mieux d'avoir les exemples d'utilisation dans le code directement.
On incrémente pour que les archives se refasse.

File size: 8.2 KB
Line 
1<?php
2/**
3 * Plugin Acces Restreint 3.0 pour Spip 2.0
4 * Licence GPL (c) 2006-2008 Cedric Morin
5 *
6 */
7
8if (!defined("_ECRIRE_INC_VERSION")) return;
9include_spip('public/accesrestreint');
10include_spip('inc/accesrestreint');
11
12/**
13 * filtre de securisation des squelettes
14 * utilise avec [(#REM|accesrestreint_securise_squelette)]
15 * evite divulgation d'info si plugin desactive
16 * par erreur fatale
17 *
18 * @param unknown_type $letexte
19 * @return unknown
20 */
21function accesrestreint_securise_squelette($letexte){
22        return "";
23}
24
25
26/**
27 * filtre de test pour savoir si l'acces a un article est restreint
28 *
29 * @param int $id_article
30 * @param int $id_auteur
31 * @return bool
32 */
33function accesrestreint_article_restreint($id_article, $id_auteur=null){
34        include_spip('public/quete');
35        include_spip('inc/accesrestreint');
36        $article = quete_parent_lang('spip_articles',$id_article);
37        return
38                @in_array($article['id_rubrique'],
39                        accesrestreint_liste_rubriques_exclues(!test_espace_prive(), $id_auteur)
40                );
41}
42
43
44/**
45 * filtre de test pour savoir si l'acces a une rubrique est restreinte
46 *
47 * @param int $id_rubrique
48 * @param int $id_auteur
49 * @return bool
50 */
51function accesrestreint_rubrique_restreinte($id_rubrique, $id_auteur=null){
52        include_spip('inc/accesrestreint');
53        return
54                @in_array($id_rubrique,
55                        accesrestreint_liste_rubriques_exclues(!test_espace_prive(), $id_auteur)
56                );
57}
58
59/**
60 * Filtre pour tester l'appartenance d'un auteur a une zone
61 *
62 * @param int $id_zone
63 * @param int $id_auteur
64 * @return bool
65 */
66function accesrestreint_acces_zone($id_zone,$id_auteur=null){
67        static $liste_zones = array();
68        if (is_null($id_auteur)) $id_auteur=$GLOBALS['visiteur_session']['id_auteur'];
69        if (!isset($liste_zones[$id_auteur])){
70                if ($GLOBALS['accesrestreint_zones_autorisees']
71                  AND ($id_auteur==$GLOBALS['visiteur_session']['id_auteur']))
72                        $liste_zones[$id_auteur] = explode(',',$GLOBALS['accesrestreint_zones_autorisees']);
73                elseif (!is_null($id_auteur)){
74                        include_spip('inc/accesrestreint');
75                        $liste_zones[$id_auteur] = explode(',',accesrestreint_liste_zones_autorisees('',$id_auteur));
76                }
77        }
78       
79        return in_array($id_zone,$liste_zones[$id_auteur]);
80}
81
82/**
83 * fonction pour afficher une icone 12px selon le statut de l'auteur
84 *
85 * @param string $statut
86 * @return string
87 */
88function icone_auteur_12($statut){
89        if ($statut=='0minirezo') return _DIR_IMG_PACK . 'admin-12.gif';
90        if ($statut=='1comite') return _DIR_IMG_PACK . 'redac-12.gif';
91        return _DIR_IMG_PACK . 'visit-12.gif';
92}
93
94
95
96
97
98/**
99 * Retroune les identifiants des zones a laquelle appartient une rubrique
100 * et ses rubriques parentes
101 * (quelquesoit la visibilité de la zone (publique, prive, les 2 ou aucun)
102 *
103 * @param int $id_rubrique
104 * @return array identifiants des zones
105 */
106function accesrestreint_zones_rubrique_et_hierarchie($id_rubrique) {
107        static $zones = array();
108       
109        if (!$id_rubrique) {
110                return array();
111        }
112       
113        if (isset($zones[$id_rubrique])) {
114                return $zones[$id_rubrique];
115        }
116
117        // on teste notre rubrique deja
118        $idz = accesrestreint_zones_rubrique($id_rubrique);
119       
120        // on parcours toute l'arborescence jusqu'a la racine en testant les zones
121        // pour completer les zones deja trouvees
122        if ($id_parent = sql_getfetsel('id_parent', 'spip_rubriques', 'id_rubrique='.intval($id_rubrique))) {
123                // on teste notre parent
124                $idz_parent = accesrestreint_zones_rubrique_et_hierarchie($id_parent);
125                $idz = array_merge($idz, $idz_parent);
126        }
127
128        // on renvoie la rubrique
129        return $zones[$id_rubrique] = $idz;
130}
131
132
133/**
134 * Retroune les identifiants des zones a laquelle appartient une rubrique
135 * (quelquesoit la visibilité de la zone (publique, prive, les 2 ou aucun)
136 *
137 * @param int $id_rubrique
138 * @return array identifiants des zones
139 */
140function accesrestreint_zones_rubrique($id_rubrique) {
141        // on teste notre rubrique deja
142        $idz = sql_allfetsel('id_zone', 'spip_zones_liens', "objet='rubrique' AND id_objet=". intval($id_rubrique));
143        if (is_array($idz)) {
144                $idz = array_map('reset', $idz);
145                return $idz;
146        }
147        return array();
148}
149
150/**
151 * Cherche si la rubrique donnée est inclue dans une zone d'accès restreinte.
152 *
153 * [(#ID_RUBRIQUE|accesrestreint_rubrique_zone_restreinte|oui) Rubrique non visible dans une zone]
154 * [(#ID_RUBRIQUE|accesrestreint_rubrique_zone_restreinte{tout}) Rubrique dans une zone ]
155 *
156 * @param int $id_rubrique : identifiant de la rubrique
157 * @param null|bool|string $_publique
158 *   Sélectionner les rubriques
159 *   cachées dans le public (true),
160 *   le privé (false),
161 *   selon le contexte privé ou public (null),
162 *   cachées ou non quelque soit le contexte ('tout')
163 * @return bool La rubrique est présente dans une zone
164 */
165function accesrestreint_rubrique_zone_restreinte($id_rubrique, $_publique=null) {
166        return
167                @in_array($id_rubrique,
168                        accesrestreint_liste_rubriques_restreintes_et_enfants($_publique)
169                );
170}
171
172/**
173 * Retourne la liste de toutes les rubriques sélectionnées dans des zones
174 *
175 * @param null|bool|string      $_publique
176 *   Sélectionner les rubriques
177 *   cachées dans le public (true),
178 *   le privé (false),
179 *   selon le contexte privé ou public (null),
180 *   cachées ou non quelque soit le contexte ('tout')
181 * @return Array liste d'identifiants de rubriques
182 */
183function accesrestreint_liste_rubriques_restreintes($_publique = null) {
184        static $rubs = array();
185
186        // $_publique : null, true, false, 'tout'
187        $tout = false;
188        if (is_null($_publique)) {
189                $_publique = !test_espace_prive();
190        } elseif ($_publique === 'tout') {
191                $tout = true;
192        }
193
194        if (isset($rubs[$_publique])) {
195                return $rubs[$_publique];
196        }
197
198        $where = array("zr.objet='rubrique'");
199        if (!$tout) {
200                if ($_publique) {
201                        $where[] = 'z.publique=' . sql_quote('oui');
202                } else {
203                        $where[] = 'z.privee=' . sql_quote('oui');
204                }
205        }
206       
207        $idz = sql_allfetsel('DISTINCT(zr.id_objet)', 'spip_zones_liens AS zr JOIN spip_zones AS z ON z.id_zone = zr.id_zone', $where);
208       
209        if (is_array($idz)) {
210                $idz = array_map('reset', $idz);
211                return $rubs[$_publique] = $idz;
212        }
213       
214        return $rubs[$_publique] = array();
215}
216
217
218/**
219 * Retourne la liste de toutes les rubriques sélectionnées dans des zones
220 *
221 * @example
222 *   accesrestreint_liste_rubriques_restreintes_et_enfants(false)
223 *   retourne les id des rubriques et leurs enfants restreints
224 *   dans le privé
225 *   
226 *   accesrestreint_liste_rubriques_restreintes_et_enfants(true)
227 *   retourne les id des rubriques et leurs enfants restreints
228 *   dans le public
229 *   
230 *   accesrestreint_liste_rubriques_restreintes_et_enfants('tout')
231 *   retourne les id des rubriques et leurs enfants restreints
232 *   dans le privé et dans le public
233 *
234 * @param null|bool|string $_publique
235 *   Sélectionner les rubriques
236 *   cachées dans le public (true),
237 *   le privé (false),
238 *   selon le contexte privé ou public (null),
239 *   cachées ou non quelque soit le contexte ('tout')
240 * @return Array liste d'identifiants de rubriques
241 */
242function accesrestreint_liste_rubriques_restreintes_et_enfants($_publique = null) {
243        static $rubs = array();
244
245        if (is_null($_publique)) {
246                $_publique = !test_espace_prive();
247        }
248
249        if (isset($rubs[$_publique])) {
250                return $rubs[$_publique];
251        }
252       
253        $parents = accesrestreint_liste_rubriques_restreintes($_publique);
254
255        if ($parents) {
256                include_spip('inc/rubriques');
257                $branches = explode(',', calcul_branche_in($parents));
258                return $rubs[$_publique] = $branches;
259        }
260       
261        return $rubs[$_publique] = array();
262}
263
264/**
265 * Un auteur donné fait il partie d'une zone permettant de voir telle rubrique.
266 * Renvoie true, si l'auteur peut voir la rubrique,
267 * quelquesoit la visibilité des rubriques de la zone
268 *
269 * @param int $id_auteur        Identifiant de l'auteur
270 * @param int $id_rubrique      Identifiant de la rubrique
271 * @return bool L'auteur fait partie de la rubrique.
272 */
273function accesrestreint_auteur_lie_a_rubrique($id_auteur, $id_rubrique) {
274        if (!$id_auteur)   return false;
275        if (!$id_rubrique) return false;
276        // $auteur[3][8] : l'auteur 3 ne peut pas voir la rubrique 8
277        static $auteurs = array();
278        if (!isset($auteurs[$id_auteur])) {
279                $auteurs[$id_auteur] = array();
280
281                include_spip('inc/accesrestreint');
282                $auteurs[$id_auteur] = array_flip(accesrestreint_liste_rubriques_exclues(true, $id_auteur, true));
283        }
284       
285        // si la rubrique est presente, c'est qu'on ne peut pas la voir !
286        if (isset($auteurs[$id_auteur][$id_rubrique])) {
287                return false;
288        }
289       
290        return true;
291       
292}
293
294
295?>
Note: See TracBrowser for help on using the repository browser.