Bifurcation depuis
spip / spip
20682 validations de retard le dépôt en amont.
inc-arg-squel.php3 10,79 Kio
<?php
// traduction des arguments d'une boucle par affectation du tableau $boucles
function calculer_params($type, $params, $idb, &$boucles)
{
global $tables_relations, $table_primary, $table_des_tables, $table_date;
$boucle = &$boucles[$idb];
$id_table = $table_des_tables[$type];
$id_field = $id_table . "." . $table_primary[$type];
if (is_array($params)) {
reset($params);
while (list(, $param) = each($params)) {
if ($param == 'exclus') {
$boucle->where[] = "$id_field!='\"." .
index_pile($boucles[$idb]->id_parent, $table_primary[$type], $boucles) .
".\"'"; }
else if ($param == 'unique' OR $param == 'doublons') {
$boucle->doublons = true;
$boucle->where[] = "$id_field NOT IN (\" . \$doublons['$type'] . \")";
}
else if (ereg('^(!)? *lang_select(=(oui|non))?$', $param, $match)) {
if (!$lang_select = $match[3]) $lang_select = 'oui';
if ($match[1]) $lang_select = ($lang_select=='oui')?'non':'oui';
$boucles[$idb]->lang_select = $lang_select;
}
else if (ereg('^([0-9]+)/([0-9]+)$', $param, $match)) {
$boucle->partie = $match[1];
$boucle->total_parties = $match[2];
$boucle->mode_partie = '/';
}
else if (ereg('^(([0-9]+)|n)(-([0-9]+))?,(([0-9]+)|n)(-([0-9]+))?$',
$param, $match)) {
if (($match[2]!='') && ($match[6]!=''))
$boucle->limit = $match[2].','.$match[6];
else
{
$boucle->partie =
($match[1] != 'n') ? $match[1] : ($match[4] ? $match[4] : 0);
$boucle->total_parties =
($match[5] != 'n') ? $match[5] : ($match[8] ? $match[8] : 0);
$boucle->mode_partie = ($match[1] == 'n') ? '-' : '+';
}
}
else if (ereg('^debut([-_a-zA-Z0-9]+),([0-9]*)$', $param, $match)) {
$debut_lim = "debut".$match[1];
$boucle->limit = '".intval($GLOBALS[\'HTTP_GET_VARS\'][\''.$debut_lim.'\']).",'.$match[2];
}
else if ($param == 'recherche') {
$boucle->from[] = "index_$id_table AS rec";
$boucle->select[] = "SUM(rec.points + 100*(rec.hash IN (\$hash_recherche_strict))) AS points";
$boucle->where[] = "rec.". $table_primary[$type] . "=$id_field";
$boucle->group = "'$id_field'";
$boucle->where[] = "rec.hash IN (\$hash_recherche)";
$boucles[$idb]->hash = true;
}
// Classement par ordre inverse
else if ($param == 'inverse') {
if ($boucle->order != "''")
$boucle->order .= ". ' DESC'";
else
{
include_local("inc-debug-squel.php3");
erreur_squelette(_L("Inversion d'un ordre inexistant"), $param, $idb);
}
}
// Gerer les traductions
else if ($param == 'traduction') {
$boucle->where[] = "$id_table.id_trad > 0 AND $id_table.id_trad ='\"." .
index_pile($boucles[$idb]->id_parent, 'id_trad', $boucles) . ".\"'";
}
else if ($param == 'origine_traduction') {
$boucle->where[] = "$id_table.id_trad = $id_table.id_article";
}
// Special rubriques
else if ($param == 'meme_parent') {
$boucle->where[] = "$id_table.id_parent='\"." .
index_pile($boucles[$idb]->id_parent, 'id_parent', $boucles) . ".\"'";
if ($type == 'forums') {
$boucle->where[] = "$id_table.id_parent > 0";
$boucle->plat = true;
}
}
else if ($param == 'racine') {
$boucle->where[] = "$id_table.id_parent='0'";
}
else if (ereg("^branche *(\??)", $param, $regs)) {
$c = "$id_table.id_rubrique IN (\".calcul_branche(" .
index_pile($boucles[$idb]->id_parent, 'id_rubrique', $boucles) .
").\")";
if (!$regs[1])
$boucle->where[] = $c ;
else
$boucle->where[] = "('\$id_rubrique'='' OR $c)";
}
else if ($type == 'hierarchie')
{
// Hack spe'cifique; cf comple'ment dans calculer_boucle
$boucle->tout = index_pile($boucles[$idb]->id_parent,
'id_rubrique',
$boucles);
}
// Restriction de valeurs (implicite ou explicite)
else if (ereg('^([a-zA-Z_]+) *(\??)((!?)(<=?|>=?|==?) *"?([^<>=!"]*))?"?$', $param, $match)) {
// Variable comparee
$col = $match[1];
$col_table = $id_table;
// Valeur de comparaison
if ($match[3])
{
$val = calculer_param_dynamique($match[6], $boucles, $idb);
}
else {
$val = $match[1];
// Si id_parent, comparer l'id_parent avec l'id_objet de la boucle superieure
if ($val == 'id_parent')
$val = $table_primary[$type];
// Si id_enfant, comparer l'id_objet avec l'id_parent de la boucle superieure
else if ($val == 'id_enfant')
$val = 'id_parent';
$val = index_pile($boucles[$idb]->id_parent, $val, $boucles) ;
}
if (ereg('^\$',$val))
$val = '" . addslashes(' . $val . ') . "';
else
$val = addslashes($val);
// operateur optionnel {lang?}
$ou_rien = ($match[2]) ? "'$val'='' OR " : '';
// Traitement general des relations externes
if ($s = $tables_relations[$type][$col]) {
$col_table = $s;
$boucle->from[] = "$col_table AS $col_table";
$boucle->where[] = "$id_field=$col_table." . $table_primary[$type];
$boucle->group = "'$id_field'";
$boucle->lien = true;
}
// Cas particulier pour les raccourcis 'type_mot' et 'titre_mot'
else if ($type != 'mots' AND ($col == 'type_mot' OR $col == 'titre_mot' OR $col == 'id_groupe')) {
if ($type == 'forums')
$col_lien = "forum";
else if ($type == 'syndication')
$col_lien = "syndic";
else
$col_lien = $type;
$boucle->from[] = "mots_$col_lien AS lien_mot";
$boucle->from[] = 'mots AS mots';
$boucle->where[] = "$id_field=lien_mot." . $table_primary[$type];
$boucle->where[] = 'lien_mot.id_mot=mots.id_mot';
$boucle->group = "'$id_field'";
$col_table = 'mots';
$boucle->lien = true;
if ($col == 'type_mot')
$col = 'type';
else if ($col == 'titre_mot')
$col = 'titre';
else if ($col == 'id_groupe')
$col = 'id_groupe';
}
// Cas particulier : selection des documents selon l'extension
if ($type == 'documents' AND $col == 'extension') {
$col_table = 'types_documents';
}
// HACK : selection des documents selon mode 'image' (a creer en dur dans la base)
else if ($type == 'documents' AND $col == 'mode' AND $val == 'image') {
$val = 'vignette';
}
// Cas particulier : lier les articles syndiques au site correspondant
else if ($type == 'syndic_articles' AND !ereg("^(id_syndic_article|titre|url|date|descriptif|lesauteurs)$",$col))
$col_table = 'syndic';
// Cas particulier : id_enfant => utiliser la colonne id_objet
if ($col == 'id_enfant')
$col = $table_primary[$type];
// Cas particulier : id_secteur = id_rubrique pour certaines tables
else if (($type == 'breves' OR $type == 'forums') AND $col == 'id_secteur')
$col = 'id_rubrique';
// Cas particulier : expressions de date
if (ereg("^(date|mois|annee|age|age_relatif|jour_relatif|mois_relatif|annee_relatif)(_redac)?$", $col, $regs)) {
$col = $regs[1];
if ($regs[2]) {
$date_orig = $id_table . ".'.'." . '$PileRow[0][date_redac]';
$date_compare = '\'" . $PileRow[0][date_redac] . "\'';
}
else {
$date_orig = "$id_table." . $table_date[$type];
$date_compare = '\'" . $PileRow[0][date] . "\'';
}
if ($col == 'date')
$col = $date_orig;
else if ($col == 'mois') {
$col = "MONTH($date_orig)";
$col_table = '';
}
else if ($col == 'annee') {
$col = "YEAR($date_orig)";
$col_table = '';
}
else if ($col == 'age') {
$col = calculer_param_date('now()', $date_orig);
$col_table = '';
}
else if ($col == 'age_relatif') {
$col = calculer_param_date($date_compare, $date_orig);
$col_table = '';
}
else if ($col == 'jour_relatif') {
$col = "LEAST(TO_DAYS(" .$date_compare . ")-TO_DAYS(" .
$date_orig .
"), DAYOFMONTH(" . $date_compare . ")-DAYOFMONTH(" . $date_orig .
")+30.4368*(MONTH(" . $date_compare . ")-MONTH(" . $date_orig .
"))+365.2422*(YEAR(" . $date_compare . ")-YEAR(" . $date_orig . ")))";
$col_table = '';
}
else if ($col == 'mois_relatif') {
$col = "MONTH(" . $date_compare . ")-MONTH(" . $date_orig .
")+12*(YEAR(" . $date_compare . ")-YEAR(" . $date_orig . "))";
$col_table = '';
}
else if ($col == 'annee_relatif') {
$col = "YEAR(" . $date_compare . ")-YEAR(" . $date_orig . ")";
$col_table = '';
}
}
if ($type == 'forums' AND ($col == 'id_parent' OR $col == 'id_forum'))
$boucle->plat = true;
// Operateur de comparaison
$op = $match[5];
if (!$op) {
$op = '=';
} else {if ($op == '==') $op = 'REGEXP'; }
if ($col_table) $col = "$col_table.$col";
$vu = 0;
if (($op == '=') && (!$match[4]) && ($boucle->where))
{
// repe'rer un parame`tre re'pe'te' comme {id_mot=1}{id_mot=2}
// pour cre'er une sous-requete
foreach ($boucle->where as $k => $v)
{
if (ereg("^ *$col *(=|IN) *['\(](.*)['\)]",$v, $m)) {
$boucle->where[$k] = "$col IN ($m[2],$val)";
// espe'rons que c'est le meme !
$boucle->sous_requete = $col;
$boucle->compte_requete++;
$vu=1;
break;}
}
}
if (!$vu)
{
if ($match[4] == '!')
$boucle->where[] = "NOT ($ou_rien$col $op'$val')";
else
$boucle->where[] = "$ou_rien$col $op'$val'";
}
} // fin du if sur les restrictions de valeurs
// Selection du classement
else if (ereg('^par[[:space:]]+([^}]*)$', $param, $match)) {
$tri = trim($match[1]);
if ($tri == 'hasard') { // par hasard
$boucle->select[] = "MOD($id_field * UNIX_TIMESTAMP(), 32767) & UNIX_TIMESTAMP() AS alea";
$boucle->order = "'alea'";
}
else if ($tri == 'titre_mot'){ // par titre_mot
$boucle->order= "'mots.titre'";
}
else if ($tri == 'type_mot'){ // par type_mot
$boucle->order= "'mots.type'";
}
else if ($tri == 'points'){ // par points
$boucle->order= "'points'";
}
else if (ereg("^num[[:space:]]+([^,]*)(,.*)?",$tri, $match2)) { // par num champ
$boucle->select[] = "0+$id_table.".$match2[1]." AS num";
$boucle->order = "'num".$match2[2]."'";
}
else if (ereg("^[a-z0-9]+$", $tri)) { // par champ
if ($tri == 'date') $tri = $table_date[$type];
$boucle->order = "'$id_table.$tri'";
}
else {
# tris par crite`re dynamique ou bizarres (formule composee, virgules, etc).
$boucle->order = calculer_param_dynamique($tri, $boucles, $idb);
}
}
# pas de else, c~a a du etre e'vacue' lors du phrase'
}
}
}
function calculer_param_date($date_compare, $date_orig)
{
return
"LEAST((UNIX_TIMESTAMP(" .
$date_compare .
")-UNIX_TIMESTAMP(" .
$date_orig .
"))/86400,\n\tTO_DAYS(" .
$date_compare .
")-TO_DAYS(" .
$date_orig .
"),\n\tDAYOFMONTH(" .
$date_compare .
")-DAYOFMONTH(" .
$date_orig .
")+30.4368*(MONTH(" .
$date_compare .
")-MONTH(" .
$date_orig .
"))+365.2422*(YEAR(" .
$date_compare .
")-YEAR(" .
$date_orig .
")))";
}
function calculer_param_dynamique($val, &$boucles, $idb)
{
if (ereg("^#(.*)$",$val,$m))
return index_pile($boucles[$idb]->id_parent, $m[1], $boucles) ;
else
{if (ereg('^\$(.*)$',$val,$m))
return '$PileRow[0][\''. $m[1] ."']";
else return $val;
}
}
?>