/** * Compile les critères {i,j} et {i/j} * * Le critère {i,j} limite l'affiche de la boucle en commançant l'itération * au i-ème élément, et pour j nombre d'éléments. * Le critère {n-i,j} limite en commençant au n moins i-ème élément de boucle * Le critère {i,n-j} limite en terminant au n moins j-ème élément de boucle. * * Le critère {i/j} affiche une part d'éléments de la boucle. * Commence à i*n/j élément et boucle n/j éléments. {2/4} affiche le second * quart des éléments d'une boucle. * * Traduit si possible (absence de n dans {i,j}) la demande en une * expression LIMIT du gestionnaire SQL * * @param string $idb Identifiant de la boucle * @param array $boucles AST du squelette * @param Critere $crit Paramètres du critère dans cette boucle * @return void **/ function calculer_critere_parties($idb, &$boucles, $crit) { $boucle =& $boucles[$idb]; $a1 = $crit->param[0]; $a2 = $crit->param[1]; $op = $crit->op; list($a11, $a12) = calculer_critere_parties_aux($idb, $boucles, $a1); list($a21, $a22) = calculer_critere_parties_aux($idb, $boucles, $a2); if ($op == ',' && (is_numeric($a11) && is_numeric($a21))) { $boucle->limit = $a11 . ',' . $a21; } else { // 3 dans {1/3}, {2,3} ou {1,n-3} $boucle->total_parties = $a21 != 'n' ? $a21 : $a22; // 2 dans {2/3}, {2,5}, {n-2,1} $partie = $a11 != 'n' ? $a11 : $a12; $mode = $op == '/' ? '/' : ($a11 == 'n' ? '-' : '+') . ($a21 == 'n' ? '-' : '+'); // cas simple {0,#ENV{truc}} compilons le en LIMIT : if ($a11 !== 'n' and $a21 !== 'n' and $mode == "++" and $op == ',') { $boucle->limit = (is_numeric($a11) ? "'{$a11}'" : $a11) . ".','." . (is_numeric($a21) ? "'{$a21}'" : $a21); } else { calculer_parties($boucles, $idb, $partie, $mode); } } }
/** * Calcul des critères {suivant} et {precedent} (avant l'existence d'Iterateurs). * On reprend en grande partie le fonctionnement de {pagination} avec debut_xx=@yy * en jouant de sql_seek pour se déplacer à la bonne position sur les résultats de * la boucle. * * @param string $type type de décalage : 'suivant' ou 'precedent' **/ function calculer_critere_suivant_precedent_dist($idb, &$boucles, $crit, $type) { $boucle = &$boucles[$idb]; $primary = $boucle->primary; $arg = kwote(calculer_argument_precedent($idb, $primary, $boucles)); $partie = "0;\n" ."\tif (\$id_actuel = $arg) {\n" ."\t\t".'$debut_boucle = quete_position_primary(\''.$primary.'\', $id_actuel, "'.$type.'", $result, '._q($boucle->sql_serveur).');'."\n" // pas de resultat, on cree une selection vide ."\t\t".'if ($debut_boucle === false){'."\n" ."\t\t\t".'@sql_free($result,'._q($boucle->sql_serveur).");\n" ."\t\t\t"."\$where[] = array('=','0','1');\n" // forcer 0 resultat ."\t\t\t".'$result = calculer_select($select, $from, $type, $where, $join, $groupby, $orderby, $limit, $having, $table, $id, $connect);'."\n" //."\t\t\t"."\$Numrows['$idb']['total'] = 0;\n" ."\t\t} else {\n" // si on a des resultats, il faut remettre le compteur a zero. ."\t\t".'if (!sql_seek($result,0,'._q($boucle->sql_serveur).")){\n" ."\t\t\t".'@sql_free($result,'._q($boucle->sql_serveur).");\n" ."\t\t\t".'$result = calculer_select($select, $from, $type, $where, $join, $groupby, $orderby, $limit, $having, $table, $id, $connect);'."\n" ."\t\t}\n" // donner un bon GRAND_TOTAL pour la fonction calculer_parties() // NAN ça marche pas non plus... mah que passa ? //."\t\t\t"."\$Numrows['$idb']['total'] = (\$Numrows['$idb']['total'] >= 1 ? 2 : 0);\n" ."\t\t}\n" ."\t}\n" ."\t".'$debut_boucle = intval($debut_boucle)'; $boucle->total_parties = 1; calculer_parties($boucles, $idb, $partie, '++'); // ajouter la cle primaire dans le select // sauf si pas de primaire, ou si primaire composee // dans ce cas, on ne sait pas gerer une pagination indirecte // : il faut id_xx dans le select pour la fonction quete_position_primary() $t = $boucle->id_table . '.' . $primary; if ($boucle->primary AND !preg_match('/[,\s]/',$primary) AND !in_array($t, $boucle->select)) { $boucle->select[]= $t; } // forcer le compilo à ne pas prendre en static a cause du $where fluctuant $boucle->where[]= array("'='","'1'","sql_quote(1)"); }
function calculer_critere_parties($idb, &$boucles, $crit) { $boucle = &$boucles[$idb]; $a1 = $crit->param[0]; $a2 = $crit->param[1]; $op = $crit->op; list($a11,$a12) = calculer_critere_parties_aux($idb, $boucles, $a1); list($a21,$a22) = calculer_critere_parties_aux($idb, $boucles, $a2); if (($op== ',')&&(is_numeric($a11) && (is_numeric($a21)))) $boucle->limit = $a11 .',' . $a21; else { $boucle->total_parties = ($a21 != 'n') ? $a21 : $a22; $partie = ($a11 != 'n') ? $a11 : $a12; $mode = (($op == '/') ? '/' : (($a11=='n') ? '-' : '+').(($a21=='n') ? '-' : '+')); calculer_parties($boucles, $idb, $partie, $mode); } }