1 | <?php |
---|
2 | |
---|
3 | function 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 | |
---|
13 | function 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 | |
---|
37 | function 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 | |
---|
101 | function 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è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 | |
---|
126 | function 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 | ?> |
---|