Valider 9ed7778c rédigé par cerdic's avatar cerdic Validation de Gitea
Parcourir les fichiers

feat: Balise `#ID_LOGO_` qui prend les mêmes variantes que `#LOGO` mais...

feat: Balise `#ID_LOGO_` qui prend les mêmes variantes que `#LOGO` mais renvoie simplement le `id_document` du logo

- la fonction `logo_survol` disparait au profit d'une fonction `generer_code_logo` que l'on définit dans `ecrire/balise/id_logo_.php` pour être robuste aux vieilles surcharges du fichier `logo_.php`
- le flag `fichier` de la fonction `quete_logo()` devient déprécié, car l'information que l'on veut est en fait le champ fichier du document logo, donc on traite ce cas via `table_valeur()` (au passage on répare donc la syntaxe `#LOGO_TRUC**` ou `[(#LOGO_TRUC|fichier)]` qui depuis
SPIP 4.1 renvoyait toujours le nom du fichier `truconXX.png` au lieu de `logo/truconXX.png`)
- le traitement des champs titre, descriptif, credits et alt est fait dans la fonction `quete_html_logo()` c'est à dire uniquement quand on va effectivement produire du html

Refs: #3719
parent cf8a679a
Chargement en cours
Chargement en cours
Chargement en cours
Chargement en cours
+136 −0
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
<?php

/***************************************************************************\
 *  SPIP, Système de publication pour l'internet                           *
 *                                                                         *
 *  Copyright © avec tendresse depuis 2001                                 *
 *  Arnaud Martin, Antoine Pitrou, Philippe Rivière, Emmanuel Saint-James  *
 *                                                                         *
 *  Ce programme est un logiciel libre distribué sous licence GNU/GPL.     *
 *  Pour plus de détails voir le fichier COPYING.txt ou l'aide en ligne.   *
\***************************************************************************/

/**
 * Fonctions génériques pour les balises `#LOGO_XXXX`
 *
 * @package SPIP\Core\Compilateur\Balises
 **/

if (!defined('_ECRIRE_INC_VERSION')) {
	return;
}


/**
 * Compile la balise dynamique `#ID_LOGO_xx` qui retourne l'identifiant du document utilisé comme logo
 * pour un objet éditorial de SPIP.
 *
 * Le type d'objet est récupéré dans le nom de la balise, tel que
 * `ID_LOGO_ARTICLE` ou `ID_LOGO_SITE`.
 *
 * Ces balises ont quelques options :
 *
 * - La balise peut aussi demander explicitement le logo normal ou de survol,
 *   avec `ID_LOGO_ARTICLE_NORMAL` ou `ID_LOGO_ARTICLE_SURVOL`.
 * - On peut demander un logo de rubrique en absence de logo sur l'objet éditorial
 *   demandé avec `ID_LOGO_ARTICLE_RUBRIQUE`
 *
 * @balise
 * @uses generer_code_logo()
 * @example
 *     ```
 *     #ID_LOGO_ARTICLE
 *     ```
 *
 * @param Spip\Compilateur\Noeud\Champ $p
 *     Pile au niveau de la balise
 * @return Spip\Compilateur\Noeud\Champ
 *     Pile complétée par le code à générer
 */
function balise_ID_LOGO__dist($p) {

	preg_match(',^ID_LOGO_([A-Z_]+?)(|_NORMAL|_SURVOL|_RUBRIQUE)$,i', $p->nom_champ, $regs);
	$type = strtolower($regs[1]);
	$suite_logo = $regs[2];

	// cas de #ID_LOGO_SITE_SPIP
	if ($type == 'site_spip') {
		$type = 'site';
		$_id_objet = "\"'0'\"";
	}

	$id_objet = id_table_objet($type);
	if (!isset($_id_objet)) {
		$_id_objet = champ_sql($id_objet, $p);
	}

	$connect = $p->id_boucle ? $p->boucles[$p->id_boucle]->sql_serveur : '';
	if ($type == 'document') {
		$qconnect = _q($connect);
		$doc = "quete_document($_id_objet, $qconnect)";
		$code = "table_valeur($doc, 'id_vignette')";
	} elseif ($connect) {
		$code = "''";
		spip_log('Les logos distants ne sont pas prevus');
	} else {
		$champ_logo = 'id';
		$code = generer_code_logo($id_objet, $_id_objet, $type, '', "''", $p, $suite_logo, $champ_logo);
	}

	$p->code = $code;
	$p->interdire_scripts = false;

	return $p;
}

