source: spip-zone/_plugins_/spip-bonux-3/public/spip_bonux_criteres.php @ 65597

Last change on this file since 65597 was 65597, checked in by marcimat@…, 7 years ago

Correction de notice PHP : ligne inutile !

File size: 4.1 KB
Line 
1<?php
2/**
3 * Plugin Spip-Bonux
4 * Le plugin qui lave plus SPIP que SPIP
5 * (c) 2008 Mathieu Marcillaud, Cedric Morin, Romy Tetue
6 * Licence GPL
7 *
8 */
9
10if (!defined('_ECRIRE_INC_VERSION')) return;
11
12/**
13 * http://www.spip-contrib.net/Classer-les-articles-par-nombre-de#forum409210
14 * Permet de faire un comptage par table liee
15 * exemple
16 * <BOUCLE1(AUTEURS){compteur articles}{par compteur_articles}>
17 * #ID_AUTEUR : #COMPTEUR{articles}
18 * </BOUCLE1>
19 * pour avoir les auteurs classes par articles et le nombre d'article de chacun
20 *
21 * @param unknown_type $idb
22 * @param unknown_type $boucles
23 * @param unknown_type $crit
24 */
25function critere_compteur($idb, &$boucles, $crit, $left=false){
26        $boucle = &$boucles[$idb];
27
28        $_fusion = calculer_liste($crit->param[1], array(), $boucles, $boucle->id_parent);
29        $params = $crit->param;
30        $table = reset($params);
31        $table = $table[0]->texte;
32        $op = false;
33        if(preg_match(',^(\w+)([<>=])([0-9]+)$,',$table,$r)){
34                $table=$r[1];
35                if (count($r)>=3) $op=$r[2];
36                if (count($r)>=4) $op_val=$r[3];
37        }
38        $type = objet_type($table);
39        $type_id = id_table_objet($type);
40        $table_sql = table_objet_sql($type);
41       
42       
43        $trouver_table = charger_fonction('trouver_table','base');
44        $arrivee = array($table, $trouver_table($table, $boucle->sql_serveur));
45        $depart = array($boucle->id_table,$trouver_table($boucle->id_table, $boucle->sql_serveur));
46
47        // noter les jointures deja installees
48        $joins = array_keys($boucle->from);
49        if ($compt = calculer_jointure($boucle,$depart,$arrivee)){
50                if ($_fusion!="''"){
51                        // en cas de jointure, on ne veut pas du group_by sur la cle primaire !
52                        // cela casse le compteur !
53                        foreach($boucle->group as $k=>$group)
54                                if ($group == $boucle->id_table.'.'.$boucle->primary)
55                                        unset($boucle->group[$k]);
56                        $boucle->group[] = '".($gb='.$_fusion.')."';
57                }
58
59                $boucle->select[]= "COUNT($compt.$type_id) AS compteur_$table"; 
60                if ($op)
61                        $boucle->having[]= array("'".$op."'", "'compteur_".$table."'",$op_val);
62                if ($left){
63                        foreach($boucle->from as $k=>$val){
64                                if (!in_array($k, $joins)){
65                                        $boucle->from_type[$k] = 'left';
66                                }
67                        }
68                }
69        }
70}
71
72/**
73 * {compteur_left xxx} permet de faire la meme chose que {compteur xxx}
74 * mais avec un LEFT JOIN pour ne pas ignorer ceux qui ont un compteur nul
75 * @param <type> $idb
76 * @param <type> $boucles
77 * @param <type> $crit
78 */
79function critere_compteur_left($idb, &$boucles, $crit){
80        critere_compteur($idb, $boucles, $crit, true);
81}
82
83/**  Critere {somme champ} #SOMME{champ} */
84function critere_somme($idb, &$boucles, $crit){
85        calcul_critere_fonctions(array('SUM'=>'somme'), $idb, $boucles, $crit);
86}
87
88/**  Critere {compte champ} #COMPTE{champ} */
89function critere_compte($idb, &$boucles, $crit){
90        calcul_critere_fonctions(array('COUNT'=>'compte'), $idb, $boucles, $crit);
91}
92
93/**  Critere {moyenne champ} #MOYENNE{champ} */
94function critere_moyenne($idb, &$boucles, $crit){
95        calcul_critere_fonctions(array('AVG'=>'moyenne'), $idb, $boucles, $crit);
96}
97
98/**  Critere {minimum champ} #MINIMUM{champ} */
99function critere_minimum($idb, &$boucles, $crit){
100        calcul_critere_fonctions(array('MIN'=>'minimum'), $idb, $boucles, $crit);
101}
102
103/**  Critere {maximum champ} #MAXIMUM{champ} */
104function critere_maximum($idb, &$boucles, $crit){
105        calcul_critere_fonctions(array('MAX'=>'maximum'), $idb, $boucles, $crit);
106}
107
108/**  Critere {stats champ} calcul la totale : somme, compte, minimum, moyenne, maximum */
109function critere_stats($idb, &$boucles, $crit){
110        calcul_critere_fonctions(array(
111                'SUM'=>'somme',
112                'COUNT'=>'compte',
113                'AVG'=>'moyenne',
114                'MIN'=>'minimum',
115                'MAX'=>'maximum',
116        ), $idb, $boucles, $crit);
117}
118
119/* $func : array(FUNC => balise) */
120function calcul_critere_fonctions($func, $idb, &$boucles, $crit) {
121        $boucle = &$boucles[$idb];
122
123        $params = $crit->param;
124        $champ = reset($params);
125        $champ = $champ[0]->texte;
126
127        // option DISTINCT {compte DISTINCT(id_article) }
128        $filter="";
129        if (preg_match('/^([a-zA-Z]+)\(\s*([a-zA-Z_]+)\s*\)$/', trim($champ), $r)) {
130                $filter = $r[1]; // DISTINCT
131                $champ = $r[2]; // id_article
132        }
133       
134        $sel = $filter ? "$filter($champ)" : $champ;
135        foreach ($func as $f => $as) {
136                $boucle->select[]= "$f($sel) AS $as" . "_$champ";
137        }
138}
139
140
141?>
Note: See TracBrowser for help on using the repository browser.