source: spip-zone/_core_/plugins/forum/balise/formulaire_forum.php

Last change on this file was 113294, checked in by spip.franck@…, 2 months ago

Il parait que le futur c'est maintenant :-D

File size: 6.4 KB
Line 
1<?php
2
3/***************************************************************************\
4 *  SPIP, Systeme de publication pour l'internet                           *
5 *                                                                         *
6 *  Copyright (c) 2001-2019                                                *
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 **/
18if (!defined("_ECRIRE_INC_VERSION")) {
19        return;
20}  #securite
21
22include_spip('inc/acces');
23include_spip('inc/texte');
24include_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 */
52function 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 */
107function 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 */
165function 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}
Note: See TracBrowser for help on using the repository browser.