source: spip-zone/_core_/branches/spip-3.0/plugins/forum/balise/formulaire_forum.php @ 104360

Last change on this file since 104360 was 104360, checked in by spip.franck@…, 3 years ago

code.spip est maintenant en https, donc j'ajoute le "s" à http

File size: 5.7 KB
Line 
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
13if (!defined("_ECRIRE_INC_VERSION")) return;    #securite
14
15include_spip('inc/acces');
16include_spip('inc/texte');
17include_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 * https://code.spip.net/@balise_FORMULAIRE_FORUM
33 *
34 * @param Object $p
35 * @return Object
36 */
37function 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 * https://code.spip.net/@balise_FORMULAIRE_FORUM_stat
85 *
86 * @param array $args
87 * @param array $context_compil
88 * @return array|bool
89 */
90function 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 */
133function 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?>
Note: See TracBrowser for help on using the repository browser.