source: spip-zone/_squelettes_/aveline/aveline_fonctions.php @ 47860

Last change on this file since 47860 was 46150, checked in by joseph@…, 10 years ago

Pouvoir filtrer les évènements par article.

File size: 23.0 KB
Line 
1<?php
2
3// Filtre pour afficher les statistiques d'un mot-clé
4// Code inspiré de la fonction presenter_groupe_mots_boucle dans ecrire/inc/grouper_mots.php
5
6function filtre_statistiques_mot_dist($id_mot){
7        include_spip('base/abstract_sql');
8        $texte_lie = array();
9        $id_mot = intval($id_mot);
10       
11        $na = sql_countsel('spip_mots_articles',"id_mot=$id_mot");
12        if ($na == 1)
13                $texte_lie[] = _T('info_1_article');
14        else if ($na > 1)
15                $texte_lie[] = $na." "._T('info_articles_02');
16
17        $nb = sql_countsel('spip_mots_breves',"id_mot=$id_mot");
18        if ($nb == 1)
19                $texte_lie[] = _T('info_1_breve');
20        else if ($nb > 1)
21                $texte_lie[] = $nb." "._T('info_breves_03');
22
23        $ns = sql_countsel('spip_mots_syndic',"id_mot=$id_mot");
24        if ($ns == 1)
25                $texte_lie[] = _T('info_1_site');
26        else if ($ns > 1)
27                $texte_lie[] = $ns." "._T('info_sites');
28
29        $nr = sql_countsel('spip_mots_rubriques',"id_mot=$id_mot");
30        if ($nr == 1)
31                $texte_lie[] = _T('info_une_rubrique_02');
32        else if ($nr > 1)
33                $texte_lie[] = $nr." "._T('info_rubriques_02');
34
35        $texte_lie = pipeline('afficher_nombre_objets_associes_a',array('args'=>array('objet'=>'mot','id_objet'=>$id_mot),'data'=>$texte_lie));
36        $texte_lie = join($texte_lie,", ");
37        return $texte_lie;
38}
39
40// Critère compteur_publie
41// Provient de http://www.spip-contrib.net/Classer-les-articles-par-nombre-de-commentaires
42
43function critere_compteur_publie($idb, &$boucles, $crit){
44 $op='';
45 $boucle = &$boucles[$idb];
46 $params = $crit->param;
47 $type = array_shift($params);
48 $type = $type[0]->texte;
49 if(preg_match(',^(\w+)([<>=])([0-9]+)$,',$type,$r)){
50     $type=$r[1];
51     $op=$r[2];
52     $op_val=$r[3];
53 }
54 $type_id = 'compt.id_'.$type;
55 $type_requete = $boucle->type_requete;
56 $id_table = $boucle->id_table . '.' . $boucle->primary;
57 $boucle->select[]= 'COUNT('.$type_id.') AS compteur_'.$type;
58 $boucle->from['compt']="spip_".$type;
59 $boucle->from_type['compt']= "LEFT";
60 // On passe par cette jointure pour que les articles avec 0 commentaires soient comptés
61 // Merci notation !
62 $boucle->join["compt"]= array("'$boucle->id_table'","'$boucle->primary'","'$boucle->primary'","'compt.statut='.sql_quote('publie')");
63 $boucle->group[]=$id_table;
64 if ($op)
65     $boucle->having[]= array("'".$op."'", "'compteur_".$type."'",$op_val);
66} 
67
68// On préfixe avec AVELINE pour éviter conflit avec d'autres plugins
69// comme afficher_objet qui définit sont propre #COMPTEUR_ARTICLES
70
71function balise_AVELINE_COMPTEUR_FORUM_dist($p) {
72        $p->code = '$Pile[$SP][\'compteur_forum\']';
73        $p->interdire_scripts = false;
74        return $p;
75}
76
77function balise_AVELINE_COMPTEUR_ARTICLES_dist($p) {
78        $p->code = '$Pile[$SP][\'compteur_articles\']';
79        $p->interdire_scripts = false;
80        return $p;
81}
82
83// Critère archives pour afficher uniquement les objets d'une date donnée, par exemple en passant à l'URL ?archives=2010-02
84// Repris du plugin minical
85// Adapté pour gérer les évènements en cours
86function critere_archives($idb, &$boucles, $crit, $var_date = 'archives') {
87        $boucle = &$boucles[$idb];
88        if ($boucle->id_table == 'evenements') {
89                $boucle->where[] =
90                array("'AND'",
91                        array("'<='", "'date_debut'", "sql_quote(archives_debut(\$Pile[0]['".$var_date."']))"),
92                        array("'>='", "'date_fin'", "sql_quote(archives_fin(\$Pile[0]['".$var_date."']))"),
93                );
94        } else {
95                $champ_date = "'" . $boucle->id_table ."." .$GLOBALS['table_date'][$boucle->type_requete] . "'";
96                $boucle->where[] = array(
97                        'REGEXP',
98                        $champ_date, 
99                        "sql_quote(('^' . interdire_scripts(entites_html(\$Pile[0]['".$var_date."']))))"
100                );
101        }
102}
103
104// Tester si le critère archives est de la forme AAAA, AAAA-MM ou AAAA-MM-JJ
105function archives_debut($date) {
106        if (!$date or $date=='tout')
107                return '2038-01-19 23:59:59';
108        switch (count(explode('-',$date))) {
109                case 1:
110                        return date('Y-12-31 23:59:59', strtotime($date));
111                        break;
112                case 2:
113                        return date('Y-m-31 23:59:59', strtotime($date));
114                        break;
115                case 3:
116                        return date('Y-m-d 23:59:59', strtotime($date));
117                        break;
118        }
119}
120function archives_fin($date) {
121        if (!$date or $date=='tout')
122                return '1970-01-01 00:00:00';
123        switch (count(explode('-',$date))) {
124                case 1:
125                        return date('Y-01-01 00:00:00', strtotime($date));
126                        break;
127                case 2:
128                        return date('Y-m-01 00:00:00', strtotime($date));
129                        break;
130                case 3:
131                        return date('Y-m-d 00:00:00', strtotime($date));
132                        break;
133        }
134}
135
136// Balise #ME
137// Source : http://www.spip-contrib.net/me-Moi-and-myself
138
139/***
140 * (c)James 2006, Licence GNU/GPL
141 * |me compare un id_auteur, par exemple,
142 * d'une boucle FORUMS avec les auteurs d'un article
143 * et renvoie la valeur booleenne true (vrai) si on trouve
144 *  une correspondance
145 * utilisation:
146 * <div id="forum#ID_FORUM"[(#ID_ARTICLE|me{#ID_AUTEUR}|?{' ', ''})class="me"]>
147 ***/
148function me($id_article, $id_auteur, $sioui = true, $sinon = false) {
149        static $deja = false;
150        static $auteurs = array();
151        if(!$deja) {
152                $r = spip_query("SELECT id_auteur
153                        FROM spip_auteurs_articles
154                        WHERE id_article=$id_article");
155                while($row = spip_fetch_array($r))
156                        $auteurs[] = intval($row['id_auteur']);
157                $deja = true;
158        }
159        return in_array($id_auteur, $auteurs)?$sioui:$sinon;
160}
161
162function balise_ME($p){
163        $p->code = "me(".
164                champ_sql('id_article', $p).', '.
165                champ_sql('id_auteur', $p).', '.
166                "'me', '')";
167        return $p;
168}
169
170// #AVELINE_PAGINATION
171// S'appelle dans une noisette ainsi [<p class="pagination">(#AVELINE_PAGINATION{'debut'})</p>] ou [<p class="pagination">(#AVELINE_PAGINATION{'fin'})</p>]
172// Le YAML de la noisette doit contenir - 'inclure:inc-yaml/pagination.yaml'
173
174function balise_AVELINE_PAGINATION_dist($p) {
175        $b = $p->nom_boucle ? $p->nom_boucle : $p->descr['id_mere'];
176
177        $pos = interprete_argument_balise(1,$p);
178       
179        $connect = $p->boucles[$b]->sql_serveur;
180        $pas = $p->boucles[$b]->total_parties;
181        $f_pagination = chercher_filtre('pagination');
182        $type = $p->boucles[$b]->modificateur['debut_nom'];
183        $modif = ($type[0]!=="'") ? "'debut'.$type"
184          : ("'debut" .substr($type,1));
185       
186        if ($pos=="'debut'")
187                $p->code = "(\$Pile[0]['selection']=='pagination' && (\$Pile[0]['position_pagination']=='debut' || \$Pile[0]['position_pagination']=='deux')) ? ".sprintf(CODE_PAGINATION, $f_pagination,$b, $type, $modif, $pas, true, "\$Pile[0]['style_pagination']", _q($connect), '')." : ''";
188        else
189                $p->code = "(\$Pile[0]['selection']=='pagination' && (\$Pile[0]['position_pagination']=='fin' || \$Pile[0]['position_pagination']=='deux')) ? ".sprintf(CODE_PAGINATION, $f_pagination,$b, $type, $modif, $pas, true, "\$Pile[0]['style_pagination']", _q($connect), '')." : ''";
190        return $p;
191}
192
193// Critère aveline_pagination
194// Le YAML de la noisette doit contenir - 'inclure:inc-yaml/pagination.yaml'
195// Ajouter {aveline_pagination} à la boucle
196
197function critere_aveline_pagination_dist($idb, &$boucles, $crit) {
198        $boucle = &$boucles[$idb];
199        // definition de la taille de la page
200        $pas = "((\$Pile[0]['selection']=='pagination') ? \$Pile[0]['pas_pagination'] : ((\$Pile[0]['selection']=='limite') ? \$Pile[0]['limite'] : 1000000))";
201       
202        $type = !isset($crit->param[0][1]) ? "'$idb'" : calculer_liste(array($crit->param[0][1]), array(), $boucles, $boucle->id_parent);
203        $debut = ($type[0]!=="'") ? "'debut'.$type" 
204          : ("'debut" .substr($type,1));
205
206        $boucle->modificateur['debut_nom'] = $type;
207        $partie =
208                 // tester si le numero de page demande est de la forme '@yyy'
209                 'isset($Pile[0]['.$debut.']) ? $Pile[0]['.$debut.'] : _request('.$debut.");\n"
210                ."\tif(substr(\$debut_boucle,0,1)=='@'){\n"
211                ."\t\t".'$debut_boucle = $Pile[0]['. $debut.'] = quete_debut_pagination(\''.$boucle->primary.'\',$Pile[0][\'@'.$boucle->primary.'\'] = substr($debut_boucle,1),'.$pas.',$result,'._q($boucle->sql_serveur).');'."\n"
212                ."\t\t".'if (!sql_seek($result,0,'._q($boucle->sql_serveur).")){\n"
213                ."\t\t\t".'@sql_free($result,'._q($boucle->sql_serveur).");\n"
214                ."\t\t\t".'$result = calculer_select($select, $from, $type, $where, $join, $groupby, $orderby, $limit, $having, $table, $id, $connect);'."\n"
215                ."\t\t}\n"
216                ."\t}\n"
217                ."\t".'$debut_boucle = intval($debut_boucle)';
218
219
220        $boucle->total_parties = $pas;
221        calculer_parties($boucles, $idb, $partie, 'p+');
222        // ajouter la cle primaire dans le select pour pouvoir gerer la pagination referencee par @id
223        // sauf si pas de primaire, ou si primaire composee
224        // dans ce cas, on ne sait pas gerer une pagination indirecte
225        $t = $boucle->id_table . '.' . $boucle->primary;
226        if ($boucle->primary
227                AND !preg_match('/[,\s]/',$boucle->primary)
228                AND !in_array($t, $boucle->select))
229          $boucle->select[]= $t;
230}
231
232// Si le plugin notation n'est pas actif, on définit un critère {notation} ne faisant rien
233// pour ne pas avoir d'erreur avec les boucles appelant ce critère
234// on définit également moyenne (égal alors à id)
235if (!defined('_DIR_PLUGIN_NOTATION')) {
236        function critere_notation_dist($idb, &$boucles, $crit){
237                $boucle = &$boucles[$idb];
238                $table = $boucle->id_table;
239                $id = $boucle->primary;
240                $boucle->select[]= "$table.$id AS moyenne";
241        }
242}
243
244
245// #AVELINE_CHOIX_TRI
246// Le YAML de la noisette doit contenir - 'inclure:inc-yaml/choix_tri-objet.yaml'
247// Appel : #AVELINE_CHOIX_TRI{'objet','debut_ou_fin'}
248// S'utilise en conjonction avec le critère tri de Bonux
249// Les possibilités de tri pour chaque objet sont définis directement dans le code de la balise
250// pour récupérer les variables d'environnement adéquates.
251
252function balise_AVELINE_CHOIX_TRI_dist($p) {
253        $b = $p->nom_boucle ? $p->nom_boucle : $p->descr['id_mere'];
254
255        // s'il n'y a pas de nom de boucle, on ne peut pas trier
256        if ($b === '') {
257                erreur_squelette(
258                        _T('zbug_champ_hors_boucle',
259                                array('champ' => '#TRI')
260                        ), $p->id_boucle);
261                $p->code = "''";
262                return $p;
263        }
264        $boucle = $p->boucles[$b];
265
266        // s'il n'y a pas de tri_champ, c'est qu'on se trouve
267        // dans un boucle recursive ou qu'on a oublie le critere {tri}
268        if (!isset($boucle->modificateur['tri_champ'])) {
269                erreur_squelette(
270                        _T('zbug_tri_sans_critere',
271                                array('champ' => '#TRI')
272                        ), $p->id_boucle);
273                $p->code = "''";
274                return $p;
275        }
276
277        $suffixe = $boucle->modificateur['tri_nom'];
278        $objet = interprete_argument_balise(1,$p);
279        $pos = interprete_argument_balise(2,$p);
280        $tri_actuel = $boucle->modificateur['tri_champ'];
281        $sens_actuel = $boucle->modificateur['tri_sens'];
282       
283        // Définir les choix possibles
284        $choix = "array()";
285        if ($objet == "'article'")
286                $choix = "array(
287                        array('affiche' => \$Pile['0']['choix_tri_titre'], 'tri' => 'titre', 'sens' => 1, 'libelle' => _T('avelinepublic:par_titre')),
288                        array('affiche' => \$Pile['0']['choix_tri_rang'], 'tri' => 'num titre', 'sens' => 1, 'libelle' => _T('avelinepublic:par_rang')),
289                        array('affiche' => \$Pile['0']['choix_tri_popularite'], 'tri' => 'popularite', 'sens' => -1, 'libelle' => _T('avelinepublic:les_plus_populaires')),
290                        array('affiche' => \$Pile['0']['choix_tri_date'], 'tri' => 'date', 'sens' => -1, 'libelle' => _T('avelinepublic:les_plus_recents')),
291                        array('affiche' => \$Pile['0']['choix_tri_anciens'], 'tri' => 'date', 'sens' => 1, 'libelle' => _T('avelinepublic:les_plus_anciens')),
292                        array('affiche' => \$Pile['0']['choix_tri_date_modif'], 'tri' => 'date_modif', 'sens' => -1, 'libelle' => _T('avelinepublic:modifies_recemment')),
293                        array('affiche' => \$Pile['0']['choix_tri_commentes'], 'tri' => 'compteur_forum', 'sens' => -1, 'libelle' => _T('avelinepublic:les_plus_commentes')),
294                        array('affiche' => \$Pile['0']['choix_tri_visistes'], 'tri' => 'visites', 'sens' => -1, 'libelle' => _T('avelinepublic:les_plus_visites')),
295                        array('affiche' => \$Pile['0']['choix_tri_note'], 'tri' => 'moyenne', 'sens' => -1, 'libelle' => _T('avelinepublic:les_mieux_notes')),
296                        array('affiche' => \$Pile['0']['recherche'], 'tri' => 'points', 'sens' => -1, 'libelle' => _T('avelinepublic:les_plus_pertinents'))
297                )";
298        if ($objet == "'breve'")
299                $choix = "array(
300                        array('affiche' => \$Pile['0']['choix_tri_titre'], 'tri' => 'titre', 'sens' => 1, 'libelle' => _T('avelinepublic:par_titre')),
301                        array('affiche' => \$Pile['0']['choix_tri_rang'], 'tri' => 'num titre', 'sens' => 1, 'libelle' => _T('avelinepublic:par_rang')),
302                        array('affiche' => \$Pile['0']['choix_tri_date'], 'tri' => 'date_heure', 'sens' => -1, 'libelle' => _T('avelinepublic:b_les_plus_recentes')),
303                        array('affiche' => \$Pile['0']['choix_tri_anciens'], 'tri' => 'date_heure', 'sens' => 1, 'libelle' => _T('avelinepublic:b_les_plus_anciennes')),
304                        array('affiche' => \$Pile['0']['choix_tri_commentes'], 'tri' => 'compteur_forum', 'sens' => -1, 'libelle' => _T('avelinepublic:b_les_plus_commentees')),
305                        array('affiche' => \$Pile['0']['recherche'], 'tri' => 'points', 'sens' => -1, 'libelle' => _T('avelinepublic:b_les_plus_pertinents'))
306                )";
307        if ($objet == "'auteur'")
308                $choix = "array(
309                        array('affiche' => \$Pile['0']['choix_tri_nom'], 'tri' => 'nom', 'sens' => 1, 'libelle' => _T('avelinepublic:par_nom')),
310                        array('affiche' => \$Pile['0']['choix_tri_nb_articles'], 'tri' => 'compteur_articles', 'sens' => -1, 'libelle' => _T('avelinepublic:par_nb_articles')),
311                        array('affiche' => \$Pile['0']['recherche'], 'tri' => 'points', 'sens' => -1, 'libelle' => _T('avelinepublic:les_plus_pertinentes'))
312                )";
313        if ($objet == "'rubrique'")
314                $choix = "array(
315                        array('affiche' => \$Pile['0']['choix_tri_titre'], 'tri' => 'titre', 'sens' => 1, 'libelle' => _T('avelinepublic:par_titre')),
316                        array('affiche' => \$Pile['0']['choix_tri_commentes'], 'tri' => 'compteur_forum', 'sens' => -1, 'libelle' => _T('avelinepublic:les_plus_commentes')),
317                        array('affiche' => \$Pile['0']['choix_tri_date_heure'], 'tri' => 'date_heure', 'sens' => -1, 'libelle' => _T('avelinepublic:modifiees_recemment')),
318                        array('affiche' => \$Pile['0']['choix_tri_note'], 'tri' => 'moyenne', 'sens' => -1, 'libelle' => _T('avelinepublic:les_mieux_notes')),
319                        array('affiche' => \$Pile['0']['recherche'], 'tri' => 'points', 'sens' => -1, 'libelle' => _T('avelinepublic:les_plus_pertinents'))
320                )";
321        if ($objet == "'evenement'")
322                $choix = "array(
323                        array('affiche' => \$Pile['0']['choix_tri_date'], 'tri' => 'date_debut', 'sens' => -1, 'libelle' => _T('avelinepublic:par_date_decroissante')),
324                        array('affiche' => \$Pile['0']['choix_tri_anciens'], 'tri' => 'date_debut', 'sens' => 1, 'libelle' => _T('avelinepublic:par_date_croissante')),
325                        array('affiche' => \$Pile['0']['choix_tri_titre'], 'tri' => 'titre', 'sens' => 1, 'libelle' => _T('avelinepublic:par_titre')),
326                        array('affiche' => \$Pile['0']['recherche'], 'tri' => 'points', 'sens' => -1, 'libelle' => _T('avelinepublic:les_plus_pertinents'))
327                )";
328       
329        $p->code = "calculer_balise_AVELINE_CHOIX_TRI($suffixe,$choix,$pos,$tri_actuel,$sens_actuel,\$Pile[0]['choix_tri'],\$Pile[0]['position_choix_tri'])";
330        return $p;
331}
332
333function calculer_balise_AVELINE_CHOIX_TRI($suffixe,$choix,$pos,$tri_actuel,$sens_actuel,$choix_tri,$position_choix_tri) {
334        // Doit-on afficher les tri perso ?
335        if (!$choix_tri || ($pos == 'debut' && $position_choix_tri == 'fin') || ($pos == 'fin' && $position_choix_tri == 'debut'))
336                return '';
337       
338        $retour = array();
339        foreach($choix as $c) {
340                // Cas où on demande la note moyenne et que notation n'est pas activé
341                if ($c['tri'] == 'moyenne' && !defined('_DIR_PLUGIN_NOTATION'))
342                        $c['affiche'] = '';
343                if ($c['affiche']) {
344                        $lien = parametre_url(self(),'tri'.$suffixe,$c['tri']);
345                        $lien = parametre_url($lien,'sens'.$suffixe,$c['sens']);
346                        $retour[] = lien_ou_expose($lien,$c['libelle'],$c['tri']==$tri_actuel && $c['sens']==$sens_actuel);
347                }
348        }
349        return implode(' <span class="sep separateur">|</span> ',$retour);
350}
351
352// Critère aveline_branche
353// Le YAML de la noisette doit contenir - 'inclure:inc-yaml/branche-objet.yaml'
354// Ajouter {aveline_branche} à la boucle
355function critere_aveline_branche_dist($idb, &$boucles, $crit) {
356        $boucle = &$boucles[$idb];
357       
358        $id_article = calculer_argument_precedent($idb, 'id_article', $boucles);
359        $id_syndic = calculer_argument_precedent($idb, 'id_syndic', $boucles);
360        $id_rubrique = calculer_argument_precedent($idb, 'id_rubrique', $boucles);
361        $id_secteur = calculer_argument_precedent($idb, 'id_secteur', $boucles);
362
363        //Trouver une jointure
364        $desc = $boucle->show;
365        //Seulement si necessaire
366        if (!array_key_exists('id_rubrique', $desc['field'])) {
367                $cle_rubrique = trouver_jointure_champ('id_rubrique', $boucle);
368        } else $cle_rubrique = $boucle->id_table;
369       
370        $table = $boucle->id_table;
371       
372        $boucle->where[] = "aveline_calcul_branche($id_article,$id_syndic,$id_rubrique, $id_secteur, $cle_rubrique, $table, \$Pile[0]['branche'], \$Pile[0]['rubrique_specifique'], \$Pile[0]['branche_specifique'], \$Pile[0]['secteur_specifique'], \$Pile[0]['site_specifique'], \$Pile[0]['filtre_rub'], \$Pile[0]['filtre_art'])";
373       
374}
375
376function aveline_calcul_branche($id_article,$id_syndic,$id_rubrique,$id_secteur,$cle_rubrique,$table, $branche,$rubrique_specifique,$branche_specifique,$secteur_specifique, $site_specifique, $filtre_rub, $filtre_art) {
377        if ($filtre_rub) {
378                $branche = 'branche_specifique';
379                $branche_specifique = 'rubrique|'.$filtre_rub;
380        }
381        if ($filtre_art) {
382                $branche = 'article_specifique';
383                $article_specifique = 'article|'.$filtre_art;
384        }
385        switch ($table) {
386                case 'articles':
387                        $cle_secteur = $table;
388                        $champ_secteur = 'id_secteur';
389                        break;
390                case 'breves':
391                        $cle_secteur = $table;
392                        $champ_secteur = 'id_rubrique';
393        }
394        switch ($branche) {
395                case 'meme_article':
396                        return $id_article ? array('=',"$table.id_article",$id_article) : array ();
397                        break;
398                case 'article_specifique':
399                        return $article_specifique ? sql_in("$table.id_article",picker_selected($article_specifique,'article')) : array();
400                        break;
401                case 'meme_site':
402                        return $id_syndic ? array('=',"$table.id_syndic",$id_syndic) : array ();
403                        break;
404                case 'site_specifique':
405                        return $site_specifique ? sql_in("$table.id_syndic",$site_specifique) : array();
406                        break;
407                case 'meme_rubrique':
408                        return $id_rubrique ? array('=',"$cle_rubrique.id_rubrique",$id_rubrique) : array ();
409                        break;
410                case 'rubrique_specifique':
411                        return $rubrique_specifique ? sql_in("$cle_rubrique.id_rubrique",picker_selected($rubrique_specifique,'rubrique')) : array();
412                        break;
413                case 'branche_actuelle':
414                        return $id_rubrique ? sql_in("$cle_rubrique.id_rubrique",calcul_branche_in($id_rubrique)) : array();
415                        break;
416                case 'branche_specifique':
417                        return $branche_specifique ? sql_in("$cle_rubrique.id_rubrique",calcul_branche_in(picker_selected($branche_specifique,'rubrique'))) : array();
418                        break;
419                case 'meme_secteur':
420                        return $id_secteur ? array('=',"$cle_secteur.$champ_secteur",$id_secteur) : array();
421                        break;
422                case 'secteur_specifique':
423                        return $secteur_specifique ? sql_in("$cle_secteur.$champ_secteur",$secteur_specifique) : array();
424                        break;
425                default:
426                        return array();
427        }
428}
429
430// Critère aveline_lang
431// Le YAML de la noisette doit contenir - 'inclure:inc-yaml/restreindre_langue.yaml''
432// Ajouter {aveline_lang} à la boucle
433// N'appliquer qu'à des tables ayant un champ 'lang'
434function critere_aveline_lang_dist($idb, &$boucles, $crit) {
435        $boucle = &$boucles[$idb];
436        $id_table = $boucle->id_table;
437        $boucle->where[] = "aveline_calcul_lang($id_table,\$Pile[0]['restreindre_langue'],\$Pile[0]['lang'])";
438}
439
440function aveline_calcul_lang($id_table,$restreindre_langue,$lang) {
441        if ($restreindre_langue)
442                return array('=',"$id_table.lang",sql_quote($lang));
443        else
444                return array();
445}
446
447
448// Critère aveline_exclure_objet_encours
449// Le YAML de la noisette doit contenir - 'inclure:inc-yaml/exclure_objet_en_cours-objet.yaml''
450// Ajouter {aveline_exclure_objet_encours} à la boucle
451function critere_aveline_exclure_objet_encours_dist($idb, &$boucles, $crit) {
452        $boucle = &$boucles[$idb];
453        $id_table = $boucle->id_table;
454        $id_objet = $boucle->primary;
455       
456        $boucle->where[] = "aveline_calcul_exclure_objet($id_table,$id_objet,\$Pile[0][$id_objet],\$Pile[0]['exclure_objet_en_cours'])";
457}
458
459function aveline_calcul_exclure_objet($id_table,$id_objet,$id_en_cours,$exclure_objet_en_cours) {
460        if ($exclure_objet_en_cours)
461                return array('!=',"$id_table.$id_objet",intval($id_en_cours));
462        else
463                return array();
464}
465
466// Critère aveline_selecteurs_archives_mois et aveline_selecteurs_archives_annees
467// Utilisée pour les sélecteurs d'archives
468// Balise disponible #NB_ARCHIVES
469function critere_aveline_selecteur_archives_mois_dist($idb, &$boucles, $crit) {
470        $boucle = &$boucles[$idb];
471        $champ_date = $boucle->id_table ."." . $GLOBALS['table_date'][$boucle->type_requete];
472        $id_objet = $boucle->id_table ."." . $boucle->primary;
473        $boucle->select[] = "COUNT($id_objet) AS nb_archives";
474        $boucle->group[] = "YEAR($champ_date)";
475        $boucle->group[] = "MONTH($champ_date)";
476}
477
478function critere_aveline_selecteur_archives_annee_dist($idb, &$boucles, $crit) {
479        $boucle = &$boucles[$idb];
480        $champ_date = $boucle->id_table ."." . $GLOBALS['table_date'][$boucle->type_requete];
481        $id_objet = $boucle->id_table ."." . $boucle->primary;
482        $boucle->select[] = "COUNT($id_objet) AS nb_archives";
483        $boucle->group[] = "YEAR($champ_date)";
484}
485
486/** Balise #NB_ARCHIVES associee aux criteres aveline_selecteur_archives_mois et aveline_selecteur_archives_annees */
487function balise_NB_ARCHIVES_dist($p) {
488        $p->code = '$Pile[$SP][\'nb_archives\']';
489        $p->interdire_scripts = false;
490        return $p;
491}
492
493/**
494 * Calculer l'initiale d'un nom ou d'un titre
495 *
496 * @param <type> $nom
497 * @return <type>
498 */
499function aveline_initiale($nom){
500        return spip_substr(trim(strtoupper($nom)),0,1);
501}
502
503
504/**
505 * Afficher l'initiale pour la navigation par lettres
506 * adptée du plugin afficher_objets
507 *
508 * @staticvar string $memo
509 * @param <type> $url
510 * @param <type> $initiale
511 * @param <type> $compteur
512 * @param <type> $debut
513 * @param <type> $pas
514 * @return <type>
515 */
516function aveline_afficher_initiale($url,$initiale,$compteur,$debut,$pas){
517        static $memo = null;
518        $res = '';
519        if (!$memo 
520                OR (!$initiale AND !$url)
521                OR ($initiale!==$memo['initiale'])
522                ){
523                $newcompt = intval(floor(($compteur-1)/$pas)*$pas);
524                if ($memo){
525                        $on = (($memo['compteur']<=$debut)
526                                AND (
527                                                $newcompt>$debut OR ($newcompt==$debut AND $newcompt==$memo['compteur'])
528                                                ));
529                        $res = lien_ou_expose($memo['url'],$memo['initiale'],$on,'lien_pagination');
530                }
531                if ($initiale)
532                        $memo = array('initiale'=>$initiale,'url'=>$url,'compteur'=>$newcompt);
533        }
534        return $res;
535}
536
537// Personnalisation pour Aveline
538// pour diriger au choix vers le lien de l'évènement ou vers la page Agenda
539
540function aveline_agenda_mini($i) {
541        $args = func_get_args();
542        $une_date = array_shift($args); // une date comme balise
543        $sinon = array_shift($args);
544        if (!$une_date) return $sinon;
545        $type = 'mini';
546        $agenda = Agenda_memo_full(0);
547        $evt = array();
548        foreach (($args ? $args : array_keys($agenda)) as $k) {
549                if (is_array($agenda[$k]))
550                        foreach($agenda[$k] as $d => $v) { 
551                                if (count($v)>1)
552                                        foreach ($v as $cle => $ligne)
553                                                $v[0]['URL'] = generer_url_public('agenda','archives='.substr($d,0,4).'-'.substr($d,4,2).'-'.substr($d,6,2));
554                                $evt[$d] = $evt[$d] ? (array_merge($evt[$d], $v)) : $v;
555                        }
556        }
557        $la_date = mktime(0, 0, 0, mois($une_date), 1, annee($une_date));
558        include_spip('inc/agenda');
559        return http_calendrier_init($la_date, $type, '', '', '', array('', $evt));
560}
561
562?>
Note: See TracBrowser for help on using the repository browser.