Valider 4c74fa7d rédigé par tcharlss's avatar tcharlss Validation de cerdic
Parcourir les fichiers

Ticket #4291 : faire fonctionner la balise #INFO_INTRODUCTION de la même façon...

Ticket #4291 : faire fonctionner la balise #INFO_INTRODUCTION de la même façon que #INTRODUCTION. (!110)

Faire fonctionner la balise `#INFO_INTRODUCTION` de la même façon que `#INTRODUCTION`

Actuellement, cette balise ne renvoie rien, à part si l'objet possède un champ « introduction ». Il serait préférable d'avoir la vraie introduction calculée par SPIP en fonction des autres champs.

**Fonctionnement actuel**

La balise `#INFO_xxx` renvoie tout simplement le champ « xxx » de l'objet, s'il existe.
Les cas particuliers sont gérés de 2 façons :
* Certains sont gérés en interne : la date et le titre
* Les autres peuvent avoir des traitements personnalisés en créant des fonctions [generer_TRUC_TYPE](https://git.spip.net/SPIP/spip/src/branch/master/ecrire/inc/filtres.php#L4282) ou [generer_TRUC_entite](https://git.spip.net/SPIP/spip/src/branch/master/ecrire/inc/filtres.php#L4285)

**Solution**

Ce PR ajoute donc une fonction `generer_introduction_entite` pour prendre en charge les introductions.
Cette fonction est mutualisée entre la balise normale `#INTRODUCTION` et `#INFO_INTRODUCTION`.
En conséquent, une partie des choses qui étaient faites dans `#INTRODUCTION` est déportée dans cette fonction.

Pour résumer, voici l'ordre d'appel et le rôle des balises et fonctions :

1. `#INTRODUCTION` / `#INFO_INTRODUCTION` : récupère les données brutes (champs textes, paramètres `longueur` et `suite`)
2. `generer_introduction_entite()` : normalise les données (tri dans les champs de texte, normalisation des paramètres `longueur` et `suite`)
3.  `filtre_introduction_dist()` : construit l'introduction

**Limites**

1. On ne peut pour l'instant pas passer de paramètre supplémentaires à `#INFO_xxx`, donc pas de `longueur` et de `suite`.
2. propre est déjà fait dans le calcul du fitre `introduction`, donc l'étoile n'a aucun effet (cf. [commentaire](https://git.spip.net/SPIP/spip/src/branch/master/ecrire/public/balises.php#L844)).
3. On ne connaît pas le $connect avec `#INFO_xxx`, cf. [commentaire](https://git.spip.net/SPIP/spip/src/branch/master/ecrire/inc/filtres.php#L4297)

**Tests**

Testé les cas suivants, tout fonctionne :
* `#INFO_INTRODUCTION{article,#ID_ARTICLE}`
* `#INTRODUCTION`
* `#INTRODUCTION{100, ...}`
* `#INTRODUCTION{...}`

Reviewed-on: https://git.spip.net/spip/spip/pulls/110


Co-authored-by: tcharlss's avatartcharlss <tcharlss@bravecassine.com>
Co-committed-by: tcharlss's avatartcharlss <tcharlss@bravecassine.com>
parent a2bcf39f
Chargement en cours
Chargement en cours
Chargement en cours
Chargement en cours
+10 −1
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -50,8 +50,17 @@ function balise_INFO__dist($p) {

		return $p;
	} else {

		// Récupérer tous les params à la suite de objet et id_objet
		$_params = '[';
		$nb_params = count($p->param[0]); // 1ère valeur vide donc 1 en plus
		for ($i = 3; $i < $nb_params; $i++) {
			$_params .= interprete_argument_balise($i, $p) . ',';
		}
		$_params .= ']';

		$info_sql = strtolower(substr($info, 5));
		$code = "generer_info_entite($id_objet, $type_objet, '$info_sql'" . ($p->etoile ? "," . _q($p->etoile) : "") . ")";
		$code = "generer_info_entite($id_objet, $type_objet, '$info_sql', " . ($p->etoile ? _q($p->etoile) : "''") . ", $_params)";
		$p->code = champ_sql($info, $p, $code);
		$p->interdire_scripts = true;

+80 −5
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -4536,9 +4536,11 @@ function bouton_action($libelle, $url, $class = '', $confirm = '', $title = '',
 * @param string $type_objet
 * @param string $info
 * @param string $etoile
 * @param array $params
 *     Tableau de paramètres supplémentaires transmis aux fonctions generer_xxx
 * @return string
 */
function generer_info_entite($id_objet, $type_objet, $info, $etoile = "") {
function generer_info_entite($id_objet, $type_objet, $info, $etoile = '', $params = []) {
	static $trouver_table = null;
	static $objets;

@@ -4555,11 +4557,12 @@ function generer_info_entite($id_objet, $type_objet, $info, $etoile = "") {

	// Si on demande l'url, on retourne direct la fonction
	if ($info == 'url') {
		return generer_url_entite($id_objet, $type_objet);
		return generer_url_entite($id_objet, $type_objet, ...$params);
	}

	// Sinon on va tout chercher dans la table et on garde en memoire
	$demande_titre = ($info == 'titre');
	$demande_titre = ($info === 'titre');
	$demande_introduction = ($info === 'introduction');

	// On ne fait la requete que si on a pas deja l'objet ou si on demande le titre mais qu'on ne l'a pas encore
	if (!isset($objets[$type_objet][$id_objet])
@@ -4587,15 +4590,25 @@ function generer_info_entite($id_objet, $type_objet, $info, $etoile = "") {
			$desc['table_sql'],
			id_table_objet($type_objet) . ' = ' . intval($id_objet)
		);

		// Toujours noter la longueur d'introduction, même si pas demandé cette fois-ci
		$objets[$type_objet]['introduction_longueur'] = $desc['introduction_longueur'] ?? null;
	}

	// Pour les fonction generer_xxx, si on demande l'introduction,
	// ajouter la longueur au début des params supplémentaires
	if ($demande_introduction) {
		$introduction_longueur = $objets[$type_objet]['introduction_longueur'];
		array_unshift($params, $introduction_longueur);
	}

	// Si la fonction generer_TRUC_TYPE existe, on l'utilise pour formater $info_generee
	if ($generer = charger_fonction("generer_${info}_${type_objet}", '', true)) {
		$info_generee = $generer($id_objet, $objets[$type_objet][$id_objet]);
		$info_generee = $generer($id_objet, $objets[$type_objet][$id_objet], ...$params);
	} // Si la fonction generer_TRUC_entite existe, on l'utilise pour formater $info_generee
	else {
		if ($generer = charger_fonction("generer_${info}_entite", '', true)) {
			$info_generee = $generer($id_objet, $type_objet, $objets[$type_objet][$id_objet]);
			$info_generee = $generer($id_objet, $type_objet, $objets[$type_objet][$id_objet], ...$params);
		} // Sinon on prend directement le champ SQL tel quel
		else {
			$info_generee = (isset($objets[$type_objet][$id_objet][$info]) ? $objets[$type_objet][$id_objet][$info] : '');
@@ -4613,6 +4626,68 @@ function generer_info_entite($id_objet, $type_objet, $info, $etoile = "") {
	return $info_generee;
}

/**
 * Fonction privée pour donner l'introduction d'un objet de manière générique.
 *
 * Cette fonction est mutualisée entre les balises #INTRODUCTION et #INFO_INTRODUCTION.
 * Elle se charge de faire le tri entre descriptif, texte et chapo,
 * et normalise les paramètres pour la longueur et la suite.
 * Ensuite elle fait appel au filtre 'introduction' qui construit celle-ci à partir de ces données.
 *
 * @uses filtre_introduction_dist()
 * @see generer_info_entite()
 * @see balise_INTRODUCTION_dist()
 *
 * @param int $id_objet
 *     Numéro de l'objet
 * @param string $type_objet
 *     Type d'objet
 * @param string $desc
 *     Ligne SQL de l'objet avec au moins descriptif, texte et chapo
 * @param int $introduction_longueur
 *     Longueur de l'introduction donnée dans la description de la table l'objet
 * @param int|string $longueur_ou_suite
 *     Longueur de l'introduction OU points de suite si on coupe
 * @param string $suite
 *     Points de suite si on coupe
 * @param string $connect
 *     Nom du connecteur à la base de données
 * @return string
 */
function generer_introduction_entite($id_objet, $type_objet, $ligne_sql, $introduction_longueur = null, $longueur_ou_suite = null, $suite = null, $connect = '') {

	$descriptif = $ligne_sql['descriptif'] ?? '';
	$texte = $ligne_sql['texte'] ?? '';
	// En absence de descriptif, on se rabat sur chapo + texte
	if (isset($ligne_sql['chapo'])) {
		$chapo = $ligne_sql['chapo'];
		$texte = strlen($descriptif) ?
			'' :
			"$chapo \n\n $texte";
	}

	// Longueur en paramètre, sinon celle renseignée dans la description de l'objet, sinon valeur en dur
	if (!intval($longueur_ou_suite)) {
		$longueur = intval($introduction_longueur ?: 600);
	} else {
		$longueur = intval($longueur_ou_suite);
	}

	// On peut optionnellement passer la suite en 1er paramètre de la balise
	// Ex : #INTRODUCTION{...}
	if (
		is_null($suite)
		and !intval($longueur_ou_suite)
	) {
		$suite = $longueur_ou_suite;
	}

	$f = chercher_filtre('introduction');
	$introduction = $f($descriptif, $texte, $longueur, $connect, $suite);

	return $introduction;
}

/**
 * Appliquer a un champ SQL le traitement qui est configure pour la balise homonyme dans les squelettes
 *
+31 −30
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -781,12 +781,14 @@ function calculer_balise_expose($p, $on, $off) {
 * @see filtre_introduction_dist()
 * @example
 *     ```
 *     #INTRODUCTION
 *     #INTRODUCTION{300}
 *     #INTRODUCTION : coupe au nombre par défaut, suite par défaut
 *     #INTRODUCTION{300} : coupe à 300, suite par défaut
 *     #INTRODUCTION{300, ...} : coupe à 300, suite '...'
 *     #INTRODUCTION{...} : coupe au nombre par défaut, suite '...'
 *     ```
 *
 * @balise
 * @link https://www.spip.net/@introduction
 * @link http://www.spip.net/@introduction
 *
 * @param Champ $p
 *     Pile au niveau de la balise
@@ -795,43 +797,42 @@ function calculer_balise_expose($p, $on, $off) {
 **/
function balise_INTRODUCTION_dist($p) {

	$type = $p->type_requete;
	$type_objet = $p->type_requete;
	$cle_objet = id_table_objet($type_objet);
	$_id_objet = champ_sql($cle_objet, $p);

	$_texte = champ_sql('texte', $p);
	// Récupérer les valeurs sql nécessaires : descriptif, texte et chapo
	// ainsi que le longueur d'introduction donnée dans la description de l'objet.
	$_introduction_longueur = 'null';
	$_ligne = 'array(';
	$trouver_table = charger_fonction('trouver_table', 'base');
	$desc = $trouver_table(table_objet_sql($type));
	$_descriptif = "''";
	if ($desc and isset($desc['field']['descriptif'])) {
		// notamment articles et rubriques mais aussi tout nouvel objet concerne
		$_descriptif = champ_sql('descriptif', $p);
	if ($desc = $trouver_table(table_objet_sql($type_objet))) {
		if (isset($desc['field']['descriptif'])) {
			$_ligne .= "'descriptif' => " . champ_sql('descriptif', $p) . ',';
		}

	// notamment les articles mais aussi tout nouvel objet concerne
	if ($desc and isset($desc['field']['chapo'])) {
		$_chapo = champ_sql('chapo', $p);
		$_texte = "(strlen($_descriptif))
		? ''
		: $_chapo . \"\\n\\n\" . $_texte";
		if (isset($desc['field']['texte'])) {
			$_ligne .= "'texte' => " . champ_sql('texte', $p) . ',';
		}
		if (isset($desc['field']['chapo'])) {
			$_ligne .= "'chapo' => " . champ_sql('chapo', $p) . ',';
		}
		if (isset($desc['introduction_longueur'])) {
			$_introduction_longueur = "'" . $desc['introduction_longueur'] . "'";
		}

	// longueur en parametre, ou valeur par defaut
	$longueur_defaut = objet_info($type, 'introduction_longueur');
	if (!$longueur_defaut) {
		$longueur_defaut = 600;
	}
	$_ligne .= ')';

	$_suite = 'null';
	$_longueur = $longueur_defaut;
	if (($v = interprete_argument_balise(1, $p)) !== null) {
		$_longueur = 'is_numeric(' . $v . ')?intval(' . $v . '):' . $longueur_defaut;
		$_suite = '!is_numeric(' . $v . ')?' . $v . ':null';
	// Récupérer la longueur et la suite passés en paramètres
	$_longueur_ou_suite = 'null';
	if (($v1 = interprete_argument_balise(1, $p)) !== null) {
		$_longueur_ou_suite = $v1;
	}
	$_suite = 'null';
	if (($v2 = interprete_argument_balise(2, $p)) !== null) {
		$_suite = $v2;
	}

	$f = chercher_filtre('introduction');
	$p->code = "$f($_descriptif, $_texte, $_longueur, \$connect, $_suite)";
	$p->code = "generer_introduction_entite($_id_objet, '$type_objet', $_ligne, $_introduction_longueur, $_longueur_ou_suite, $_suite, \$connect)";

	#$p->interdire_scripts = true;
	$p->etoile = '*'; // propre est deja fait dans le calcul de l'intro