/**
 * Calcule le code HTML pour l'image ou l'information sur un logo
 *
 * @uses quete_logo()
 * @uses quete_html_logo()
 *
 * @param string $id_objet
 *     Nom de la clé primaire de l'objet (id_article, ...)
 * @param string $_id_objet
 *     Code pour la compilation permettant de récupérer la valeur de l'identifiant
 * @param string $type
 *     Type d'objet
 * @param string $align
 *     Alignement demandé du logo
 * @param string $lien
 *     Lien pour encadrer l'image avec si présent
 * @param Spip\Compilateur\Noeud\Champ $p
 *     Pile au niveau de la balise
 * @param string $suite
 *     Suite éventuelle de la balise logo, telle que `_SURVOL`, `_NORMAL` ou `_RUBRIQUE`.
 * @param string $champ
 *     Indique un type de champ à retourner (fichier, src, titre, descriptif, credits, id, alt)
 * @return string
 *     Code compilé retournant le chemin du logo ou le code HTML du logo.
 **/
function generer_code_logo($id_objet, $_id_objet, $type, $align, $_lien, $p, $suite, string $champ = ''): string {
	$onoff = 'ON';
	$_id_rubrique = "''";

	if ($type === 'rubrique') {
		$_id_rubrique = "quete_parent($_id_objet)";
	}

	if ($suite === '_SURVOL') {
		$onoff = 'off';
	} elseif ($suite === '_NORMAL') {
		$onoff = 'on';
	} elseif ($suite === '_RUBRIQUE') {
		$_id_rubrique = champ_sql('id_rubrique', $p);
	}

	$code = "quete_logo('$id_objet', '$onoff', $_id_objet, $_id_rubrique)";

	if ($champ) {
		return "table_valeur($code, '".addslashes($champ)."')";
	}

	$align = preg_replace(',\W,', '', $align);

	return "quete_html_logo($code, '$align', " . ($_lien ?: "''") . ')';
}
+12 −46
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -40,16 +40,18 @@ if (!defined('_ECRIRE_INC_VERSION')) {
 * - `LOGO_DOCUMENT{icone}`. Valeurs possibles : auto icone apercu vignette
 * - `LOGO_ARTICLE{200, 0}`. Redimensionnement indiqué
 *
 * Pour récupérer l’identifiant du document sous-jacent voir la balise `ID_LOGO_...`
 *
 * @balise
 * @uses logo_survol()
 * @uses generer_code_logo()
 * @example
 *     ```
 *     #LOGO_ARTICLE
 *     ```
 *
 * @param Champ $p
 * @param Spip\Compilateur\Noeud\Champ $p
 *     Pile au niveau de la balise
 * @return Champ
 * @return Spip\Compilateur\Noeud\Champ
 *     Pile complétée par le code à générer
 */
function balise_LOGO__dist($p) {
@@ -120,7 +122,13 @@ function balise_LOGO__dist($p) {
		$code = "''";
		spip_log('Les logos distants ne sont pas prevus');
	} else {
		$code = logo_survol($id_objet, $_id_objet, $type, $align, $fichier, $lien, $p, $suite_logo);
		// pour generer_code_logo
		include_spip('balise/id_logo_');
		$champ_logo = '';
		if ($fichier) {
			$champ_logo = 'fichier';
		}
		$code = generer_code_logo($id_objet, $_id_objet, $type, $align, $lien, $p, $suite_logo, $champ_logo);
	}

	// demande de reduction sur logo avec ecriture spip 2.1 : #LOGO_xxx{200, 0}
@@ -133,45 +141,3 @@ function balise_LOGO__dist($p) {

	return $p;
}

/**
 * Calcule le code HTML pour l'image d'un logo
 *
 * @param string $id_objet
 *     Nom de la clé primaire de l'objet (id_article, ...)
 * @param string $_id_objet
 *     Code pour la compilation permettant de récupérer la valeur de l'identifiant
 * @param string $type
 *     Type d'objet
 * @param string $align
 *     Alignement demandé du logo
 * @param int $fichier
 *     - -1 pour retourner juste le chemin de l'image
 *     - 0 pour retourner le code HTML de l'image
 * @param string $lien
 *     Lien pour encadrer l'image avec si présent
 * @param Champ $p
 *     Pile au niveau de la balise
 * @param string $suite
 *     Suite éventuelle de la balise logo, telle que `_SURVOL`, `_NORMAL` ou `_RUBRIQUE`.
 * @return string
 *     Code compilé retournant le chemin du logo ou le code HTML du logo.
 **/
function logo_survol($id_objet, $_id_objet, $type, $align, $fichier, $_lien, $p, $suite) {
	$code = "quete_logo('$id_objet', '" .
		(($suite == '_SURVOL') ? 'off' :
			(($suite == '_NORMAL') ? 'on' : 'ON')) .
		"', $_id_objet," .
		(($suite == '_RUBRIQUE') ?
			champ_sql('id_rubrique', $p) :
			(($type == 'rubrique') ? "quete_parent($_id_objet)" : "''")) .
		', ' . intval($fichier) . ')';

	if ($fichier) {
		return $code;
	}

	$align = preg_replace(',\W,', '', $align);

	return "quete_html_logo($code, '$align', " . ($_lien ?: "''") . ')';
}
+1 −1
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -65,7 +65,7 @@ function generer_generer_url($type, $p) {
 *
 * @param string $type
 *     Type d'objet
 * @param Champ $p
 * @param Spip\Compilateur\Noeud\Champ $p
 *     Pile au niveau de la balise
 * @param string $_id
 *     Code compilé permettant d'obtenir l'identifiant de l'objet
+24 −4
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -340,13 +340,13 @@ function quete_meta($nom, $serveur) {
 * @param int $id_rubrique
 *     Identifiant de la rubrique parente si l'on veut aller chercher son logo
 *     dans le cas où l'objet demandé n'en a pas.
 * @param bool $flag
 * @deprecated @param bool $flag
 *     Lorsque le drapeau est évalué comme "true", la fonction ne renvoie
 *     que le chemin du fichier, sinon elle renvoie le tableau plus complet.
 * @return array|string
 *     Retourne soit un tableau, soit le chemin du fichier.
 */
function quete_logo($cle_objet, $onoff, $id, $id_rubrique, $flag) {
function quete_logo($cle_objet, $onoff, $id, $id_rubrique, $flag = false) {
	include_spip('base/objets');
	$nom = strtolower($onoff);

@@ -359,7 +359,7 @@ function quete_logo($cle_objet, $onoff, $id, $id_rubrique, $flag) {

		if ($on) {
			if ($flag) {
				return basename($on['chemin']);
				return $on['fichier'];
			} else {
				$taille = @spip_getimagesize($on['chemin']);

@@ -386,6 +386,12 @@ function quete_logo($cle_objet, $onoff, $id, $id_rubrique, $flag) {
				$res['logo_off'] = $res[1];
				$res['width'] = ($taille ? $taille[0] : '');
				$res['height'] = ($taille ? $taille[1] : '');
				$res['fichier'] = $on['fichier'];
				$res['titre'] = ($on['titre'] ?? '');
				$res['descriptif'] = ($on['descriptif'] ?? '');
				$res['credits'] = ($on['credits'] ?? '');
				$res['alt'] = ($on['alt'] ?? '');
				$res['id'] = ($on['id_document'] ?? 0);

				return $res;
			}
@@ -418,6 +424,7 @@ function quete_logo($cle_objet, $onoff, $id, $id_rubrique, $flag) {
 * 		Type de l'objet dont on cherche le logo
 * @param string $mode
 * 		"on" ou "off" suivant le logo normal ou survol
 * @return bool|array
 **/
function quete_logo_objet($id_objet, $objet, $mode) {
	static $chercher_logo;
@@ -428,12 +435,18 @@ function quete_logo_objet($id_objet, $objet, $mode) {

	// On cherche pas la méthode classique
	$infos_logo = $chercher_logo($id_objet, $cle_objet, $mode);

	// Si la méthode classique a trouvé quelque chose, on utilise le nouveau format
	if (!empty($infos_logo)) {
		$infos_logo = [
		$infos = [
			'chemin' => $infos_logo[0],
			'timestamp' => $infos_logo[4],
			'id_document' => ($infos_logo[5]['id_document'] ?? ''),
		];
		foreach (['fichier', 'titre', 'descriptif', 'credits', 'alt'] as $champ) {
			$infos[$champ] = ($infos_logo[5][$champ] ?? '');
		}
		$infos_logo = $infos;
	}

	// On passe cette recherche de logo dans un pipeline
@@ -544,6 +557,13 @@ function quete_html_logo($logo, $align, $lien) {
			$contexte[$k] = $v;
		}
	}

	foreach (['titre', 'descriptif', 'credits', 'alt'] as $champ) {
		if (!empty($contexte[$champ])) {
			$contexte[$champ] = appliquer_traitement_champ($contexte[$champ] , $champ, 'document');
		}
	}

	$contexte['align'] = $align;
	$contexte['lien'] = $lien;
	return recuperer_fond('modeles/logo', $contexte);