Valider 171d66bf rédigé par marcimat@rezo.net's avatar marcimat@rezo.net
Parcourir les fichiers

Ticket #4300 : permettre de se passer de la présence de certains plugins dans...

Ticket #4300 : permettre de se passer de la présence de certains plugins dans le core en retirant des critères spécifiques à ces plugins (ici {id_mot?}).

Pour ce faire, et après quelques discussions, on introduit un critère `{id_?}`.
Ce critère, va en quelque sorte s’expanser en autant de critères conditionnels `{id_article?}{id_rubrique?}...` adaptés à la boucle en question.
Ce critère sera très pratique dans les squelettes de listes d’objets filtrables.

On calcule la liste des champs à insérer avec la fonction lister_champs_selection_conditionnelle() (qui peut être altérée par le pipeline du même nom).
Ces champs sont : 
- tous les champs id_xxx de la table de la boucle. (id_article, id_rubrique, id_secteur, id_trad pour la boucle ARTICLES)
- le champ 'objet' de la table de la boucle si elle en a un (par exemple dans la boucle FORUMS)
- les champs id_xxx clés primaires de tables qui peuvent être liées facilement à cette table (par exemple avec une table de liaison).



parent b70bf15e
Chargement en cours
Chargement en cours
Chargement en cours
Chargement en cours
+1 −0
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -91,6 +91,7 @@
	<pipeline nom="insert_head" action="" />
	<pipeline nom="insert_head_css" action="" />
	<pipeline nom="jquery_plugins" action="" />
	<pipeline nom="lister_champs_selection_conditionnelle" action="" />
	<pipeline nom="lister_tables_noerase" action="" />
	<pipeline nom="lister_tables_noexport" action="" />
	<pipeline nom="lister_tables_noimport" action="" />
+120 −0
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -1577,6 +1577,126 @@ function critere_where_dist($idb, &$boucles, $crit) {
	$boucle->where[] = $_where;
}

/**
 * Compile le critère `{id_?}`
 *
 * Ajoute automatiquement à la boucle des contraintes (nommées sélections conditionnelles)
 * équivalentes à `{id_article ?}{id_rubrique ?}...`, adaptées à la table en cours d’utilisation.
 *
 * Les champs sélectionnés par défaut sont :
 * - chaque champ id_xx de la table en cours d’utilisation (par exemple id_secteur sur la boucle ARTICLES)
 * - un champ 'objet', si cette table en dispose
 * - chaque clé primaire des tables des objets éditoriaux, s’ils sont éditables et liables (par exemple id_mot).
 *
 * @example
 *     ```
 *      <BOUCLE_liste_articles(ARTICLES){id_?}{tout}> ...
 *      Est équivalent (selon les plugins actifs) à :
 *      <BOUCLE_liste_articles(ARTICLES){id_article?}{id_rubrique?}{id_secteur?}{id_trad?}{id_mot?}{id_document?} ... {tout}> ...
 *     ```
 *
 * @uses lister_champs_selection_conditionnelle()
 * @param string $idb Identifiant de la boucle
 * @param array $boucles AST du squelette
 * @param Critere $crit Paramètres du critère dans cette boucle
 * @return void
 */
function critere_id__dist($idb, &$boucles, $crit) {

	$champs = lister_champs_selection_conditionnelle(
		$boucles[$idb]->show['table'],
		$boucles[$idb]->show,
		$boucles[$idb]->sql_serveur
	);

	// créer un critère {id_xxx?} de chaque champ retenu
	foreach ($champs as $champ) {
		$critere_id_table = new Critere;
		$critere_id_table->op = $champ;
		$critere_id_table->cond = '?';
		$critere_id_table->ligne = $crit->ligne;
		calculer_critere_DEFAUT_dist($idb, $boucles, $critere_id_table);
	}
}

