| Current Path : /home/etiennec/www/plugins-dist/forum/balise/ |
| Current File : /home/etiennec/www/plugins-dist/forum/balise/formulaire_forum.php |
<?php
/***************************************************************************\
* SPIP, Systeme de publication pour l'internet *
* *
* Copyright (c) 2001-2014 *
* Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
* *
* Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
* Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
\***************************************************************************/
if (!defined("_ECRIRE_INC_VERSION")) return; #securite
include_spip('inc/acces');
include_spip('inc/texte');
include_spip('inc/forum');
/*******************************/
/* GESTION DU FORMULAIRE FORUM */
/*******************************/
/**
* Contexte du formulaire
* Mots-cles dans les forums :
* Si la variable de personnalisation $afficher_groupe[] est definie
* dans le fichier d'appel, et si la table de reference est OK, proposer
* la liste des mots-cles
* #FORMULAIRE_FORUM seul calcule (objet, id_objet) depuis la boucle parente
* #FORMULAIRE_FORUM{#SELF} pour forcer l'url de retour
* #FORMULAIRE_FORUM{#SELF, article, 3} pour forcer l'objet et son identifiant
* http://code.spip.net/@balise_FORMULAIRE_FORUM
*
* @param Object $p
* @return Object
*/
function balise_FORMULAIRE_FORUM ($p) {
/**
* On recupere $objet et $id_objet depuis une boucle englobante si possible
* Sinon, on essaie aussi de recuperer des id_xx dans l'URL qui pourraient indiquer
* sur quoi le formulaire porte.
* Enfin, on pourra aussi forcer objet et id_objet depuis l'appel du formulaire
*/
$i_boucle = $p->nom_boucle ? $p->nom_boucle : $p->id_boucle;
$_id_objet = $p->boucles[$i_boucle]->primary;
$_type = $p->boucles[$i_boucle]->id_table;
/**
* On essaye de trouver les forums en fonction de l'environnement
* pour cela, on recupere l'ensemble des id_xxx possibles dans l'env
*/
$ids = forum_get_objets_depuis_env();
$ids = array_values($ids);
$obtenir = array(
$_id_objet,
'id_forum',
'ajouter_mot',
'ajouter_groupe',
'afficher_texte'
);
if ($ids) {
$obtenir = array_merge($obtenir, $ids);
}
$p = calculer_balise_dynamique($p,'FORMULAIRE_FORUM', $obtenir,
array("'$_type'", count($ids))
);
// Ajouter le code d'invalideur specifique aux forums
include_spip('inc/invalideur');
if ($i = charger_fonction('code_invalideur_forums', '', true)) {
$p->code = $i($p, $p->code);
}
return $p;
}
/**
* Chercher l'objet/id_objet et la configuration du forum
*
* http://code.spip.net/@balise_FORMULAIRE_FORUM_stat
*
* @param array $args
* @param array $context_compil
* @return array|bool
*/
function balise_FORMULAIRE_FORUM_stat($args, $context_compil) {
// un arg peut contenir l'url sur lequel faire le retour
// exemple dans un squelette article.html : [(#FORMULAIRE_FORUM{#SELF})]
// recuperer les donnees du forum auquel on repond.
// deux autres a la suite pour forcer objet et id_objet
// [(#FORMULAIRE_FORUM{#SELF, article, 8})]
//
// $args = (obtenir) + (ids) + (url, objet, id_objet)
$ido = array_shift($args);
$id_forum = intval(array_shift($args));
$ajouter_mot = array_shift($args);
$ajouter_groupe = array_shift($args);
$afficher_texte = array_shift($args);
$r = balise_forum_retrouve_objet($ido,$id_forum,$args,$context_compil);
if (!$r)
return false;
list($objet, $id_objet, $retour) = $r;
// on verifie ici si on a le droit de poster sur ce forum
// doublonne le test dans le formulaire, mais permet d'utiliser la balise
// pour conditionner l'affichage d'un titre le precedant
// (ie compatibilite)
$accepter_forum = controler_forum($objet, $id_objet);
if ($accepter_forum == 'non')
return false;
return
array($objet,
$id_objet, $id_forum, $ajouter_mot, $ajouter_groupe, $afficher_texte, $retour);
}
/**
* @param int $ido
* @param int $id_forum
* @param array $args
* @param array $context_compil
* @param bool $objet_obligatoire
* @return array|bool
*/
function balise_forum_retrouve_objet($ido,$id_forum,$args,$context_compil, $objet_obligatoire = true){
$_objet = $context_compil[5]; // type le la boucle deja calcule
$nb_ids_env = $context_compil[6]; // nombre d'elements id_xx recuperes
$nb = $nb_ids_env;
$url = isset($args[$nb]) ? $args[$nb] : '';
$objet = isset($args[++$nb]) ? $args[$nb] : '';
$id_objet = isset($args[++$nb]) ? $args[$nb] : 0;
// pas d'objet force ? on prend le type de boucle calcule
if (!$objet) {
$objet = $_objet;
$id_objet = intval($ido);
} else {
$id_objet = intval($id_objet);
}
unset($_objet, $ido);
$objet = objet_type($objet);
// on tente de prendre l'objet issu de l'environnement si un n'a pas pu etre calcule
if (!$objet) {
$objets = forum_get_objets_depuis_env();
$ids = array(); $i = 0;
foreach ($objets as $o => $ido) {
if ($id = $args[$i]) {
$ids[$o] = $id;
}
$i++;
}
if (count($ids)>1) {
if (isset($ids['rubrique'])) {
unset($ids['rubrique']);
}
}
if (count($ids) == 1) {
$objet = key($ids);
$id_objet = array_shift($ids);
}
}
unset($i);
// et si on n'a toujours pas ce qu'on souhaite, on tente de le trouver dans un forum existant...
if (($objet=='forum' OR !$id_objet) and $id_forum){
if ($objet = sql_fetsel(array('id_objet', 'objet'), 'spip_forum', 'id_forum=' . intval($id_forum))) {
$id_objet = $objet['id_objet'];
$objet = $objet['objet'];
} else {
if ($objet_obligatoire)
return false;
}
}
// vraiment la... faut pas exagerer !
if ($objet_obligatoire AND !$id_objet) {
return false;
}
return array($objet,$id_objet,$url);
}
?>