source: spip-zone/_plugins_/nuage/frequence_fonctions.php @ 30253

Last change on this file since 30253 was 30253, checked in by gilles.vincent@…, 12 years ago

[30252] suite : split est deprecie en 5.3.0

File size: 4.8 KB
Line 
1<?php
2
3function boucle_MOTS($id_boucle, &$boucles) {
4        $boucle = &$boucles[$id_boucle];
5        $id_table = $boucle->id_table;
6        $boucle->from[$id_table] =  "spip_mots";
7
8        return $boucle->modificateur['frequence'] ?
9                calculer_boucle_avec_frequence($id_boucle, $boucles) :
10                calculer_boucle($id_boucle, $boucles);
11}
12
13function calculer_boucle_avec_frequence($id_boucle, &$boucles) {
14        //compatibilite 1.9.2 et SPIP SVN
15        $spip_abstract_fetch = function_exists('spip_abstract_fetch') ? 'spip_abstract_fetch' : 'sql_fetch';
16        $boucle = &$boucles[$id_boucle];
17        $id_table = $boucle->id_table;
18        $boucle->from[$id_table] =  "spip_mots";
19
20        //retenir max_frequence
21        $max = '$max_frequence'.$boucle->id_boucle;
22        $frequence = '$Pile[$SP][\'frequence'.$boucle->id_boucle.'\']';
23        $code_avant = "\n\t" . $max .' = 0;
24        $PileTemp = array();';
25        $code = "\n\t".'while ($Pile[$SP] = @'.$spip_abstract_fetch.'($result,"")) {' . "\n\t\t" .
26                $max.' = max('.$max.', '.$frequence.');' . "\n\t\t" .
27                '$PileTemp[] = $Pile[$SP];
28        }
29
30        while (list(,$Pile[$SP]) = each($PileTemp)) {';
31        $calcul = calculer_boucle($id_boucle, $boucles);
32        $calcul = preg_replace(',(\t\/\/ RESULTATS),', '$1'.$code_avant, $calcul);
33        $calcul = preg_replace(',(while([^{]*){),', $code, $calcul);
34        return $calcul;
35}
36
37function critere_frequence_dist($idb, &$boucles, $crit) {
38        global $table_des_tables;
39        $not = $crit->not;
40        $boucle = &$boucles[$idb];
41
42        if ($not)
43                erreur_squelette(_T('zbug_info_erreur_squelette'), $crit->op);
44
45        if (empty($boucle->jointures)) {
46                erreur_squelette(_T('zbug_info_erreur_squelette'), _L('frequence sur table sans jointures'));
47                return;
48        }
49
50        //analyser chaque criteres de frequence
51        $nom = $table_des_tables[$boucle->type_requete];
52        $parent = $boucles[$idb]->id_parent;
53        $criteres = array();
54        //Pour l'instant, un seul parametre
55        while(list(,$p) = each($crit->param)) {
56                $param = calculer_liste($p, array(), $boucles, $parent);
57                $type = preg_match(',^\(?\'(\w+)(\s*)?([!=<>]+)?(\s*)?,', $param, $regs) ? $regs[1] : $boucle->jointures[0];
58                $op = $regs[3] ? $regs[3] : '>=';
59                if($val = $regs[0] ? preg_replace(',' . preg_quote($regs[0]) . ',', '', $param) : 0) {
60                        $val = preg_replace(',\'$,', '', $val);
61                        $val = preg_replace(',^\'\s\.\s(.*)\)$,Um', '$1', $val);
62                        $val = $val ? $val : 0;
63                }
64                //Trouver une jointure n:n (cad table spip_mots_articles)
65                if(in_array($_type = $nom.'_'.$type, $boucle->jointures))
66                        $criteres[] = array($op, $_type, $val);
67                else {
68                        erreur_squelette(_T('zbug_info_erreur_squelette'), _L('frequence '.$type.': jointure inconnue'));
69                }
70        }
71        if(empty($criteres)) $criteres[0] = array('>=', $boucle->jointures[0], 0);
72       
73        //composer la requete pour la jointure
74        $primary = $boucle->primary;
75        $id_table = $boucle->id_table . '.' . $primary;
76        foreach($criteres as $critere) {
77                $frequence = $boucle->modificateur['frequence'] = "frequence".$idb;
78                list($op, $type, $val) = $critere;
79                //compatibilite SVN et 1.9.2
80                if(function_exists('trouver_def_table')) {
81                        $nom = $table_des_tables[$type];
82                        list($table, $desc) = trouver_def_table($nom ? $nom : $type, $boucle);
83                }
84                else {
85      $trouver_table = charger_fonction('trouver_table','base');
86      $desc=$trouver_table($type, $boucle->sql_serveur);
87      $table = $desc['table'];
88    }
89                /*Ajouter ici un test et produire une erreur si table non trouvee*/
90                $ids = $desc['key']['PRIMARY KEY'];
91                foreach(explode(',', $ids) as $_id)
92                        if(trim($_id) != $primary) $id = $_id;
93                $boucle->select[]= 'COUNT('.$frequence.'.'.$id.') AS '.$frequence;
94                $boucle->from[$frequence] = $table;
95                $boucle->where[] = array("'='", "'$id_table'", "'$frequence.$primary'");
96                $boucle->group[] = $id_table;
97                $boucle->having[] = array("'$op'", "'$frequence'", $val);               
98        }
99}
100
101function balise_FREQUENCE_dist($p) {
102        $b = $p->nom_boucle ? $p->nom_boucle : $p->descr['id_mere'];
103        // s'il n'y a pas de nom de boucle, on ne peut pas frequencer
104        if ($b === '') {
105                erreur_squelette(
106                        _T('zbug_champ_hors_boucle',
107                                array('champ' => '#FREQUENCE')
108                        ), $p->id_boucle);
109                $p->code = "''";
110                return $p;
111        }
112        // s'il n'y a pas de modificateur de frequence, c'est qu'on
113        // a oublie le critere {frequence}
114        if (!$p->boucles[$b]->modificateur['frequence']) {
115                erreur_squelette(
116                        _L('#FREQUENCE sans crit&egrave;re {frequence}'), $p->id_boucle);
117                $p->code = "''";
118                return $p;
119        }
120
121        //Un seul critere pour l'instant
122        $p->code = '$Pile[$SP][\''.$p->boucles[$b]->modificateur['frequence'].'\']';
123        return $p;
124}
125
126function balise_MAX_FREQUENCE_dist($p) {
127        $b = $p->nom_boucle ? $p->nom_boucle : $p->descr['id_mere'];
128        // s'il n'y a pas de nom de boucle, on ne peut pas frequencer
129        if ($b === '') {
130                erreur_squelette(
131                        _T('zbug_champ_hors_boucle',
132                                array('champ' => '#MAX_FREQUENCE')
133                        ), $p->id_boucle);
134                $p->code = "''";
135                return $p;
136        }
137
138        $p->code = '$max_frequence' . $p->id_boucle;
139        $p->interdire_scripts = false;
140        return $p;
141}
142
143?>
Note: See TracBrowser for help on using the repository browser.