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

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

Bugfix #BOUTONS_ADMIN_MAGNET : utiliser l'indirection eventuelle, code genere si on passe un nom de pile
utiliser le filtre bouton_action qui peut etre surcharge (BS)
constante _IGNORE_MAGNET pour desactiver globalement les magnets sur toutes les boucles (peut etre utile dans une partie du site, une variante...)

File size: 10.4 KB
Line 
1<?php
2
3if (!defined("_ECRIRE_INC_VERSION")) return;
4
5/**
6 * informer si les magnets sont actifs sur un objet ou non (par defaut sur les articles uniquement)
7 *
8 * @param string $type
9 * @return bool
10 */
11function magnet_actif_sur_objet($type){
12        static $actifs;
13        if (is_null($actifs)){
14                if (!function_exists('lire_config')){
15                        include_spip('inc/config');
16                }
17                $actifs = lire_config("magnet/objets",array('spip_articles'));
18                $actifs = array_map('objet_type',$actifs);
19        }
20        $type = objet_type($type);
21        if (in_array($type,$actifs)){
22                return true;
23        }
24        return false;
25}
26
27
28/**
29 * Recuperer la liste des ids d'un type d'objet
30 * #MAGNET_LISTE_IDS{article}
31 * #MAGNET_LISTE_IDS{article, maselection}
32 *
33 * Peut etre utilisee pour faire {id_article IN #MAGNET_LISTE_IDS{article}}
34 * (alors equivalent a {magnet})
35 *
36 * @param object $p
37 * @return object
38 */
39function balise_MAGNET_LISTE_IDS_dist($p) {
40        $_objet = interprete_argument_balise(1,$p);
41        if (!$_objet) {
42                $err_b_s_a = array('zbug_balise_sans_argument', array('balise' => 'MAGNET_LISTE_IDS'));
43                erreur_squelette($err_b_s_a, $p);
44        }
45        else {
46                $_pile = interprete_argument_balise(2,$p);
47                if (!$_pile) {
48                        $_pile = "''";
49                }
50                $p->code = "magnet_liste_ids($_objet, $_pile, '')";
51                var_dump($p->code);
52        }
53
54        $p->interdire_scripts = false;
55        return $p;
56}
57
58
59/**
60 * Critere {magnet}
61 * {magnet} permet de selectionner uniquement les magnet
62 * {!magnet} permet d'exclure les magnet
63 * @param string $idb
64 * @param array $boucles
65 * @param Object $crit
66 */
67function critere_magnet_dist($idb, &$boucles, $crit) {
68        $boucle = &$boucles[$idb];
69        if (magnet_actif_sur_objet($boucle->type_requete)){
70                $w = array($crit->not?"'='":"'<>'","'magnet'","0");
71                $serveur = $boucle->sql_serveur;
72                $connexion = $GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0];
73                if (strncmp($connexion['type'], 'sqlite', 6) == 0) {
74                        $boucle->where[] = $w;
75                }
76                else {
77                        $boucle->having[] = $w;
78                }
79                $boucle->modificateur['criteres']['magnet'] = true;
80        }
81}
82
83/**
84 * Critere {magnet_pile nomdelapile}
85 * permet de selectionner une pile nommee plutot que la pile par defaut
86 * @param string $idb
87 * @param array $boucles
88 * @param Object $crit
89 */
90function critere_magnet_pile_dist($idb, &$boucles, $crit) {
91        $boucle = &$boucles[$idb];
92        if (isset($crit->param[0][0])
93          AND $crit->param[0][0]->type=="texte"
94                AND ($pile = $crit->param[0][0]->texte)){
95                $boucle->modificateur['magnet_pile'] = $pile;
96                $boucle->modificateur['criteres']['magnet_pile'] = true;
97        }
98}
99
100/**
101 * Critere {ignore_magnet} permet de desactiver la magnetisation des objets
102 * qui retrouvent leur ordre naturel
103 * @param string $idb
104 * @param array $boucles
105 * @param Object $crit
106 */
107function critere_ignore_magnet_dist($idb, &$boucles, $crit) {
108        $boucle = &$boucles[$idb];
109        if (magnet_actif_sur_objet($boucle->type_requete)){
110                $boucle->modificateur['ignore_magnet'] = true;
111        }
112}
113
114/**
115 * Generer les boutons pour d'admin magnet selon les droits du visiteur
116 *
117 * @param object $p
118 * @return object
119 */
120function balise_BOUTONS_ADMIN_MAGNET_dist($p) {
121        $_pile_arg = '';
122        if (($_pile = interprete_argument_balise(1,$p))===NULL)
123                $_pile = "''";
124        else {
125                $_pile_arg = ",\''.addslashes(".$_pile.").'\'";
126        }
127
128        $b = $p->nom_boucle ? $p->nom_boucle : $p->id_boucle;
129        if ($table = $p->boucles[$b]->type_requete){
130                $type = objet_type($table);
131                $_id = champ_sql(id_table_objet($type), $p);
132                $_objet = "'$type'";
133        }
134        else {
135                $_id = champ_sql('id_objet', $p);
136                $_objet = champ_sql('objet', $p);
137        }
138
139                $p->code = "
140'<'.'?php
141        if (isset(\$GLOBALS[\'visiteur_session\'][\'statut\'])
142          AND \$GLOBALS[\'visiteur_session\'][\'statut\']==\'0minirezo\'
143                AND (\$id = '.intval($_id).')
144                AND include_spip(\'inc/autoriser\')
145                AND autoriser(\'administrermagnet\','.sql_quote($_objet).',\$id)
146                AND include_spip(\'magnet_fonctions\')) {
147                        echo \"<div class=\'boutons spip-admin actions magnets pile-'.$_pile.'\'>\"
148                        . magnet_html_boutons_admin('.sql_quote($_objet).',\$id,\'admin-magnet\'$_pile_arg)
149                        . \"<style>.bouton_action_post.spip-admin-boutons.admin-magnet-'.$_objet.'{display:none;}</style></div>\";
150                }
151?'.'>'";
152
153        $p->interdire_scripts = false;
154        return $p;
155}
156
157
158/**
159 * Inserer la clause order : le champ magnet prend 0 pour les objets non magnet et un indice croissant pour les objets magnet
160 * le dernier magnetize arrive en premier
161 * pour remonter un objet magnet en tete il faut le demagnetizer/remagnetizer
162 * @param $boucle
163 * @return mixed
164 */
165function magnet_pre_boucle($boucle){
166        if (!isset($boucle->modificateur['ignore_magnet'])
167          AND !defined('_IGNORE_MAGNET')
168          AND (!test_espace_prive() OR isset($boucle->modificateur['criteres']['magnet']) OR isset($boucle->modificateur['criteres']['magnet_pile']))){
169                if (magnet_actif_sur_objet($boucle->type_requete)){
170                        $pile = (isset($boucle->modificateur['magnet_pile'])?$boucle->modificateur['magnet_pile']:'');
171                        $_id = $boucle->id_table . "." . $boucle->primary;
172                        $magnet = true;
173                        // si la boucle a un critere id_xxx=yy non conditionnel on ne magnet pas (perf issue)
174                        if (isset($boucle->modificateur['criteres'][$boucle->primary])){
175                                foreach($boucle->where as $where){
176                                        if (is_array($where)
177                                                AND $where['0']=="'='"
178                                                AND $where['1']=="'".$_id."'"){
179                                                $magnet = false;
180                                                break;
181                                        }
182                                }
183                        }
184                        if ($magnet){
185                                $_list = "implode(',',array_reverse(magnet_liste_ids('".addslashes($boucle->type_requete)."', '".addslashes($pile)."')))";
186                                $boucle->select[] = "FIELD($_id,\".$_list.\") as magnet";
187                                if (count($boucle->default_order) AND !count($boucle->order)){
188                                        while(count($boucle->default_order)){
189                                                $boucle->order[] = array_shift($boucle->default_order);
190                                        }
191                                }
192                                array_unshift($boucle->order, "'magnet DESC'");
193                        }
194                }
195        }
196        return $boucle;
197}
198
199/**
200 * Generer le HTML des boutons d'admin magnet
201 *
202 * @param $objet
203 * @param $id_objet
204 * @param string $class
205 * @param string $pile
206 * @return string
207 */
208function magnet_html_boutons_admin($objet, $id_objet, $class="", $pile=''){
209        static $done = false;
210        if (!function_exists('generer_action_auteur'))
211                include_spip('inc/actions');
212        if (!function_exists('bouton_action'))
213                include_spip('inc/filtres');
214        $bouton_action = chercher_filtre("bouton_action");
215
216        $pile_arg = ($pile?"-$pile":"");
217        $magnet_rang = magnet_rang($objet, $id_objet, $pile);
218        $ur_action = generer_action_auteur("magnetize",$objet."-".$id_objet."-".($magnet_rang?"off":"on").$pile_arg,self());
219        $balise_img = chercher_filtre("balise_img");
220        $bclass = $class . " magnet ";
221        if ($magnet_rang) {
222                $bclass .= "magnetized";
223                $label = "<i></i>($magnet_rang) <span>"._T('magnet:label_demagnetize')."</span>";
224                $boutons = $bouton_action($label,$ur_action,$bclass);
225                if ($magnet_rang>1){
226                        $ur_action = generer_action_auteur("magnetize",$objet."-".$id_objet."-"."up".$pile_arg,self());
227                        $boutons = $bouton_action($balise_img(_DIR_PLUGIN_MAGNET."img/magnet-up-24.png","monter"),$ur_action, $class ." magnet-up",'',_T('magnet:label_up')) . $boutons;
228                }
229                if ($magnet_rang<magnet_count($objet, $pile)){
230                        $ur_action = generer_action_auteur("magnetize",$objet."-".$id_objet."-"."down".$pile_arg,self());
231                        $boutons = $bouton_action($balise_img(_DIR_PLUGIN_MAGNET."img/magnet-down-24.png","descendre"),$ur_action, $class ." magnet-down",'',_T('magnet:label_down')) . $boutons;
232                }
233        }
234        else {
235                $bclass .= "demagnetized";
236                $label = "<i></i><span>"._T('magnet:label_magnetize')."</span>";
237                $boutons = $bouton_action($label,$ur_action,$bclass);
238        }
239
240        if ($pile){
241                $boutons = "<strong>"._T("magnets_pile:".strtolower($pile))."</strong> " . $boutons;
242        }
243
244        if (!$done){
245                $done = true;
246                $css_file = direction_css(find_in_path("css/magnet-admin.css"));
247                $css = spip_file_get_contents($css_file);
248                $css = urls_absolues_css($css,$css_file);
249                $boutons .= "<style>$css</style>";
250        }
251
252
253        return $boutons;
254}
255
256
257/**
258 * Ajouter un bouton pour magnetiser/demagnetiser un objet
259 * @param $flux
260 * @return mixed
261 */
262function magnet_formulaire_admin($flux){
263        if (
264                isset( $flux['args']['contexte']['objet'])
265                AND $objet = $flux['args']['contexte']['objet']
266                AND magnet_actif_sur_objet($objet)
267                AND $id_objet = intval($flux['args']['contexte']['id_objet'])
268                AND isset($GLOBALS['visiteur_session']['statut'])
269                AND $GLOBALS['visiteur_session']['statut']=='0minirezo'
270                AND include_spip('inc/autoriser')
271                AND autoriser('administrermagnet',$objet,$id_objet))
272        {
273                $boutons = magnet_html_boutons_admin($objet, $id_objet,"spip-admin-boutons admin-magnet admin-magnet-$objet") . " ";
274                $p = strpos($flux['data'],"<a");
275                $flux['data'] = substr_replace($flux['data'],$boutons,$p,0);
276        }
277        return $flux;
278}
279
280/**
281 * Nom de la meta qui stocke les id magnets d'un objet et d'une pile
282 * @param string $objet
283 * @param string $pile
284 *   nom de la pile ou sinon pile par defaut
285 * @return string
286 */
287function magnet_nom_meta_pile($objet, $pile = '') {
288        if (!function_exists('table_objet')) {
289                include_spip('base/objets');
290        }
291        $meta_magnet = "magnet_"
292                . ($pile ? $pile . "_" : "" )
293                . table_objet($objet);
294
295        return $meta_magnet;
296}
297
298/**
299 * Lister les ids magnetises d'un objet et d'une pile
300 * @param string $objet
301 * @param string $pile
302 * @param string $defaut
303 *   valeur par defaut de la meta si non definie ou zero
304 * @return array|string
305 */
306function magnet_liste_ids($objet, $pile, $defaut = '0') {
307        $meta_magnet = magnet_nom_meta_pile($objet, $pile);
308        // ne pas renvoyer une liste vide
309        $ids = $defaut;
310        if (isset($GLOBALS['meta'][$meta_magnet]) and $GLOBALS['meta'][$meta_magnet]) {
311                $ids = trim($GLOBALS['meta'][$meta_magnet]);
312        }
313        if (!strlen($ids)) {
314                return array();
315        }
316        $ids = explode(',', $ids);
317        $ids = array_map('trim', $ids);
318        $ids = array_map('intval', $ids);
319        return $ids;
320}
321
322/**
323 * Renvoie le rang de l'objet :
324 * 1 si arrive en tete de la boucle,
325 * 2 ensuite ....
326 * 0 si n'est pas magnetise
327 *
328 * @param string $objet
329 * @param int $id_objet
330 * @param string $pile
331 * @return bool|mixed
332 */
333function magnet_rang($objet, $id_objet, $pile=''){
334        $magnets = magnet_liste_ids($objet, $pile, '');
335        if (!in_array($id_objet, $magnets)) {
336                return false;
337        }
338        return array_search($id_objet,$magnets)+1;
339}
340
341/**
342 * Compter le nombre d'objet magnetises
343 * @param string $objet
344 * @param string $pile
345 * @return int
346 */
347function magnet_count($objet, $pile=''){
348        $magnets = magnet_liste_ids($objet, $pile, '');
349        return count($magnets);
350}
351
352function magnet_boite_infos($flux){
353        if (magnet_actif_sur_objet($flux['args']['type'])
354          AND $id = $flux['args']['id']){
355                $flux['data'] .= recuperer_fond('prive/squelettes/inclure/magnet-admin',array('id_objet'=>$id,'objet'=>$flux['args']['type']));
356        }
357        return $flux;
358}
Note: See TracBrowser for help on using the repository browser.