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

Introduction d’un critère pratique : `{compter_reponses}` sur la boucle FORUMS.

Ce critère calcule le nombre de réponses à un message de forum. Il stocke l’info dans `nombre_reponses` en SQL,
et on peut le récupérer via `#FORUM_NOMBRE_REPONSES` en SPIP.

Un argument supplémentaire permet de passer une clause HAVING pour limiter les résultats en fonction du nombre de réponses obtenu :
- `{compter_reponses nombre_reponses = 0}` sélectionnera tous les messages sans réponse.
- `{compter_reponses nombre_reponses > 10}{!par nombre_reponses}` sélectionnera les messages avec au moins 10 réponses, classés du plus grand nombre au plus petit.
parent 6c292162
Chargement en cours
Chargement en cours
Chargement en cours
Chargement en cours
+1 −1
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
<paquet
	prefix="forum"
	categorie="communication"
	version="1.10.2"
	version="1.11.0"
	etat="stable"
	compatibilite="[3.2.0-dev;3.2.*]"
	logo="prive/themes/spip/images/forum-32.png"
+72 −0
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -53,6 +53,78 @@ function critere_FORUMS_meme_parent_dist($idb, &$boucles, $crit) {
	$boucle->modificateur['plat'] = true;
}


/**
 * Compile le critère `{compter_reponses}`
 *
 * Ce critère compte le nombre de messages en réponse à un message donné.
 * Il stocke l’information dans le champ `nombre_reponses`.
 * On peut le récupérer en squelette avec `#FORUM_NOMBRE_REPONSES`
 *
 * Le calcul se fait par une jointure LEFT :
 * les éléments avec aucune réponse sont retournés.
 *
 * On peut passer un opérateur optionnel tel que :
 * `{compter_reponses nombre_reponses = 0}`
 * Ce qui fera un test sur le résultat du calcul (HAVING).
 *
 * @example
 *     ```
 *     <BOUCLE_(FORUMS){!par date_thread}{compter_reponses}> #FORUM_NOMBRE_REPONSES ...
 *     <BOUCLE_(FORUMS){compter_reponses}{!par nombre_reponse}> les plus commentés ...
 *     <BOUCLE_(FORUMS){!par date_thread}{compter_reponses nombre_reponse = 0}> sans réponse ...
 *     <BOUCLE_(FORUMS){!par date_thread}{compter_reponses nombre_reponse > 10}> + de 10 réponses ...
 *     ```
 *
 * @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_FORUMS_compter_reponses($idb, &$boucles, $crit) {
	$boucle = &$boucles[$idb];

	$id_parent = isset($GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent']) ?
		$GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent'] :
		'id_parent';

	$id_table = $boucle->id_table;

	$boucle->from['fils'] = 'spip_forum';
	$boucle->from_type['fils'] = 'left';
	$boucle->join["fils"]= array("'$id_table'", "'$id_parent'", "'id_forum'");

	$boucle->select[]= 'COUNT(fils.id_forum) AS nombre_reponses';
	$boucle->where[] = array("'='", "'fils.statut'",  "sql_quote('publie')");

	// Gestion du having
	if (count($crit->param)) {
		$champ = $crit->param[0][0]->texte;
		if (preg_match(',^(\w+)\s*([<>=])\s*([0-9]+)$,', $champ, $r)) {
			$champ = $r[1];
			$op = $r[2];
			$op_val = $r[3];
			$boucle->having[]= array("'".$op."'", "'" . $champ . "'", $op_val);
		}
	}
}

/**
 * Retourne le nombre de vote sur un objet de SPIP.
 *
 * Nécessite le critere `{compter_reponses}` sur la boucle FORUMS
 *
 * `<BOUCLE_(FORUMS){compter_reponses}>#FORUM_NOMBRE_REPONSES ...`
 *
 * @param Champ $p
 * @return Champ
 */
function balise_FORUM_NOMBRE_REPONSES_dist($p) {
	return rindex_pile($p, 'nombre_reponses', 'compter_reponses');
}



/**
 * Faute de copie du champ id_secteur dans la table des forums,
 * faut le retrouver par jointure