[SPIP][PLUGINS] v3.0-->v3.2
[lhc/web/www.git] / www / plugins-dist / forum / balise / formulaire_forum.php
1 <?php
2
3 /***************************************************************************\
4 * SPIP, Systeme de publication pour l'internet *
5 * *
6 * Copyright (c) 2001-2016 *
7 * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
8 * *
9 * Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
10 * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
11 \***************************************************************************/
12
13 /**
14 * Gestion du formulaire Forum et de sa balise
15 *
16 * @package SPIP\Forum\Balises
17 **/
18 if (!defined("_ECRIRE_INC_VERSION")) {
19 return;
20 } #securite
21
22 include_spip('inc/acces');
23 include_spip('inc/texte');
24 include_spip('inc/forum');
25
26 /**
27 * Compile la balise `#FORMULAIRE_FORUM` qui affiche un formulaire d'ajout
28 * de commentaire
29 *
30 * Signature : `#FORMULAIRE_FORUM{[redirection[, objet, id_objet]]}`
31 *
32 * Particularité du contexte du formulaire pour permettre une saisie
33 * de mots-clés dans les forums : si la variable de personnalisation
34 * `$afficher_groupe[]` est définie dans le fichier d'appel, et si la table
35 * de référence est OK, la liste des mots-clés est alors proposée.
36 *
37 * @balise
38 * @link https://www.spip.net/3969 Balise `#FORMULAIRE_FORUM`
39 * @link https://www.spip.net/1827 Les formulaires
40 * @example
41 * ```
42 * #FORMULAIRE_FORUM seul calcule (objet, id_objet) depuis la boucle parente
43 * #FORMULAIRE_FORUM{#SELF} pour forcer l'url de retour
44 * #FORMULAIRE_FORUM{#SELF, article, 3} pour forcer l'objet et son identifiant
45 * ```
46 *
47 * @param Champ $p
48 * Pile au niveau de la balise
49 * @return Champ
50 * Pile complétée par le code à générer
51 */
52 function balise_FORMULAIRE_FORUM($p) {
53 /**
54 * On recupere $objet et $id_objet depuis une boucle englobante si possible
55 * Sinon, on essaie aussi de recuperer des id_xx dans l'URL qui pourraient indiquer
56 * sur quoi le formulaire porte.
57 * Enfin, on pourra aussi forcer objet et id_objet depuis l'appel du formulaire
58 */
59
60 $i_boucle = $p->nom_boucle ? $p->nom_boucle : $p->id_boucle;
61 if ($i_boucle) { // La balise peut aussi être utilisée hors boucle.
62 $_id_objet = $p->boucles[$i_boucle]->primary;
63 $_type = $p->boucles[$i_boucle]->id_table;
64 } else {
65 $_id_objet = $_type = null;
66 }
67
68 /**
69 * On essaye de trouver les forums en fonction de l'environnement
70 * pour cela, on recupere l'ensemble des id_xxx possibles dans l'env
71 */
72 $ids = forum_get_objets_depuis_env();
73 $ids = array_values($ids);
74
75 $obtenir = array(
76 $_id_objet,
77 'id_forum',
78 'ajouter_mot',
79 'ajouter_groupe',
80 'forcer_previsu'
81 );
82
83 if ($ids) {
84 $obtenir = array_merge($obtenir, $ids);
85 }
86
87 $p = calculer_balise_dynamique($p, 'FORMULAIRE_FORUM', $obtenir,
88 array("'$_type'", count($ids))
89 );
90
91 // Ajouter le code d'invalideur specifique aux forums
92 include_spip('inc/invalideur');
93 if ($i = charger_fonction('code_invalideur_forums', '', true)) {
94 $p->code = $i($p, $p->code);
95 }
96
97 return $p;
98 }
99
100 /**
101 * Chercher l'objet/id_objet et la configuration du forum
102 *
103 * @param array $args
104 * @param array $context_compil
105 * @return array|bool
106 */
107 function balise_FORMULAIRE_FORUM_stat($args, $context_compil) {
108
109
110 // un arg peut contenir l'url sur lequel faire le retour
111 // exemple dans un squelette article.html : [(#FORMULAIRE_FORUM{#SELF})]
112 // recuperer les donnees du forum auquel on repond.
113 // deux autres a la suite pour forcer objet et id_objet
114 // [(#FORMULAIRE_FORUM{#SELF, article, 8})]
115 //
116 // $args = (obtenir) + (ids) + (url, objet, id_objet)
117 $ido = array_shift($args);
118 $id_forum = intval(array_shift($args));
119 $ajouter_mot = array_shift($args);
120 $ajouter_groupe = array_shift($args);
121 $forcer_previsu = array_shift($args);
122
123 $r = balise_forum_retrouve_objet($ido, $id_forum, $args, $context_compil);
124 if (!$r) {
125 return false;
126 }
127
128 list($objet, $id_objet, $retour) = $r;
129
130 // on verifie ici si on a le droit de poster sur ce forum
131 // doublonne le test dans le formulaire, mais permet d'utiliser la balise
132 // pour conditionner l'affichage d'un titre le precedant
133 // (ie compatibilite)
134 $accepter_forum = controler_forum($objet, $id_objet);
135 if ($accepter_forum == 'non') {
136 return false;
137 }
138
139 return
140 array(
141 $objet,
142 $id_objet,
143 $id_forum,
144 $ajouter_mot,
145 $ajouter_groupe,
146 $forcer_previsu,
147 $retour
148 );
149 }
150
151 /**
152 * Retrouve l'objet et id_objet d'un forum
153 *
154 * S'il n'est pas transmis, on le prend dans la boucle englobante, sinon
155 * dans l'environnement, sinon on tente de le retrouver depuis un autre
156 * message de forum
157 *
158 * @param int $ido
159 * @param int $id_forum
160 * @param array $args
161 * @param array $context_compil
162 * @param bool $objet_obligatoire
163 * @return array|bool
164 */
165 function balise_forum_retrouve_objet($ido, $id_forum, $args, $context_compil, $objet_obligatoire = true) {
166 $_objet = $context_compil[5]; // type le la boucle deja calcule
167 $nb_ids_env = $context_compil[6]; // nombre d'elements id_xx recuperes
168 $nb = $nb_ids_env;
169 $url = isset($args[$nb]) ? $args[$nb] : '';
170 $objet = isset($args[++$nb]) ? $args[$nb] : '';
171 $id_objet = isset($args[++$nb]) ? $args[$nb] : 0;
172
173 // pas d'objet force ? on prend le type de boucle calcule
174 if (!$objet) {
175 $objet = $_objet;
176 $id_objet = intval($ido);
177 } else {
178 $id_objet = intval($id_objet);
179 }
180 unset($_objet, $ido);
181
182 $objet = objet_type($objet);
183
184 // on tente de prendre l'objet issu de l'environnement si un n'a pas pu etre calcule
185 if (!$objet) {
186 $objets = forum_get_objets_depuis_env();
187 $ids = array();
188 $i = 0;
189 foreach ($objets as $o => $ido) {
190 if ($id = $args[$i]) {
191 $ids[$o] = $id;
192 }
193 $i++;
194 }
195 if (count($ids) > 1) {
196 if (isset($ids['rubrique'])) {
197 unset($ids['rubrique']);
198 }
199 }
200 if (count($ids) == 1) {
201 $objet = key($ids);
202 $id_objet = array_shift($ids);
203 }
204 }
205 unset($i);
206
207 // et si on n'a toujours pas ce qu'on souhaite, on tente de le trouver dans un forum existant...
208 if (($objet == 'forum' or !$id_objet) and $id_forum) {
209 if ($objet = sql_fetsel(array('id_objet', 'objet'), 'spip_forum', 'id_forum=' . intval($id_forum))) {
210 $id_objet = $objet['id_objet'];
211 $objet = $objet['objet'];
212 } else {
213 if ($objet_obligatoire) {
214 return false;
215 }
216 }
217 }
218 // vraiment la... faut pas exagerer !
219 if ($objet_obligatoire and !$id_objet) {
220 return false;
221 }
222
223 return array($objet, $id_objet, $url);
224 }