‰PNG

   
IHDR  6   £   7¾Âß  PLTEÿÿÿL‹õïïïåååLŒõOŽõÜÜÜRõI‰ôÙÙÙçççáááJ‰ñÞÞÞDU¶Oò6€ö©Çüb|‰ÕÕ×e÷÷÷ÒÒÖÛåð^w‡„«ôÍÍÓ^•óöôïEnÓBP°ÇÈÐDV´>…õpŠ•ÂÃÎüùîÊ×ñÃÇÉš¨°±óPo{~¦óZw…\tˆ>P³m öc˜ó°Æòäéï»Íñ«³¸2F³Yf¸ó÷ýŸ¾øÕáûéðýÚåûØÙá¢°Ôwœæ°ºÕÀÑñ‡¦å’©ßº¾ÏŸ¯Ú—¶óPt¢PƒÔ^r|t‡pƒ”}š„¢äMi“¡©—¤ª¬±½Mr¢ÕÏÉ¡¦Æ™Ñ’˜Â}„¿oy»½ÁÞhuÂ¨«Å–š¿þ­)€  (IDATxœíÝ
[ÚÈ p"&bEA gÓDQ«-½¸­v÷”êzzv{¶ÝïÿAÎÜ’L’É¥ä™$ÿgût­í®ù=ï;—db
…<yòäÉ“'Ož”äêæú¸õÄ^%ýÕ'•³‰ZÚZ(NÀqÒ_~2y=V+‘	!ì\%}Iäõd+Z-Œ
d±K¯b©…±md±K·ct(J) ¤K“¾†Õçªó,5Â¦f¯KÏŸWlÄ-ƒ]ÚŠ5²…³e°KÇË`S2×¥“Xj!lØ
\'}«N<¶52¸e®K—Â¶fI_ÇŠo±Æ–É.Åª–É.][æºt	l¤K·“¾Õ&[„éÒIÒ²Ú,ƒ”Ûë¤¯d¥‰Á©FØÎ’¾’•&š-MU³7—.…
—ÌÔ­ñH¶è¥lÙêÒ(¶8j´KÇI_Ê*Á­f±mÁiÒ×²Â,‡téyÒ×²Â„³ÅP#l¤K I_Ë
Æ ªárÛ {I_ÌêÂKÍaËT—³-¢ÆºtÏëáû>Ü'd*Ö@¶xj6.7¥Ûm¿yóF¯V«E”u.Þ]Ÿ A¬%­;l1Ñl5ºQxËÜt,W-ÆI•OQ8![\4Žté»>q{2ú3’¸	Øâ£qjô€\·kšíç°Éâæe[ÀÌÏßš(
Ë,t(
$”bfp±-fæR#_Z»]/©E@¶õ¤Iâ¤ƒŠ$ÒK¨¡j¨äs[X¹ÉPn˜m+ÔÂÎñÙÍl6;<¿ƒcƒï	[£»Ú}*ÃèÁ¦Ô7k=ÃXÃ1ŒžÑ¼ƒP
RC]Ú&lúúÓÙdèÒP6ÞM{”ÌŽaœW`€šªTpµ5P´˜n‚i¡˜´IŒ„±ÁÁÔcÆà¶QÁ‰Ô¬.ÅnåXÅ–>6ÞˆÐ\³Ø~m°.­ë™dS*ÂR³àZb7¥Cæ4)`·mš26elFê
w©é¸EÂ¥‹Mõ¨8Ü‡³ 5Ô¥m›­®G/CÒÅV™òfkÍÃ³í³óÙÔZ‰ª‘.¥nx|+G¹yÕ¤f«€™SZÆôzB7	°48Ä¿nª¡¥Û{êFØp½e‡
l÷œJ»Öú¶¤*pÜ4BÕTøÁìb·s[¬G¥f›Øµf4éÚÖ™*àÍM-D
uiŸÜ>Šç–&6xh±áÂòN `ÉfwéGÊË-ElêØVkúÕ"ƒ»´Ëº±i¡nR³¹o9»ã	jª2qwiX½ùÔ¤bsËT¬­7PW£]ÚuØ´z©IÊŽ­b›Á§¨¡.íÚ]JªMÓ‚ÜRÄfO½±ú5Ö¥ÖŠ—°iÕÔ³{ƒPãY©‰"œUÙ\Ú°ÊM«÷ûýFch““MíXóÁ9ß£Ê`Úôg*º¢À[÷œ õO†ÃáÊAzÙ¬GcnBPÁÀÞ8ð»Õ3Á†A¬K96D¶‹’^6{FèMì¡
7žmM°ÏRÅZñºØv|l~5‰Ùî,¶ŠƒÈæ¿í†Ôh—:ûÆ¶“
¶’ÊMŸqÙ°šÆ¦ˆÍ;¶¥Ší˜¯6gv\„M®9!€M &/›Òr–mü¢"USÈa{åæ°íVÓÊfoä;àf3¸L	LMïúB¶~Ý›*¶R%€„ßï[Kb´¶©¡rkX›+´EÐ6]/Zÿyá–A^6Ød×Õ
¾©Xy
…j
sd<?php

/***************************************************************************\
 *  SPIP, Système de publication pour l'internet                           *
 *                                                                         *
 *  Copyright © avec tendresse depuis 2001                                 *
 *  Arnaud Martin, Antoine Pitrou, Philippe Rivière, Emmanuel Saint-James  *
 *                                                                         *
 *  Ce programme est un logiciel libre distribué sous licence GNU/GPL.     *
\***************************************************************************/

/**
 * Gestion du formulaire Forum et de sa balise
 *
 * @package SPIP\Forum\Balises
 **/
if (!defined('_ECRIRE_INC_VERSION')) {
	return;
}  #securite

include_spip('inc/acces');
include_spip('inc/texte');
include_spip('inc/forum');

/**
 * Compile la balise `#FORMULAIRE_FORUM` qui affiche un formulaire d'ajout
 * de commentaire
 *
 * Signature : `#FORMULAIRE_FORUM{[redirection[, objet, id_objet]]}`
 *
 * Particularité du contexte du formulaire pour permettre une saisie
 * de mots-clés dans les forums : si la variable de personnalisation
 * `$afficher_groupe[]` est définie dans le fichier d'appel, et si la table
 * de référence est OK, la liste des mots-clés est alors proposée.
 *
 * @balise
 * @link https://www.spip.net/3969 Balise `#FORMULAIRE_FORUM`
 * @link https://www.spip.net/1827 Les formulaires
 * @example
 *     ```
 *     #FORMULAIRE_FORUM seul calcule (objet, id_objet) depuis la boucle parente
 *     #FORMULAIRE_FORUM{#SELF} pour forcer l'url de retour
 *     #FORMULAIRE_FORUM{#SELF, article, 3} pour forcer l'objet et son identifiant
 *     ```
 *
 * @param Champ $p
 *     Pile au niveau de la balise
 * @return Champ
 *     Pile complétée par le code à générer
 */
