Browse Source

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

On mutualise les choses : les 2 balises font appel à une nouvelle fonction generer_introduction_entite() qui se charge de normaliser les données (champs de texte, longueur, suite), puis fait appel au filtre introduction qui construit celle-ci.

Du coup une partie des choses faites dans la balise #INTRODUCTION est reportée dans cette fonction. Reste les limitations de la balise #INFO_XXX: on ne peut pour l'instant pas passer de paramètres supplémentaire, donc ici longueur et suite, et le connect est vide (cf. commentaires dans la fonction).
dev/issue_4291_introduction
tcharlss 2 months ago
parent
commit
07dd2965ea
  1. 86
      ecrire/inc/filtres.php
  2. 56
      ecrire/public/balises.php

86
ecrire/inc/filtres.php

@ -4317,6 +4317,92 @@ 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|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, $longueur_ou_suite = null, $suite = null, $connect = '') {
include_spip('base/objets');
$type_objet = objet_type($type_objet);
// Récupérer les champs texte, descriptif, et chapo s'ils existent
$trouver_table = charger_fonction('trouver_table', 'base');
$descriptif = '';
$texte = '';
if ($desc = $trouver_table(table_objet_sql($type_objet))) {
if (
isset($desc['field']['descriptif'])
and isset($ligne['descriptif'])
) {
$descriptif = $ligne['descriptif'];
}
if (
isset($desc['field']['texte'])
and isset($ligne['texte'])
) {
$texte = $ligne['texte'];
}
// En absence de descriptif, on se rabat sur chapo + texte
if (
isset($desc['field']['chapo'])
and isset($ligne['chapo'])
) {
$chapo = $ligne['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
// Attention, même pour la longueur, la variable n'est pas un integer mais un string
if (!intval($longueur_ou_suite)) {
$longueur_objet = objet_info($type_objet, 'introduction_longueur');
$longueur_defaut = 600;
$longueur = ($longueur_objet ? $longueur_objet : $longueur_defaut);
} 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
*

56
ecrire/public/balises.php

@ -782,12 +782,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
@ -796,43 +798,37 @@ 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
$_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);
}
// 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 ($desc = $trouver_table(table_objet_sql($type_objet))) {
if (isset($desc['field']['descriptif'])) {
$_ligne .= "'descriptif' => " . champ_sql('descriptif', $p) . ',';
}
if (isset($desc['field']['texte'])) {
$_ligne .= "'texte' => " . champ_sql('texte', $p) . ',';
}
if (isset($desc['field']['chapo'])) {
$_ligne .= "'chapo' => " . champ_sql('chapo', $p) . ',';
}
}
$_ligne .= ')';
// longueur en parametre, ou valeur par defaut
$longueur_defaut = objet_info($type, 'introduction_longueur');
if (!$longueur_defaut) {
$longueur_defaut = 600;
// 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';
$_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';
}
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, $_longueur_ou_suite, $_suite, \$connect)";
#$p->interdire_scripts = true;
$p->etoile = '*'; // propre est deja fait dans le calcul de l'intro

Loading…
Cancel
Save