Valider fd99ed12 rédigé par esj's avatar esj
Parcourir les fichiers

Il est désormais possible de provoquer une jointure en écrivant directement la...

Il est désormais possible de provoquer une jointure en écrivant directement la notation TABLE.NOM dans un critère, écriture qui provoquait une inélégante erreur SQL auparavant. La jointure sera possible si la table indiquée a un champ homonyme d'un champ de la table principale de la boucle, la clé primaire étant prioritaire. En cas de critère sans opérateur explicite {{{ {TABLE.NOM} }}}, la valeur implicite prise est la valeur de {{{NOM}}} dans le contexte courant (en particulier, au premier niveau, dans l'URL).

Application: un squelette pour les pétitions multi-lingues ou non, selon le contexte:

{{{
<BOUCLE_signatures(SIGNATURES){id_article?} {articles.id_trad ?}  />
}}}

A noter que les 3 critères id_mot_syndic etc introduits par [11019] suite à l'ambiguïté de [10991], ne sont finalement pas utiles puisqu'on peut à présent écrire:
{{{
<BOUCLE_syndiczone(SYNDIC_ARTICLES){mots_syndic.id_mot=233}{doublons zone} />
}}}

Conséqunce: beaucoup des jointures déclarées par les globales PHP devraient pouvoir disparaître, ce mécanisme permettant de joindre entre elles n'importe quelle table ayant des champs homonymes.
parent 5466af10
Chargement en cours
Chargement en cours
Chargement en cours
Chargement en cours
+8 −1
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -745,7 +745,13 @@ function calculer_critere_infixe($idb, &$boucles, $crit) {
	else if ($date = tester_param_date($boucle->type_requete, $col)) {
		list($col, $table) =
		calculer_critere_infixe_date($idb, $boucles, $date);
	} else {
	}
	else if (preg_match('/^(.*)\.(.*)$/', $col, $r)) {
		  list(,$table, $col) = $r;
		  $col_alias = $col;
		  $table = calculer_critere_externe_init($boucle, array($table), $col, $desc, ($crit->cond OR $op !='='), true);
	}
	else {
		if (@!array_key_exists($col, $desc['field'])) {
	  	$calculer_critere_externe = 'calculer_critere_externe_init';
			// gestion par les plugins des jointures tordues pas automatiques mais necessaires
@@ -880,6 +886,7 @@ function calculer_critere_infixe_ops($idb, &$boucles, $crit)
	if (count($crit->param) == 0)
	  { $op = '=';
	    $col = $val = $crit->op;
	    if (preg_match('/^(.*)\.(.*)$/', $col, $r)) $val = $r[2];
	    // Cas special {lang} : aller chercher $GLOBALS['spip_lang']
	    if ($val == 'lang')
	      $val = array(kwote('$GLOBALS[\'spip_lang\']'));
+1 −1
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -34,7 +34,7 @@ define('CHAMP_ETENDU', '/\[([^]\[]*)\(' . NOM_DE_CHAMP . '([^[)]*\)[^]\[]*)\]/S'
define('BALISE_INCLURE','/<INCLU[DR]E[[:space:]]*(\(([^)]*)\))?/S');

define('SQL_ARGS', '(\([^)]*\))');
define('CHAMP_SQL_PLUS_FONC', '`?([A-Z_][A-Z_0-9]*)' . SQL_ARGS . '?`?');
define('CHAMP_SQL_PLUS_FONC', '`?([A-Z_][A-Z_0-9.]*)' . SQL_ARGS . '?`?');

// http://doc.spip.org/@phraser_arguments_inclure
function phraser_arguments_inclure($p,$rejet_filtres = false){