File "tri_par_rubrique_fonctions.php"

Full path: /home/argothem/www/organecyberpresse/plugins/auto/tri_par_rubrique/v1.7.3/tri_par_rubrique_fonctions.php
File size: 4.14 KB
MIME-type: text/x-php
Charset: utf-8

<?php

/**
 * Fonctions utiles au plugin Tri des articles par rubrique
 *
 * @plugin     Tri des articles par rubrique
 * @copyright  2019
 * @author     nicod_
 * @licence    GNU/GPL
 * @package    SPIP\Tri_par_rubrique\Fonctions
 */

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

/**
 * Génère la liste des critères de tri d'article utilisables sur les rubriques
 *
 * @return array
 */
function filtre_tri_par_rubrique_criteres_dist($id_rubrique) {
	$criteres = [
		'date' => _T('tri_par_rubrique:tri_articles_date'),
		'maj' => _T('tri_par_rubrique:tri_articles_maj'),
		'titre' => _T('tri_par_rubrique:tri_articles_titre'),
		'num titre' => _T('tri_par_rubrique:tri_articles_num_titre'),
		'id_article' => _T('tri_par_rubrique:tri_articles_id_article'),
	];

	// pour les rubriques, proposer le choix "Configuration par défaut"
	$config_defaut = lire_config('tri_par_rubrique', []);
	if (isset($config_defaut['trirub_articles']) && $id_rubrique) {
		$label = _T('tri_par_rubrique:tri_articles_defaut')
			. ' : ' . _T('tri_par_rubrique:tri_articles_' . str_replace(' ', '_', $config_defaut['trirub_articles']))
			. ($config_defaut['trirub_articles_inverse'] ? ' - ' . _T('tri_par_rubrique:tri_articles_inverse') : '');
		$criteres = array_merge(['defaut' => $label], $criteres);
	}

	if (
		test_plugin_actif('rang')
		and function_exists('rang_liste_objets')
		and in_array('articles', rang_liste_objets())
	) {
		$criteres['rang'] = _T('tri_par_rubrique:tri_articles_rang');
	}

	foreach ($criteres as $key => $value) {
		$criteres[$key] = _T('tri_par_rubrique:tri_articles_par') . ' ' . $value;
	}

	return $criteres;
}

/**
 * Critère tri_rubrique, qui affiche les articles selon le tri défini sur la rubrique dans l'espace privé
 *
 * @return string[]
 */
function critere_tri_rubrique_dist($idb, &$boucles, $crit) {

	$boucle = &$boucles[$idb];

	// Uniquement les boucles articles sont concernées par le critère de tri.
	if ($boucle->id_table != 'articles') {
		return ['zbug_tri_rubrique_sur_articles_uniquement'];
	}

	// nécessaires pour le tri par "num titre"
	$boucle->select[] = '0+articles.titre AS num';
	$boucle->select[] = 'CASE ( 0+articles.titre ) WHEN 0 THEN 1 ELSE 0 END AS sinum';

	// Détermination du tri configuré pour la rubrique ou globalement par défaut si aucun id_rubrique dans l'environnement
	$boucle->order[] = 'calculer_tri_rubrique($Pile, ($collecte ?? ""))';
}

function calculer_tri_rubrique($Pile, $collecte = '') {
	// chercher l'id_rubrique dans le contexte
	do {
		$depile = array_pop($Pile);
		$id_rubrique = $depile['id_rubrique'] ?? null;
	} while (!$id_rubrique && !empty($Pile));

	// On construit l'expression de tri.
	if ($tri = tri_rubrique_champ(intval($id_rubrique))) {
		// cas spécial "par num titre"
		if ($tri == 'num titre') {
			$tri = 'sinum, num';
		}
		$sens = tri_rubrique_sens($id_rubrique) ? 'DESC' : 'ASC';

		return "$tri $collecte $sens";
	}

	return '';
}

function tri_rubrique_champ($id_rubrique) {
	static $cache;
	if (isset($cache[$id_rubrique])) {
		return $cache[$id_rubrique];
	}

	// On initialise le champ à vide.
	$champ = '';

	if ($id = intval($id_rubrique)) {
		// On a bien un id_rubrique dans l'environnement
		$champ = sql_getfetsel('trirub_articles', 'spip_rubriques', 'id_rubrique=' . $id);
	}

	if (!$champ) {
		// Pas d'id_rubrique ou pas de valeur pour la rubrique, on se rabat sur la config globale
		include_spip('inc/config');
		$champ = lire_config('tri_par_rubrique/trirub_articles');
	}

	$cache[$id_rubrique] = $champ;

	return $champ;
}

function tri_rubrique_sens($id_rubrique) {
	static $cache;
	if (isset($cache[$id_rubrique])) {
		return $cache[$id_rubrique];
	}

	// On initialise la variable à false pour la distinguer de 0.
	$inverse = false;

	include_spip('inc/config');
	if ($id = intval($id_rubrique)) {
		if (sql_getfetsel('trirub_articles', 'spip_rubriques', 'id_rubrique=' . $id)) {
			$inverse = sql_getfetsel('trirub_articles_inverse', 'spip_rubriques', 'id_rubrique=' . $id);
		} else {
			$inverse = lire_config('tri_par_rubrique/trirub_articles_inverse');
		}
	} else {
		$inverse = lire_config('tri_par_rubrique/trirub_articles_inverse');
	}

	$cache[$id_rubrique] = $inverse;

	return $inverse;
}