function balise_FORMULAIRE_FORUM($p) {
	/**
	 * On recupere $objet et $id_objet depuis une boucle englobante si possible
	 * Sinon, on essaie aussi de recuperer des id_xx dans l'URL qui pourraient indiquer
	 * sur quoi le formulaire porte.
	 * Enfin, on pourra aussi forcer objet et id_objet depuis l'appel du formulaire
	 */

	$i_boucle = $p->nom_boucle ?: $p->id_boucle;
	if ($i_boucle) { // La balise peut aussi être utilisée hors boucle.
		$_id_objet = $p->boucles[$i_boucle]->primary;
		$_type = $p->boucles[$i_boucle]->id_table;
	} else {
		$_id_objet = $_type = null;
	}

	/**
	 * On essaye de trouver les forums en fonction de l'environnement
	 * pour cela, on recupere l'ensemble des id_xxx possibles dans l'env
	 */
	$ids = forum_get_objets_depuis_env();
	$ids = array_values($ids);

	$obtenir = [
		$_id_objet,
		'id_forum',
		'ajouter_mot',
		'ajouter_groupe',
		'forcer_previsu'
	];

	if ($ids) {
		$obtenir = array_merge($obtenir, $ids);
	}

	$p = calculer_balise_dynamique(
		$p,
		'FORMULAIRE_FORUM',
		$obtenir,
		["'$_type'", count($ids)]
	);

	// Ajouter le code d'invalideur specifique aux forums
	include_spip('inc/invalideur');
	if ($i = charger_fonction('code_invalideur_forums', '', true)) {
		$p->code = $i($p, $p->code);
	}

	return $p;
}

