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

Last change on this file was 114475, checked in by cedric@…, 13 days ago

Un peu de refactoring + une balise #MAGNET_LISTE_IDS :
#MAGNET_LISTE_IDS{article} liste les id_article magnetises
#MAGNET_LISTE_IDS{article, selection} lise les id_article magnetises dans la pile 'selection'

File size: 10.2 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        if ($table = $p->type_requete){
129                $type = objet_type($table);
130                $_id = champ_sql(id_table_objet($type), $p);
131                $_objet = "'$type'";
132        }
133        else {
134                $_id = champ_sql('id_objet', $p);
135                $_objet = champ_sql('objet', $p);
136        }
137
138                $p->code = "
139'<'.'?php
140        if (isset(\$GLOBALS[\'visiteur_session\'][\'statut\'])
141          AND \$GLOBALS[\'visiteur_session\'][\'statut\']==\'0minirezo\'
142                AND (\$id = '.intval($_id).')
143                AND include_spip(\'inc/autoriser\')
144                AND autoriser(\'administrermagnet\','.sql_quote($_objet).',\$id)
145                AND include_spip(\'magnet_fonctions\')) {
146                        echo \"<div class=\'boutons spip-admin actions magnets pile-'.$_pile.'\'>\"
147                        . magnet_html_boutons_admin('.sql_quote($_objet).',\$id,\'admin-magnet\'$_pile_arg)
148                        . \"<style>.bouton_action_post.spip-admin-boutons.admin-magnet-'.$_objet.'{display:none;}</style></div>\";
149                }
150?'.'>'";
151
152        $p->interdire_scripts = false;
153        return $p;
154}
155
156
157/**
158 * Inserer la clause order : le champ magnet prend 0 pour les objets non magnet et un indice croissant pour les objets magnet
159 * le dernier magnetize arrive en premier
160 * pour remonter un objet magnet en tete il faut le demagnetizer/remagnetizer
161 * @param $boucle
162 * @return mixed
163 */
164function magnet_pre_boucle($boucle){
165        if (!isset($boucle->modificateur['ignore_magnet'])
166          AND (!test_espace_prive() OR isset($boucle->modificateur['criteres']['magnet']) OR isset($boucle->modificateur['criteres']['magnet_pile']))){
167                if (magnet_actif_sur_objet($boucle->type_requete)){
168                        $pile = (isset($boucle->modificateur['magnet_pile'])?$boucle->modificateur['magnet_pile']:'');
169                        $_id = $boucle->id_table . "." . $boucle->primary;
170                        $magnet = true;
171                        // si la boucle a un critere id_xxx=yy non conditionnel on ne magnet pas (perf issue)
172                        if (isset($boucle->modificateur['criteres'][$boucle->primary])){
173                                foreach($boucle->where as $where){
174                                        if (is_array($where)
175                                                AND $where['0']=="'='"
176                                                AND $where['1']=="'".$_id."'"){
177                                                $magnet = false;
178                                                break;
179                                        }
180                                }
181                        }
182                        if ($magnet){
183                                $_list = "implode(',',array_reverse(magnet_liste_ids('".addslashes($boucle->type_requete)."', '".addslashes($pile)."')))";
184                                $boucle->select[] = "FIELD($_id,\".$_list.\") as magnet";
185                                if (count($boucle->default_order) AND !count($boucle->order)){
186                                        while(count($boucle->default_order)){
187                                                $boucle->order[] = array_shift($boucle->default_order);
188                                        }
189                                }
190                                array_unshift($boucle->order, "'magnet DESC'");
191                        }
192                }
193        }
194        return $boucle;
195}
196
197
198/**
199 * Generer le HTML des boutons d'admin magnet
200 *
201 * @param $objet
202 * @param $id_objet
203 * @param string $class
204 * @param string $pile
205 * @return string
206 */
207function magnet_html_boutons_admin($objet, $id_objet, $class="", $pile=''){
208        static $done = false;
209        if (!function_exists('generer_action_auteur'))
210                include_spip('inc/actions');
211        if (!function_exists('bouton_action'))
212                include_spip('inc/filtres');
213
214        $pile_arg = ($pile?"-$pile":"");
215        $magnet_rang = magnet_rang($objet, $id_objet, $pile);
216        $ur_action = generer_action_auteur("magnetize",$objet."-".$id_objet."-".($magnet_rang?"off":"on").$pile_arg,self());
217        $balise_img = chercher_filtre("balise_img");
218        $bclass = $class . " magnet ";
219        if ($magnet_rang) {
220                $bclass .= "magnetized";
221                $label = "<i></i>($magnet_rang) <span>"._T('magnet:label_demagnetize')."</span>";
222                $boutons = bouton_action($label,$ur_action,$bclass);
223                if ($magnet_rang>1){
224                        $ur_action = generer_action_auteur("magnetize",$objet."-".$id_objet."-"."up".$pile_arg,self());
225                        $boutons = bouton_action($balise_img(_DIR_PLUGIN_MAGNET."img/magnet-up-24.png","monter"),$ur_action, $class ." magnet-up",'',_T('magnet:label_up')) . $boutons;
226                }
227                if ($magnet_rang<magnet_count($objet)){
228                        $ur_action = generer_action_auteur("magnetize",$objet."-".$id_objet."-"."down".$pile_arg,self());
229                        $boutons = bouton_action($balise_img(_DIR_PLUGIN_MAGNET."img/magnet-down-24.png","descendre"),$ur_action, $class ." magnet-down",'',_T('magnet:label_down')) . $boutons;
230                }
231        }
232        else {
233                $bclass .= "demagnetized";
234                $label = "<i></i><span>"._T('magnet:label_magnetize')."</span>";
235                $boutons = bouton_action($label,$ur_action,$bclass);
236        }
237
238        if ($pile){
239                $boutons = "<strong>"._T("magnets_pile:".strtolower($pile))."</strong> " . $boutons;
240        }
241
242        if (!$done){
243                $done = true;
244                $css_file = direction_css(find_in_path("css/magnet-admin.css"));
245                $css = spip_file_get_contents($css_file);
246                $css = urls_absolues_css($css,$css_file);
247                $boutons .= "<style>$css</style>";
248        }
249
250
251        return $boutons;
252}
253
254
255/**
256 * Ajouter un bouton pour magnetiser/demagnetiser un objet
257 * @param $flux
258 * @return mixed
259 */
260function magnet_formulaire_admin($flux){
261        if (
262                isset( $flux['args']['contexte']['objet'])
263                AND $objet = $flux['args']['contexte']['objet']
264                AND magnet_actif_sur_objet($objet)
265                AND $id_objet = intval($flux['args']['contexte']['id_objet'])
266                AND isset($GLOBALS['visiteur_session']['statut'])
267                AND $GLOBALS['visiteur_session']['statut']=='0minirezo'
268                AND include_spip('inc/autoriser')
269                AND autoriser('administrermagnet',$objet,$id_objet))
270        {
271                $boutons = magnet_html_boutons_admin($objet, $id_objet,"spip-admin-boutons admin-magnet admin-magnet-$objet") . " ";
272                $p = strpos($flux['data'],"<a");
273                $flux['data'] = substr_replace($flux['data'],$boutons,$p,0);
274        }
275        return $flux;
276}
277
278/**
279 * Nom de la meta qui stocke les id magnets d'un objet et d'une pile
280 * @param string $objet
281 * @param string $pile
282 *   nom de la pile ou sinon pile par defaut
283 * @return string
284 */
285function magnet_nom_meta_pile($objet, $pile = '') {
286        if (!function_exists('table_objet')) {
287                include_spip('base/objets');
288        }
289        $meta_magnet = "magnet_"
290                . ($pile ? $pile . "_" : "" )
291                . table_objet($objet);
292
293        return $meta_magnet;
294}
295
296/**
297 * Lister les ids magnetises d'un objet et d'une pile
298 * @param string $objet
299 * @param string $pile
300 * @param string $defaut
301 *   valeur par defaut de la meta si non definie ou zero
302 * @return array|string
303 */
304function magnet_liste_ids($objet, $pile, $defaut = '0') {
305        $meta_magnet = magnet_nom_meta_pile($objet, $pile);
306        // ne pas renvoyer une liste vide
307        $ids = $defaut;
308        if (isset($GLOBALS['meta'][$meta_magnet]) and $GLOBALS['meta'][$meta_magnet]) {
309                $ids = trim($GLOBALS['meta'][$meta_magnet]);
310        }
311        if (!strlen($ids)) {
312                return array();
313        }
314        $ids = explode(',', $ids);
315        $ids = array_map('trim', $ids);
316        $ids = array_map('intval', $ids);
317        return $ids;
318}
319
320/**
321 * Renvoie le rang de l'objet :
322 * 1 si arrive en tete de la boucle,
323 * 2 ensuite ....
324 * 0 si n'est pas magnetise
325 *
326 * @param string $objet
327 * @param int $id_objet
328 * @param string $pile
329 * @return bool|mixed
330 */
331function magnet_rang($objet, $id_objet, $pile=''){
332        $magnets = magnet_liste_ids($objet, $pile, '');
333        if (!in_array($id_objet, $magnets)) {
334                return false;
335        }
336        return array_search($id_objet,$magnets)+1;
337}
338
339/**
340 * Compter le nombre d'objet magnetises
341 * @param string $objet
342 * @param string $pile
343 * @return int
344 */
345function magnet_count($objet, $pile=''){
346        $magnets = magnet_liste_ids($objet, $pile, '');
347        return count($magnets);
348}
349
350function magnet_boite_infos($flux){
351        if (magnet_actif_sur_objet($flux['args']['type'])
352          AND $id = $flux['args']['id']){
353                $flux['data'] .= recuperer_fond('prive/squelettes/inclure/magnet-admin',array('id_objet'=>$id,'objet'=>$flux['args']['type']));
354        }
355        return $flux;
356}
Note: See TracBrowser for help on using the repository browser.