[SPIP] ~v3.0.20-->v3.0.25
[lhc/web/clavette_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 if (!defined("_ECRIRE_INC_VERSION")) return; #securite
14
15 include_spip('inc/acces');
16 include_spip('inc/texte');
17 include_spip('inc/forum');
18
19 /*******************************/
20 /* GESTION DU FORMULAIRE FORUM */
21 /*******************************/
22
23 /**
24 * Contexte du formulaire
25 * Mots-cles dans les forums :
26 * Si la variable de personnalisation $afficher_groupe[] est definie
27 * dans le fichier d'appel, et si la table de reference est OK, proposer
28 * la liste des mots-cles
29 * #FORMULAIRE_FORUM seul calcule (objet, id_objet) depuis la boucle parente
30 * #FORMULAIRE_FORUM{#SELF} pour forcer l'url de retour
31 * #FORMULAIRE_FORUM{#SELF, article, 3} pour forcer l'objet et son identifiant
32 * http://code.spip.net/@balise_FORMULAIRE_FORUM
33 *
34 * @param Object $p
35 * @return Object
36 */
37 function balise_FORMULAIRE_FORUM ($p) {
38 /**
39 * On recupere $objet et $id_objet depuis une boucle englobante si possible
40 * Sinon, on essaie aussi de recuperer des id_xx dans l'URL qui pourraient indiquer
41 * sur quoi le formulaire porte.
42 * Enfin, on pourra aussi forcer objet et id_objet depuis l'appel du formulaire
43 */
44
45 $i_boucle = $p->nom_boucle ? $p->nom_boucle : $p->id_boucle;
46 $_id_objet = $p->boucles[$i_boucle]->primary;
47 $_type = $p->boucles[$i_boucle]->id_table;
48
49 /**
50 * On essaye de trouver les forums en fonction de l'environnement
51 * pour cela, on recupere l'ensemble des id_xxx possibles dans l'env
52 */
53 $ids = forum_get_objets_depuis_env();
54 $ids = array_values($ids);
55
56 $obtenir = array(
57 $_id_objet,
58 'id_forum',
59 'ajouter_mot',
60 'ajouter_groupe',
61 'afficher_texte'
62 );
63
64 if ($ids) {
65 $obtenir = array_merge($obtenir, $ids);
66 }
67
68 $p = calculer_balise_dynamique($p,'FORMULAIRE_FORUM', $obtenir,
69 array("'$_type'", count($ids))
70 );
71
72 // Ajouter le code d'invalideur specifique aux forums
73 include_spip('inc/invalideur');
74 if ($i = charger_fonction('code_invalideur_forums', '', true)) {
75 $p->code = $i($p, $p->code);
76 }
77
78 return $p;
79 }
80
81 /**
82 * Chercher l'objet/id_objet et la configuration du forum
83 *
84 * http://code.spip.net/@balise_FORMULAIRE_FORUM_stat
85 *
86 * @param array $args
87 * @param array $context_compil
88 * @return array|bool
89 */
90 function balise_FORMULAIRE_FORUM_stat($args, $context_compil) {
91
92
93 // un arg peut contenir l'url sur lequel faire le retour
94 // exemple dans un squelette article.html : [(#FORMULAIRE_FORUM{#SELF})]
95 // recuperer les donnees du forum auquel on repond.
96 // deux autres a la suite pour forcer objet et id_objet
97 // [(#FORMULAIRE_FORUM{#SELF, article, 8})]
98 //
99 // $args = (obtenir) + (ids) + (url, objet, id_objet)
100 $ido = array_shift($args);
101 $id_forum = intval(array_shift($args));
102 $ajouter_mot = array_shift($args);
103 $ajouter_groupe = array_shift($args);
104 $afficher_texte = array_shift($args);
105
106 $r = balise_forum_retrouve_objet($ido,$id_forum,$args,$context_compil);
107 if (!$r)
108 return false;
109
110 list($objet, $id_objet, $retour) = $r;
111
112 // on verifie ici si on a le droit de poster sur ce forum
113 // doublonne le test dans le formulaire, mais permet d'utiliser la balise
114 // pour conditionner l'affichage d'un titre le precedant
115 // (ie compatibilite)
116 $accepter_forum = controler_forum($objet, $id_objet);
117 if ($accepter_forum == 'non')
118 return false;
119
120 return
121 array($objet,
122 $id_objet, $id_forum, $ajouter_mot, $ajouter_groupe, $afficher_texte, $retour);
123 }
124
125 /**
126 * @param int $ido
127 * @param int $id_forum
128 * @param array $args
129 * @param array $context_compil
130 * @param bool $objet_obligatoire
131 * @return array|bool
132 */
133 function balise_forum_retrouve_objet($ido,$id_forum,$args,$context_compil, $objet_obligatoire = true){
134 $_objet = $context_compil[5]; // type le la boucle deja calcule
135 $nb_ids_env = $context_compil[6]; // nombre d'elements id_xx recuperes
136 $nb = $nb_ids_env;
137 $url = isset($args[$nb]) ? $args[$nb] : '';
138 $objet = isset($args[++$nb]) ? $args[$nb] : '';
139 $id_objet = isset($args[++$nb]) ? $args[$nb] : 0;
140
141 // pas d'objet force ? on prend le type de boucle calcule
142 if (!$objet) {
143 $objet = $_objet;
144 $id_objet = intval($ido);
145 } else {
146 $id_objet = intval($id_objet);
147 }
148 unset($_objet, $ido);
149
150 $objet = objet_type($objet);
151
152 // on tente de prendre l'objet issu de l'environnement si un n'a pas pu etre calcule
153 if (!$objet) {
154 $objets = forum_get_objets_depuis_env();
155 $ids = array(); $i = 0;
156 foreach ($objets as $o => $ido) {
157 if ($id = $args[$i]) {
158 $ids[$o] = $id;
159 }
160 $i++;
161 }
162 if (count($ids)>1) {
163 if (isset($ids['rubrique'])) {
164 unset($ids['rubrique']);
165 }
166 }
167 if (count($ids) == 1) {
168 $objet = key($ids);
169 $id_objet = array_shift($ids);
170 }
171 }
172 unset($i);
173
174 // et si on n'a toujours pas ce qu'on souhaite, on tente de le trouver dans un forum existant...
175 if (($objet=='forum' OR !$id_objet) and $id_forum){
176 if ($objet = sql_fetsel(array('id_objet', 'objet'), 'spip_forum', 'id_forum=' . intval($id_forum))) {
177 $id_objet = $objet['id_objet'];
178 $objet = $objet['objet'];
179 } else {
180 if ($objet_obligatoire)
181 return false;
182 }
183 }
184 // vraiment la... faut pas exagerer !
185 if ($objet_obligatoire AND !$id_objet) {
186 return false;
187 }
188
189 return array($objet,$id_objet,$url);
190 }
191 ?>