/**
 * Chercher l'objet/id_objet et la configuration du forum
 *
 * @param array $args
 * @param array $context_compil
 * @return array|bool
 */
function balise_FORMULAIRE_FORUM_stat($args, $context_compil) {


	// un arg peut contenir l'url sur lequel faire le retour
	// exemple dans un squelette article.html : [(#FORMULAIRE_FORUM{#SELF})]
	// recuperer les donnees du forum auquel on repond.
	// deux autres a la suite pour forcer objet et id_objet
	// [(#FORMULAIRE_FORUM{#SELF, article, 8})]
	//
	// $args = (obtenir) + (ids) + (url, objet, id_objet)
	$ido = array_shift($args);
	$id_forum = intval(array_shift($args));
	$ajouter_mot = array_shift($args);
	$ajouter_groupe = array_shift($args);
	$forcer_previsu = array_shift($args);

	$r = balise_forum_retrouve_objet($ido, $id_forum, $args, $context_compil);
	if (!$r) {
		return false;
	}

	[$objet, $id_objet, $retour] = $r;

	// on verifie ici si on a le droit de poster sur ce forum
	// doublonne le test dans le formulaire, mais permet d'utiliser la balise
	// pour conditionner l'affichage d'un titre le precedant
	// (ie compatibilite)
	$accepter_forum = controler_forum($objet, $id_objet);
	if ($accepter_forum == 'non') {
		return false;
	}

	return
		[
			$objet,
			$id_objet,
			$id_forum,
			$ajouter_mot,
			$ajouter_groupe,
			$forcer_previsu,
			$retour
		];
}

/**
 * Retrouve l'objet et id_objet d'un forum
 *
 * S'il n'est pas transmis, on le prend dans la boucle englobante, sinon
 * dans l'environnement, sinon on tente de le retrouver depuis un autre
 * message de forum
 *
 * @param int $ido
 * @param int $id_forum
 * @param array $args
 * @param array $context_compil
 * @param bool $objet_obligatoire
 * @return array|bool
 */
function balise_forum_retrouve_objet($ido, $id_forum, $args, $context_compil, $objet_obligatoire = true) {
	$_objet = $context_compil[5]; // type le la boucle deja calcule
	$nb_ids_env = $context_compil[6]; // nombre d'elements id_xx recuperes
	$nb = $nb_ids_env;
	$url = $args[$nb] ?? '';
	$objet = isset($args[++$nb]) ? $args[$nb] : '';
	$id_objet = isset($args[++$nb]) ? $args[$nb] : 0;

	// pas d'objet force ? on prend le type de boucle calcule
	if (!$objet) {
		$objet = $_objet;
		$id_objet = intval($ido);
	} else {
		$id_objet = intval($id_objet);
	}
	unset($_objet, $ido);

	$objet = objet_type($objet);

	// on tente de prendre l'objet issu de l'environnement si un n'a pas pu etre calcule
	if (!$objet) {
		$objets = forum_get_objets_depuis_env();
		$ids = [];
		$i = 0;
		foreach ($objets as $o => $ido) {
			if ($id = $args[$i]) {
				$ids[$o] = $id;
			}
			$i++;
		}
		if (count($ids) > 1) {
			if (isset($ids['rubrique'])) {
				unset($ids['rubrique']);
			}
		}
		if (count($ids) == 1) {
			$objet = key($ids);
			$id_objet = array_shift($ids);
		}
	}
	unset($i);

	// et si on n'a toujours pas ce qu'on souhaite, on tente de le trouver dans un forum existant...
	if (($objet == 'forum' or !$id_objet) and $id_forum) {
		if ($objet = sql_fetsel(['id_objet', 'objet'], 'spip_forum', 'id_forum=' . intval($id_forum))) {
			$id_objet = $objet['id_objet'];
			$objet = $objet['objet'];
		} else {
			if ($objet_obligatoire) {
				return false;
			}
		}
	}
	// vraiment la... faut pas exagerer !
	if ($objet_obligatoire and !$id_objet) {
		return false;
	}

	return [$objet, $id_objet, $url];
}
