source: spip-zone/_plugins_/acces_restreint/trunk/action/editer_zone.php @ 53633

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

Passer en une table de lien unique spip_zones_liens

File size: 4.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 */
7if (!defined("_ECRIRE_INC_VERSION")) return;
8
9/**
10 * editer une zone (action apres creation/modif de zone)
11 *
12 * @return array
13 */
14function action_editer_zone_dist(){
15
16        $securiser_action = charger_fonction('securiser_action', 'inc');
17        $arg = $securiser_action();
18
19        // si id_article n'est pas un nombre, c'est une creation
20        // mais on verifie qu'on a toutes les donnees qu'il faut.
21        if (!$id_zone = intval($arg)) {
22                if (!$id_zone = accesrestreint_action_insert_zone())
23                        return array(false,_L('echec'));
24                // ajouter les droits a l'admin si demande, lors de la creation
25                if (_request('droits_admin')){
26                        accesrestreint_revision_zone_objets_lies($id_zone,$GLOBALS['visiteur_session']['id_auteur'],'auteur');
27                }
28        }
29       
30        $err = action_zone_set($id_zone);
31        return array($id_zone,$err);
32}
33
34/**
35 * mettre a jour une zone
36 *
37 * @param int $id_zone
38 * @return string
39 */
40function action_zone_set($id_zone){
41        $err = '';
42
43        $c = array();
44        foreach (array(
45                'titre', 'descriptif',
46        ) as $champ)
47                $c[$champ] = _request($champ);
48        foreach (array(
49                'publique', 'privee'
50        ) as $champ)
51                $c[$champ] = _request($champ)=='oui'?'oui':'non';
52
53        include_spip('inc/modifier');
54        accesrestreint_revision_zone($id_zone, $c);
55        accesrestreint_revision_zone_objets_lies($id_zone, _request('rubriques'),'rubrique','set');
56
57        return $err;
58}
59
60
61/**
62 * Mettre a jour les liens objets/zones.
63 * si zones vaut '', associe toutes les zones a(aux) objets(s).
64 * $ids est une liste d'id.
65 * $type est le type de l'objet (rubrique, auteur).
66 * $operation = add/set/del pour ajouter, affecter uniquement, ou supprimer les objets listes dans ids.
67 *
68 * @param int|array $zones
69 * @param int|array $ids
70 * @param string $type
71 * @param string $operation
72 */
73function accesrestreint_revision_zone_objets_lies($zones,$ids,$type,$operation = 'add'){
74        include_spip('inc/autoriser');
75        $in = "";
76        if ($zones){
77                $in = sql_in('id_zone',$zones);
78        }
79        $liste = sql_allfetsel('id_zone','spip_zones',$in);
80        foreach($liste as $row){
81                if ($operation=='del'){
82                        // on supprime les ids listes
83                        sql_delete("spip_zones_liens",array("id_zone=".intval($row['id_zone']),"objet='$type'",sql_in("id_objet",$ids)));
84                }
85                else {
86                        if (!$ids) $ids = array();
87                        elseif (!is_array($ids)) $ids = array($ids);
88                        // si c'est une affectation exhaustive, supprimer les existants qui ne sont pas dans ids
89                        // si c'est un ajout, ne rien effacer
90                        if ($operation=='set')
91                                sql_delete("spip_zones_liens",array("id_zone=".intval($row['id_zone']),"objet='$type'",sql_in("id_objet",$ids,"NOT")));
92                        $deja = array_map('reset',sql_allfetsel("id_objet","spip_zones_liens","objet='$type' AND id_zone=".intval($row['id_zone'])));
93                        $add = array_diff($ids,$deja);
94                        foreach ($add as $id) {
95                                if (autoriser('affecterzones',$type,$id,null,array('id_zone'=>$row['id_zone'])))
96                                        sql_insertq("spip_zones_liens",array('id_zone'=>$row['id_zone'],"objet"=>$type,"id_objet"=>intval($id)));
97                        }
98                }
99        }       
100}
101
102/**
103 * Creer une nouvelle zone
104 *
105 * @return int
106 */
107function accesrestreint_action_insert_zone(){
108        include_spip('inc/autoriser');
109        if (!autoriser('creer','zone'))
110                return false;
111        // nouvel zone
112        $id_zone = sql_insertq("spip_zones", array("maj"=>"NOW()", 'publique'=>'non','privee'=>'non'));
113
114        if (!$id_zone){
115                spip_log("accesrestreint action : impossible d'ajouter un zone");
116                return false;
117        } 
118        return $id_zone;       
119}
120
121/**
122 * Enregistre la revision d'une zone
123 *
124 * @param int $id_zone
125 * @param array|bool $c
126 * @return string
127 */
128function accesrestreint_revision_zone($id_zone, $c=false) {
129
130        modifier_contenu('zone', $id_zone,
131                array(
132                        'nonvide' => array('titre' => _T('info_sans_titre')),
133                ),
134                $c);
135
136        return ''; // pas d'erreur
137}
138
139/**
140 * Supprimer une zone
141 *
142 * @param int $id_zone
143 * @return int
144 */
145function accesrestreint_supprime_zone($id_zone){
146        $supp_zone = sql_getfetsel("id_zone", "spip_zones", "id_zone=" . intval($id_zone));
147        if (intval($id_zone) AND        intval($id_zone) == intval($supp_zone)){
148                // d'abord les auteurs et zones en un coup
149                sql_delete("spip_zones_liens", "id_zone=".intval($id_zone));
150                // puis la zone
151                sql_delete("spip_zones", "id_zone=".intval($id_zone));
152        }
153        $id_zone = 0;
154        return $id_zone;
155}
156
157
158?>
Note: See TracBrowser for help on using the repository browser.