/**
 * Liste les champs qui peuvent servir de selection conditionnelle à une table SQL
 *
 * Retourne, pour la table demandée :
 * - chaque champ id_xx de la table en cours d’utilisation (par exemple id_secteur sur la boucle ARTICLES)
 * - un champ 'objet' si la table le contient (pour les tables avec objet / id_objet par exemple)
 * - chaque clé primaire des tables des objets éditoriaux qui peuvent se lier facilement à cette table,
 * -- soit parce que sa clé primaire de la table demandée est un champ dans la table principale
 * -- soit parce qu’une table de liaison existe, d’un côté ou de l’autre
 *
 * @pipeline_appel lister_champs_selection_conditionnelle
 * @param string $table Nom de la table SQL
 * @param array|null $desc Description de la table SQL, si connu
 * @param string $serveur Connecteur sql a utiliser
 * @return array Liste de nom de champs (tel que id_article, id_mot, id_parent ...)
 */
function lister_champs_selection_conditionnelle($table, $desc = null, $serveur = '') {
	// calculer la description de la table
	if (!is_array($desc)) {
		$desc = description_table($table, $serveur);
	}
	if (!$desc) {
		return [];
	}

	// Les champs id_xx de la table demandée
	$champs = array_filter(
		array_keys($desc['field']),
		function($champ){
			return
				strpos($champ, 'id_') === 0
				or (in_array($champ, array('objet')));
		}
	);

	// On ne fera pas mieux pour les tables d’un autre serveur
	if ($serveur) {
		return $champs;
	}

	$primary = false;
	$associable = false;
	include_spip('action/editer_liens');

	if (isset($desc['type'])) {
		$primary = id_table_objet($desc['type']);
		$associable = objet_associable($desc['type']);
	} elseif (substr($table, -6) === '_liens') {
		$associable = true;
	}

	// liste de toutes les tables principales, sauf la notre
	$tables = lister_tables_objets_sql();
	unset($tables[$table]);

	foreach ($tables as $_table => $_desc) {
		if (
			$associable
			or ($primary and in_array($primary, array_keys($_desc['field'])))
			or objet_associable($_desc['type'])
		) {
			$champs[] = id_table_objet($_table);
		}
	}
	$champs = array_unique($champs);
	$champs = pipeline(
		'lister_champs_selection_conditionnelle',
		array(
			'args' => array(
				'table' => $table,
				'id_table_objet' => $primary,
				'associable' => $associable,
			),
			'data' => $champs,
		)
	);
	return $champs;
}

/**
 * Compile le critère `{tri}` permettant le tri dynamique d'un champ
+1 −1
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -19,7 +19,7 @@
		</tr>
	</thead>
	<tbody>
	<BOUCLE_liste_art(ARTICLES){id_article?}{id_rubrique?}{id_auteur?}{where?}{statut?}{recherche?}{tri #ENV{par,date}|defaut_tri_par{#GET{defaut_tri}},#GET{defaut_tri},session_liste_art}{par titre}{pagination #ENV{nb,10}}{!lang_select}>
	<BOUCLE_liste_art(ARTICLES){id_?}{where?}{statut?}{recherche?}{tri #ENV{par,date}|defaut_tri_par{#GET{defaut_tri}},#GET{defaut_tri},session_liste_art}{par titre}{pagination #ENV{nb,10}}{!lang_select}>
		[(#LANG|changer_typo)]
		<tr class="[(#COMPTEUR_BOUCLE|alterner{row_odd,row_even})]">
			<td class='statut'>[(#STATUT|puce_statut{article,#ID_ARTICLE,#ID_RUBRIQUE})]</td>
+1 −1
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -19,7 +19,7 @@
		</tr>
	</thead>
	<tbody>
	<BOUCLE_liste_rub(RUBRIQUES){id_rubrique?}{id_parent?}{id_auteur?}{where?}{statut?}{recherche?}{tri #ENV{par,num titre},#GET{defaut_tri}}{par titre}{pagination #ENV{nb,10}}>
	<BOUCLE_liste_rub(RUBRIQUES){id_?}{where?}{statut?}{recherche?}{tri #ENV{par,num titre},#GET{defaut_tri}}{par titre}{pagination #ENV{nb,10}}>
		[(#LANG|changer_typo)]
		<tr class="[(#COMPTEUR_BOUCLE|alterner{row_odd,row_even})]">
			<td class='picto'>[(#CHEMIN_IMAGE{rubrique-16.png}|balise_img)]</td>