source: spip-zone/_plugins_/magnet/trunk/magnet_fonctions.php @ 91579

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

On peut configurer les objets sur lesquels on veut activer les aimants - par defaut les article uniquement
+ quand un bouton admin magnet est dans la page, il ne doit masquer celui des boutons d'admin spip que si c'est le meme type d'objet

File size: 8.2 KB
Line 
1<?php
2
3if (!defined("_ECRIRE_INC_VERSION")) return;
4
5function magnet_actif_sur_objet($type){
6        static $actifs;
7        if (is_null($actifs)){
8                $actifs = lire_config("magnet/objets",array('spip_articles'));
9                $actifs = array_map('objet_type',$actifs);
10        }
11        $type = objet_type($type);
12        if (in_array($type,$actifs)){
13                return true;
14        }
15        return false;
16}
17
18/**
19 * Critere {magnet}
20 * {magnet} permet de selectionner uniquement les magnet
21 * {!magnet} permet d'exclure les magnet
22 * @param string $idb
23 * @param array $boucles
24 * @param Object $crit
25 */
26function critere_magnet_dist($idb, &$boucles, $crit) {
27        $boucle = &$boucles[$idb];
28        if (magnet_actif_sur_objet($boucle->type_requete)){
29                $boucle->having[] = array($crit->not?"'='":"'<>'","'magnet'","0");
30        }
31}
32
33/**
34 * Critere {magnet_pile nomdelapile}
35 * permet de selectionner une pile nommee plutot que la pile par defaut
36 * @param string $idb
37 * @param array $boucles
38 * @param Object $crit
39 */
40function critere_magnet_pile_dist($idb, &$boucles, $crit) {
41        $boucle = &$boucles[$idb];
42        if (isset($crit->param[0][0])
43          AND $crit->param[0][0]->type=="texte"
44                AND ($pile = $crit->param[0][0]->texte)){
45                $boucle->modificateur['magnet_pile'] = $pile;
46        }
47}
48
49/**
50 * Critere {ignore_magnet} permet de desactiver la magnetisation des objets
51 * qui retrouvent leur ordre naturel
52 * @param string $idb
53 * @param array $boucles
54 * @param Object $crit
55 */
56function critere_ignore_magnet_dist($idb, &$boucles, $crit) {
57        $boucle = &$boucles[$idb];
58        if (magnet_actif_sur_objet($boucle->type_requete)){
59                $boucle->modificateur['ignore_magnet'] = true;
60        }
61}
62
63/**
64 * Generer les boutons pour d'admin magnet selon les droits du visiteur
65 *
66 * @param object $p
67 * @return object
68 */
69function balise_BOUTONS_ADMIN_MAGNET_dist($p) {
70        $_pile_arg = '';
71        if (($_pile = interprete_argument_balise(1,$p))===NULL)
72                $_pile = "''";
73        else {
74                $_pile_arg = ",".addslashes($_pile);
75        }
76
77        if ($table = $p->type_requete){
78                $type = objet_type($table);
79                $_id = champ_sql(id_table_objet($type), $p);
80                $_objet = "'$type'";
81        }
82        else {
83                $_id = champ_sql('id_objet', $p);
84                $_objet = champ_sql('objet', $p);
85        }
86
87                $p->code = "
88'<'.'?php
89        if (isset(\$GLOBALS[\'visiteur_session\'][\'statut\'])
90          AND \$GLOBALS[\'visiteur_session\'][\'statut\']==\'0minirezo\'
91                AND (\$id = '.intval($_id).')
92                AND include_spip(\'inc/autoriser\')
93                AND autoriser(\'administrermagnet\','.sql_quote($_objet).',\$id)
94                AND include_spip(\'magnet_fonctions\')) {
95                        echo \"<div class=\'boutons spip-admin actions magnets pile-'.$_pile.'\'>\"
96                        . magnet_html_boutons_admin('.sql_quote($_objet).',\$id,\'admin-magnet\'$_pile_arg)
97                        . \"<style>.bouton_action_post.spip-admin-boutons.admin-magnet-'.$_objet.'{display:none;}</style></div>\";
98                }
99?'.'>'";
100
101        $p->interdire_scripts = false;
102        return $p;
103}
104
105
106/**
107 * Inserer la clause order : le champ magnet prend 0 pour les objets non magnet et un indice croissant pour les objets magnet
108 * le dernier magnetize arrive en premier
109 * pour remonter un objet magnet en tete il faut le demagnetizer/remagnetizer
110 * @param $boucle
111 * @return mixed
112 */
113function magnet_pre_boucle(&$boucle){
114        if (!isset($boucle->modificateur['ignore_magnet'])
115          AND (!test_espace_prive() OR isset($boucle->modificateur['criteres']['magnet']) OR isset($boucle->modificateur['criteres']['magnet_pile']))){
116                if (magnet_actif_sur_objet($boucle->type_requete)){
117                        $pile = (isset($boucle->modificateur['magnet_pile'])?$boucle->modificateur['magnet_pile']:'');
118                        $meta_magnet = "magnet_" .($pile?$pile."_":""). $boucle->type_requete;
119                        $_id = $boucle->id_table . "." . $boucle->primary;
120                        $magnet = true;
121                        // si la boucle a un critere id_xxx=yy non conditionnel on ne magnet pas (perf issue)
122                        if (isset($boucle->modificateur['criteres'][$boucle->primary])){
123                                foreach($boucle->where as $where){
124                                        if (is_array($where)
125                                                AND $where['0']=="'='"
126                                                AND $where['1']=="'".$_id."'"){
127                                                $magnet = false;
128                                                break;
129                                        }
130                                }
131                        }
132                        if ($magnet){
133                                $_list = "implode(',',array_reverse(array_map('intval',explode(',',isset(\$GLOBALS['meta']['$meta_magnet'])?\$GLOBALS['meta']['$meta_magnet']:'0'))))";
134                                $boucle->select[] = "FIELD($_id,\".$_list.\") as magnet";
135                                if (count($boucle->default_order) AND !count($boucle->order)){
136                                        while(count($boucle->default_order)){
137                                                $boucle->order[] = array_shift($boucle->default_order);
138                                        }
139                                }
140                                array_unshift($boucle->order, "'magnet DESC'");
141                        }
142                }
143        }
144        return $boucle;
145}
146
147
148/**
149 * Generer le HTML des boutons d'admin magnet
150 *
151 * @param $objet
152 * @param $id_objet
153 * @param string $class
154 * @param string $pile
155 * @return string
156 */
157function magnet_html_boutons_admin($objet, $id_objet, $class="", $pile=''){
158        static $done = false;
159        if (!function_exists('generer_action_auteur'))
160                include_spip('inc/actions');
161        if (!function_exists('bouton_action'))
162                include_spip('inc/filtres');
163
164        $pile_arg = ($pile?"-$pile":"");
165        $magnet_rang = magnet_rang($objet, $id_objet, $pile);
166        $ur_action = generer_action_auteur("magnetize",$objet."-".$id_objet."-".($magnet_rang?"off":"on").$pile_arg,self());
167        $balise_img = chercher_filtre("balise_img");
168        $bclass = $class . " magnet ";
169        if ($magnet_rang) {
170                $bclass .= "magnetized";
171                $label = "<i></i>($magnet_rang) <span>"._T('magnet:label_demagnetize')."</span>";
172                $boutons = bouton_action($label,$ur_action,$bclass);
173                if ($magnet_rang>1){
174                        $ur_action = generer_action_auteur("magnetize",$objet."-".$id_objet."-"."up".$pile_arg,self());
175                        $boutons = bouton_action($balise_img(_DIR_PLUGIN_MAGNET."img/magnet-up-24.png","monter"),$ur_action, $class ." magnet-up",'',_T('magnet:label_up')) . $boutons;
176                }
177                if ($magnet_rang<magnet_count($objet)){
178                        $ur_action = generer_action_auteur("magnetize",$objet."-".$id_objet."-"."down".$pile_arg,self());
179                        $boutons = bouton_action($balise_img(_DIR_PLUGIN_MAGNET."img/magnet-down-24.png","descendre"),$ur_action, $class ." magnet-down",'',_T('magnet:label_down')) . $boutons;
180                }
181        }
182        else {
183                $bclass .= "demagnetized";
184                $label = "<i></i><span>"._T('magnet:label_magnetize')."</span>";
185                $boutons = bouton_action($label,$ur_action,$bclass);
186        }
187
188        if ($pile){
189                $boutons = "<strong>"._T("magnets_pile:".strtolower($pile))."</strong> " . $boutons;
190        }
191
192        if (!$done){
193                $done = true;
194                $css_file = find_in_path("css/magnet-admin.css");
195                $css = spip_file_get_contents($css_file);
196                $css = urls_absolues_css($css,$css_file);
197                $boutons .= "<style>$css</style>";
198        }
199
200
201        return $boutons;
202}
203
204
205/**
206 * Ajouter un bouton pour magnetiser/demagnetiser un objet
207 * @param $flux
208 * @return mixed
209 */
210function magnet_formulaire_admin($flux){
211        if (  $objet = $flux['args']['contexte']['objet']
212          AND magnet_actif_sur_objet($objet)
213          AND $id_objet = intval($flux['args']['contexte']['id_objet'])
214          AND isset($GLOBALS['visiteur_session']['statut'])
215                AND $GLOBALS['visiteur_session']['statut']=='0minirezo'
216          AND include_spip('inc/autoriser')
217          AND autoriser('administrermagnet',$objet,$id_objet)){
218                $boutons = magnet_html_boutons_admin($objet, $id_objet,"spip-admin-boutons admin-magnet admin-magnet-$objet") . " ";
219                $p = strpos($flux['data'],"<a");
220                $flux['data'] = substr_replace($flux['data'],$boutons,$p,0);
221        }
222        return $flux;
223}
224
225/**
226 * Renvoie le rang de l'objet :
227 * 1 si arrive en tete de la boucle,
228 * 2 ensuite ....
229 * 0 si n'est pas magnetise
230 *
231 * @param string $objet
232 * @param int $id_objet
233 * @param string $pile
234 * @return bool|mixed
235 */
236function magnet_rang($objet, $id_objet, $pile=''){
237        $meta_magnet = "magnet_" .($pile?$pile."_":""). table_objet($objet);
238        $magnets = (isset($GLOBALS['meta'][$meta_magnet])?$GLOBALS['meta'][$meta_magnet]:'0');
239        $magnets = explode(',',$magnets);
240        if (!in_array($id_objet, $magnets))
241                return false;
242        return array_search($id_objet,$magnets)+1;
243}
244
245/**
246 * Compter le nombre d'objet magnetises
247 * @param string $objet
248 * @param string $pile
249 * @return int
250 */
251function magnet_count($objet, $pile=''){
252        $meta_magnet = "magnet_" .($pile?$pile."_":""). table_objet($objet);
253        $magnets = (isset($GLOBALS['meta'][$meta_magnet])?$GLOBALS['meta'][$meta_magnet]:'');
254        $magnets = explode(',',$magnets);
255        return count($magnets);
256}
257
258function magnet_boite_infos($flux){
259        if (magnet_actif_sur_objet($flux['args']['type'])
260          AND $id = $flux['args']['id']){
261                $flux['data'] .= recuperer_fond('prive/squelettes/inclure/magnet-admin',array('id_objet'=>$id,'objet'=>$flux['args']['type']));
262        }
263        return $flux;
264}
Note: See TracBrowser for help on using the repository browser.