Пример #1
0
/**
 * 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)");
	  
}
Пример #3
0
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);
	}
}