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

Nouvelle implémentation de la balise #EXPOSE, qui optimise le calcul et...

Nouvelle implémentation de la balise #EXPOSE, qui optimise le calcul et précise la sémantique de son ''objet principal''. C'est l'objet indiqué dans le contexte (donc, pour le premier niveau, des variables d'URL) portant le nom de la clé primaire de la boucle englobant immédiatement la balise #EXPOSE: s'il s'agit d'une boucle ARTICLES, l'objet est l'article dont le numéro est donné par {{{id_article}}} dans le contexte, s'il s'agit d'une boucle MOTS, ce sera {{{id_mot}}} etc. 

L'écriture {{{#}}}nom_boucle{{{:EXPOSE}}} est gérée, ce qui permet de référencer l'objet principal à partir d'une boucle plus interne. Une illustration est donnée par le squelette standard article.html, dont l'ancienne version manquait son but faute de ce traitement.

Ce dépot va également encore plus loin que [10288] dans le calcul faisable à la compilation pour le traitement de la langue dans la balise #PARAMETRES_FORUM.

Ces deux modifications permettent de ne plus appeler '''trouver_table''' lors de l'éxécution d'un squelette comportant ces balises.
parent 580c9afd
Chargement en cours
Chargement en cours
Chargement en cours
Chargement en cours
+1 −1
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -47,7 +47,7 @@
        <div id="documents_portfolio">
            <h2><:info_portfolio:></h2>
            <BOUCLE_documents_portfolio(DOCUMENTS) {id_article} {mode=document} {extension IN png,jpg,gif} {par num titre, date} {doublons}>
            [<a href="#URL_DOCUMENT" type="#MIME_TYPE" onClick="location.href='[(#URL_ARTICLE|parametre_url{id_document,#ID_DOCUMENT})]#documents_portfolio';return false;"[ title="(#TITRE|couper{80}|texte_backend)"][ class="(#EXPOSE)"]>(#FICHIER|copie_locale|image_reduire{0,60}|inserer_attribut{class,spip_logos}|inserer_attribut{alt,[(#TITRE|couper{80}|texte_backend)]})</a>]
            [<a href="#URL_DOCUMENT" type="#MIME_TYPE" onClick="location.href='[(#URL_ARTICLE|parametre_url{id_document,#ID_DOCUMENT})]#documents_portfolio';return false;"[ title="(#TITRE|couper{80}|texte_backend)"][ class="(#_article_principal:EXPOSE)"]>(#FICHIER|copie_locale|image_reduire{0,60}|inserer_attribut{class,spip_logos}|inserer_attribut{alt,[(#TITRE|couper{80}|texte_backend)]})</a>]
            </BOUCLE_documents_portfolio>
        </div>
        </B_documents_portfolio>
+21 −12
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -291,17 +291,21 @@ function balise_EXPOSER_dist($p)
// http://doc.spip.org/@calculer_balise_expose
function calculer_balise_expose($p, $on, $off)
{
	$primary_key = $p->boucles[$p->id_boucle]->primary;
	if (!$primary_key) {
		erreur_squelette(_T('zbug_champ_hors_boucle',
				array('champ' => '#EXPOSER')
			), $p->id_boucle);
	$b = $p->nom_boucle ? $p->nom_boucle : $p->id_boucle;
	$key = $p->boucles[$b]->primary; 
	$desc = $p->boucles[$b]->show;

	if (!$key) {
		erreur_squelette(_T('zbug_champ_hors_boucle', array('champ' => '#EXPOSER')), $b);
	}

	$p->code = '(calcul_exposer('
	.champ_sql($primary_key, $p)
	.", '$primary_key', \$Pile[0]) ? $on : $off)";
	$c = champ_sql($key, $p);

	$r = !isset($desc['field']['id_rubrique']) ? "''"
	  : index_pile($p->id_boucle, 'id_rubrique', $p->boucles, $b);

	$p->code = "(calcul_exposer($c, '$key', \$Pile[0], $r) ? $on : $off)";

	$p->interdire_scripts = false;
	return $p;
}
@@ -694,15 +698,20 @@ function balise_PARAMETRES_FORUM_dist($p) {
		// y cherchera l'identifiant  donnant la langue
		// et pour id_syndic c'est id_rubrique car sa table n'en a pas
		  
			$liste_champs = array ("id_article","id_breve","id_rubrique","id_syndic","id_forum");
			$liste_table = array ("article","breve","rubrique","syndic","forum");
			$c = '';
			foreach ($liste_champs as $champ) {
			$tables = array();
			foreach ($liste_table as $t) {
				$champ = 'id_' . $t;
				$x = champ_sql($champ, $p);
				$c .= (($c) ? ".\n" : "") . "((!$x) ? '' : ('&$champ='.$x))";
				if ($lang AND $t!='forum') $tables[]= 
				  "'$champ' => '" . table_objet_sql($t) . "'";
			}
			$c = "substr($c,1)";

			if ($lang) $lang = -1;
			if ($lang)
				$lang = "array(" . join(",",$tables) .")";
			break;
	}

+12 −23
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -293,7 +293,7 @@ function calculer_hierarchie($id_rubrique, $exclure_feuille = false) {


// http://doc.spip.org/@calcul_exposer
function calcul_exposer ($id, $type, $reference) {
function calcul_exposer ($id, $type, $reference, $parent) {
	static $exposer;
	static $ref_precedente;

@@ -303,23 +303,11 @@ function calcul_exposer ($id, $type, $reference) {
	// en static.
	if ($reference<>$ref_precedente) {
		$ref_precedente = $reference;
		$exposer = array();
		foreach ($reference as $element=>$v) {
			if ((strpos($element, "id_") === 0) AND $v) {
				$x = substr($element, 3);
				if ($x == 'secteur') $x = 'rubrique';
				$desc = trouver_table(table_objet($x));
				if ($desc) {
					$table = $desc['table'];
					$exposer[$element][$v] = true;
					if (isset($desc['field']['id_rubrique'])) {
						$row = sql_fetsel('id_rubrique', $table, ("$element=" . _q($v)));
						$hierarchie = calculer_hierarchie($row['id_rubrique']);
						foreach (split(',',$hierarchie) as $id_rubrique)
							$exposer['id_rubrique'][$id_rubrique] = true;
					}
				}
			}
		$principal = $reference[$type];
		$exposer= array($type => array($principal => true));
		if ($principal AND $parent) {
			foreach(split(',',calculer_hierarchie($parent)) as $n)
				$exposer['id_rubrique'][$n] = true;
		}
	}

@@ -471,7 +459,7 @@ function calculer_notes() {
}

// Ajouter "&lang=..." si la langue de base n'est pas celle du site.
// Si le 2e parametre est "-1", c'est qu'on n'a pas pu
// Si le 2e parametre n'est pas une chaine, c'est qu'on n'a pas pu
// determiner la table a la compil, on le fait maintenant.
// Il faudrait encore completer: on ne connait pas la langue
// pour une boucle forum sans id_article ou id_rubrique donné par le contexte
@@ -479,12 +467,13 @@ function calculer_notes() {
// 
// http://doc.spip.org/@lang_parametres_forum
function lang_parametres_forum($qs, $lang) {
	if ($lang == -1 AND preg_match(',id_(\w+)=([0-9]+),', $qs, $r)) {
		$desc = trouver_table(table_objet($r[1]));
		if (!$desc OR !isset($desc['field']['lang'])) return '';
		$lang = sql_getfetsel('lang', $desc['table'], ("id_$r[1]=" . intval($r[2])));
	if (is_array($lang) AND preg_match(',id_(\w+)=([0-9]+),', $qs, $r)) {
		$id = 'id_' . $r[1];
		if ($t = $lang[$id])
			$lang = sql_getfetsel('lang', $t, "$id=" . $r[2]);
	}
  // Si ce n'est pas la meme que celle du site, l'ajouter aux parametres

	if ($lang AND $lang <> $GLOBALS['meta']['langue_site'])
		return $qs . "&lang=" . $lang;