Server : Apache System : Linux webd348.cluster026.gra.hosting.ovh.net 5.15.148-ovh-vps-grsec-zfs-classid #1 SMP Thu Feb 8 09:41:04 UTC 2024 x86_64 User : hednacluml ( 122243) PHP Version : 8.3.9 Disable Function : _dyuweyrj4,_dyuweyrj4r,dl Directory : /home/hednacluml/jobs/plugins-dist/forum/balise/ |
<?php /***************************************************************************\ * SPIP, Système de publication pour l'internet * * * * Copyright © avec tendresse depuis 2001 * * Arnaud Martin, Antoine Pitrou, Philippe Rivière, Emmanuel Saint-James * * * * Ce programme est un logiciel libre distribué sous licence GNU/GPL. * \***************************************************************************/ /** * Gestion du formulaire Forum et de sa balise * * @package SPIP\Forum\Balises **/ if (!defined('_ECRIRE_INC_VERSION')) { return; } #securite include_spip('inc/acces'); include_spip('inc/texte'); include_spip('inc/forum'); /** * Compile la balise `#FORMULAIRE_FORUM` qui affiche un formulaire d'ajout * de commentaire * * Signature : `#FORMULAIRE_FORUM{[redirection[, objet, id_objet]]}` * * Particularité du contexte du formulaire pour permettre une saisie * de mots-clés dans les forums : si la variable de personnalisation * `$afficher_groupe[]` est définie dans le fichier d'appel, et si la table * de référence est OK, la liste des mots-clés est alors proposée. * * @balise * @link https://www.spip.net/3969 Balise `#FORMULAIRE_FORUM` * @link https://www.spip.net/1827 Les formulaires * @example * ``` * #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 * ``` * * @param Champ $p * Pile au niveau de la balise * @return Champ * Pile complétée par le code à générer */ 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->id_boucle; if ($i_boucle) { // La balise peut aussi être utilisée hors boucle. $_id_objet = $p->boucles[$i_boucle]->primary; $_type = $p->boucles[$i_boucle]->id_table; } else { $_id_objet = $_type = null; } /** * 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 = [ $_id_objet, 'id_forum', 'ajouter_mot', 'ajouter_groupe', 'forcer_previsu' ]; if ($ids) { $obtenir = array_merge($obtenir, $ids); } $p = calculer_balise_dynamique( $p, 'FORMULAIRE_FORUM', $obtenir, ["'$_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 * * @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); $forcer_previsu = array_shift($args); $r = balise_forum_retrouve_objet($ido, $id_forum, $args, $context_compil); if (!$r) { return false; } [$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 [ $objet, $id_objet, $id_forum, $ajouter_mot, $ajouter_groupe, $forcer_previsu, $retour ]; } /** * Retrouve l'objet et id_objet d'un forum * * S'il n'est pas transmis, on le prend dans la boucle englobante, sinon * dans l'environnement, sinon on tente de le retrouver depuis un autre * message de forum * * @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 = $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 = []; $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(['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 [$objet, $id_objet, $url]; }