PageRenderTime 44ms CodeModel.GetById 18ms RepoModel.GetById 0ms app.codeStats 0ms

/_core_/tags/spip-2.1.8/plugins/forum/balise/formulaire_forum.php

https://bitbucket.org/pombredanne/spip-zone-treemap
PHP | 247 lines | 144 code | 44 blank | 59 comment | 30 complexity | a1c8c0c13c5f24c0342c0930d7947494 MD5 | raw file
  1. <?php
  2. /***************************************************************************\
  3. * SPIP, Systeme de publication pour l'internet *
  4. * *
  5. * Copyright (c) 2001-2009 *
  6. * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
  7. * *
  8. * Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
  9. * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
  10. \***************************************************************************/
  11. if (!defined("_ECRIRE_INC_VERSION")) return; #securite
  12. include_spip('inc/acces');
  13. include_spip('inc/texte');
  14. include_spip('inc/forum');
  15. /*******************************/
  16. /* GESTION DU FORMULAIRE FORUM */
  17. /*******************************/
  18. // Contexte du formulaire
  19. // Mots-cles dans les forums :
  20. // Si la variable de personnalisation $afficher_groupe[] est definie
  21. // dans le fichier d'appel, et si la table de reference est OK, proposer
  22. // la liste des mots-cles
  23. // #FORMULAIRE_FORUM seul calcule (objet, id_objet) depuis la boucle parente
  24. // #FORMULAIRE_FORUM{#SELF} pour forcer l'url de retour
  25. // #FORMULAIRE_FORUM{#SELF, article, 3} pour forcer l'objet et son identifiant
  26. // http://doc.spip.org/@balise_FORMULAIRE_FORUM
  27. function balise_FORMULAIRE_FORUM ($p) {
  28. /**
  29. * On recupere $objet et $id_objet depuis une boucle englobante si possible
  30. * Sinon, on essaie aussi de recuperer des id_xx dans l'URL qui pourraient indiquer
  31. * sur quoi le formulaire porte.
  32. * Enfin, on pourra aussi forcer objet et id_objet depuis l'appel du formulaire
  33. */
  34. $i_boucle = $p->nom_boucle ? $p->nom_boucle : $p->id_boucle;
  35. $_id_objet = $p->boucles[$i_boucle]->primary;
  36. $_type = $p->boucles[$i_boucle]->id_table;
  37. /**
  38. * On essaye de trouver les forums en fonction de l'environnement
  39. * pour cela, on recupere l'ensemble des id_xxx possibles dans l'env
  40. */
  41. $ids = forum_get_objets_depuis_env();
  42. $ids = array_values($ids);
  43. $obtenir = array(
  44. $_id_objet,
  45. 'id_forum',
  46. 'ajouter_mot',
  47. 'ajouter_groupe',
  48. 'afficher_texte'
  49. );
  50. if ($ids) {
  51. $obtenir = array_merge($obtenir, $ids);
  52. }
  53. $p = calculer_balise_dynamique($p,'FORMULAIRE_FORUM', $obtenir,
  54. array("'$_type'", count($ids))
  55. );
  56. // Ajouter le code d'invalideur specifique aux forums
  57. include_spip('inc/invalideur');
  58. if ($i = charger_fonction('code_invalideur_forums', '', true)) {
  59. $p->code = $i($p, $p->code);
  60. }
  61. return $p;
  62. }
  63. //
  64. // Chercher le titre et la configuration d'un forum
  65. // valeurs possibles : 'pos'teriori, 'pri'ori, 'abo'nnement
  66. // Donner aussi la table de reference pour afficher_groupes[]
  67. // http://doc.spip.org/@balise_FORMULAIRE_FORUM_stat
  68. function balise_FORMULAIRE_FORUM_stat($args, $context_compil) {
  69. // un arg peut contenir l'url sur lequel faire le retour
  70. // exemple dans un squelette article.html : [(#FORMULAIRE_FORUM{#SELF})]
  71. // recuperer les donnees du forum auquel on repond.
  72. // deux autres a la suite pour forcer objet et id_objet
  73. // [(#FORMULAIRE_FORUM{#SELF, article, 8})]
  74. //
  75. // $args = (obtenir) + (ids) + (url, objet, id_objet)
  76. $nb_args_debut = 5;
  77. list ($ido, $idf, $am, $ag, $af) = $args;
  78. $idf = intval($idf);
  79. $_objet = $context_compil[5]; // type le la boucle deja calcule
  80. $nb_ids_env = $context_compil[6]; // nombre d'elements id_xx recuperes
  81. $nb = $nb_args_debut + $nb_ids_env;
  82. $url = isset($args[$nb]) ? $args[$nb] : '';
  83. $objet = isset($args[++$nb]) ? $args[$nb] : '';
  84. $id_objet = isset($args[++$nb]) ? $args[$nb] : 0;
  85. // pas d'objet force ? on prend le type de boucle calcule
  86. if (!$objet) {
  87. $objet = $_objet;
  88. $id_objet = intval($ido);
  89. } else {
  90. $id_objet = intval($id_objet);
  91. }
  92. unset($_objet, $ido);
  93. $objet = objet_type($objet);
  94. // on tente de prendre l'objet issu de l'environnement si un n'a pas pu etre calcule
  95. if (!$objet) {
  96. $objets = forum_get_objets_depuis_env();
  97. $ids = array(); $i = 0;
  98. foreach ($objets as $o => $ido) {
  99. if ($id = $args[$nb_args_debut + $i]) {
  100. $ids[$o] = $id;
  101. }
  102. $i++;
  103. }
  104. if (count($ids)>1) {
  105. if (isset($ids['rubrique'])) {
  106. unset($ids['rubrique']);
  107. }
  108. }
  109. if (count($ids) == 1) {
  110. $objet = key($ids);
  111. $id_objet = array_shift($ids);
  112. }
  113. }
  114. unset ($i, $nb_args_debut);
  115. if (table_objet($objet) == 'syndic') {
  116. $objet = 'site'; // eviter 'syndication' ... quelle *#@*&! de vilainerie
  117. }
  118. // et si on n'a toujours pas ce qu'on souhaite, on tente de le trouver dans un forum existant...
  119. if (!$id_objet and $idf){
  120. if ($objet = sql_fetsel(array('id_objet', 'objet'), 'spip_forum', 'id_forum=' . sql_quote($idf))) {
  121. $id_objet = $objet['id_objet'];
  122. $objet = $objet['objet'];
  123. } else {
  124. return false;
  125. }
  126. }
  127. // vraiment la... faut pas exagerer !
  128. if (!$id_objet) {
  129. return false;
  130. }
  131. // ca s'apparenterait presque a une autorisation...
  132. // si on n'avait pas a envoyer la valeur $accepter_forum au formulaire
  133. $accepter_forum = substr($GLOBALS['meta']["forums_publics"], 0, 3);
  134. // il y a un cas particulier pour l'acceptation de forum d'article...
  135. if ($f = charger_fonction($objet . '_accepter_forums_publics', 'inc', true)){
  136. $accepter_forum = $f($id_objet);
  137. }
  138. if ($accepter_forum == 'non') {
  139. return false;
  140. }
  141. if ($titre = forum_recuperer_titre($objet, $id_objet)) {
  142. $titre = supprimer_numero($titre);
  143. } else {
  144. return false; // inexistant ou non public
  145. }
  146. if ($idf > 0) {
  147. $titre_m = sql_fetsel('titre', 'spip_forum', "id_forum = " . sql_quote($idf));
  148. if (!$titre_m) {
  149. return false; // URL fabriquee
  150. }
  151. $titre = $titre_m['titre'];
  152. }
  153. $primary = id_table_objet($objet);
  154. $table = table_objet($objet);
  155. if ($GLOBALS['meta']["mots_cles_forums"] != "oui") {
  156. $table = '';
  157. }
  158. // Sur quelle adresse va-t-on "boucler" pour la previsualisation ?
  159. // si vide : self()
  160. $script = '';
  161. return
  162. array($titre, $table, $accepter_forum, $objet, $primary, $script,
  163. $id_objet, $idf, $am, $ag, $af, $url);
  164. }
  165. function forum_recuperer_titre($objet, $id_objet) {
  166. $titre = "";
  167. if ($f = charger_fonction($objet.'_forum_extraire_titre', 'inc', true)){
  168. $titre = $f($id_objet);
  169. } else {
  170. // retrouver le titre grace a table_titre...
  171. $trouver_table = charger_fonction('trouver_table', 'base');
  172. $desc = $trouver_table(table_objet_sql($objet));
  173. $_titre = $desc['titre'] ? $desc['titre'] : ($desc['field']['titre'] ? 'titre' : '');
  174. $_table = $desc['table'];
  175. $_primary = id_table_objet($_table);
  176. if ($_titre and $res = sql_fetsel($_titre, $_table, array(
  177. "statut = " . sql_quote('publie'),
  178. "$_primary = ". sql_quote($id_objet))
  179. )) {
  180. $titre = $res['titre'];
  181. }
  182. }
  183. return $titre;
  184. }
  185. // recuperer tous les objets dont on veut pouvoir obtenir l'identifiant
  186. // directement dans l'environnement
  187. function forum_get_objets_depuis_env() {
  188. static $objets = null;
  189. if ($objets === null) {
  190. // on met une cle (le type d'objet) pour qu'un appel du pipeline
  191. // puisse facilement soustraire un objet qu'il ne veut pas avec
  192. // unset($objets['rubrique']) par exemple.
  193. $objets = pipeline('forum_objets_depuis_env', array(
  194. 'article' => id_table_objet('article'),
  195. 'rubrique' => id_table_objet('rubrique'),
  196. 'site' => id_table_objet('site'),
  197. 'breve' => id_table_objet('breve')
  198. ));
  199. asort($objets);
  200. }
  201. return $objets;
  202. }
  203. ?>