On crée un deuxième forum.

On normalise les éléments du forum pour qu'il transmette l'id du forum en paramètre, notamment pour la création et la redirection dans le bon forum.
On ajoute des fonctions d'autorisation pour qu'un créateur de sujet puisse le modifier tant qu'il n'a pas de réponse.
On modifie les autorisations pour le formulaire editer_auteur, afin qu'un simple inscrit (6forum) puisse éditer son profil aussi !
This commit is contained in:
Pierre 2020-03-11 03:30:23 +01:00
parent 5bf7ac58a5
commit 9c42e9cc24
20 changed files with 176 additions and 71 deletions

View file

@ -19,8 +19,8 @@ function action_supprimer_sujet_dist(){
suivre_invalideur("id='id_article/$id_article'");
}
// redirection sur l'accueil
$retour = 'spip.php?page=forum_discussion';
// redirection
$retour = _request('redirect');
include_spip('inc/headers');
redirige_par_entete($retour);
}

View file

@ -20,6 +20,82 @@ if (!defined('_ECRIRE_INC_VERSION')) {
function balint_autoriser() {
}
function autoriser_auteur_modifier($faire, $type, $id, $qui, $opt) {
// Ni admin ni redacteur => non
if (!in_array($qui['statut'], array('0minirezo', '1comite', '6forum'))) {
return false;
}
// Un redacteur peut modifier ses propres donnees mais ni son login/email
// ni son statut (qui sont le cas echeant passes comme option)
if (in_array($qui['statut'], array('1comite','6forum'))) {
if (!empty($opt['webmestre'])) {
return false;
} elseif (
!empty($opt['statut'])
or !empty($opt['restreintes'])
or !empty($opt['email'])
) {
return false;
} elseif ($id == $qui['id_auteur']) {
return true;
} else {
return false;
}
}
// Un admin restreint peut modifier/creer un auteur non-admin mais il
// n'a le droit ni de le promouvoir admin, ni de changer les rubriques
if ($qui['restreint']) {
if (isset($opt['webmestre']) and $opt['webmestre']) {
return false;
} elseif ((isset($opt['statut']) and ($opt['statut'] == '0minirezo'))
or (isset($opt['restreintes']) and $opt['restreintes'])
) {
return false;
} else {
if ($id == $qui['id_auteur']) {
if (isset($opt['statut']) and $opt['statut']) {
return false;
} else {
return true;
}
} else {
if ($id_auteur = intval($id)) {
$t = sql_fetsel('statut', 'spip_auteurs', "id_auteur=$id_auteur");
if ($t and $t['statut'] != '0minirezo') {
return true;
} else {
return false;
}
} // id = 0 => creation
else {
return true;
}
}
}
}
// Un admin complet fait ce qu'il veut
// sauf se degrader
if ($id == $qui['id_auteur'] && (isset($opt['statut']) and $opt['statut'])) {
return false;
} elseif (isset($opt['webmestre'])
and $opt['webmestre']
and (defined('_ID_WEBMESTRES')
or !autoriser('webmestre'))) {
// et toucher au statut webmestre si il ne l'est pas lui meme
// ou si les webmestres sont fixes par constante (securite)
return false;
} // et modifier un webmestre si il ne l'est pas lui meme
elseif (intval($id) and autoriser('webmestre', '', 0, $id) and !autoriser('webmestre')) {
return false;
} else {
return true;
}
}
function autoriser_article_modifier($faire, $type, $id, $qui, $opt) {
if(in_array($qui['id_auteur'],auteurs_objet('article',$id))){
@ -30,3 +106,24 @@ function autoriser_article_modifier($faire, $type, $id, $qui, $opt) {
}
}
function autoriser_sujet_creer($faire, $type, $id, $qui, $opt) {
return in_array($qui['statut'], array('0minirezo','1comite','6forum'));
}
function autoriser_sujet_supprimer($faire, $type, $id, $qui, $opt) {
// Si le sujet a eu au moins une réponse, on ne peut plus le supprimer
if (sql_fetsel('*','spip_forum',"id_objet=$id AND objet='article'")){
return false;
}
// Sinon, seul les admins et l'auteur peuvent le supprimer
else{
if(in_array($qui['id_auteur'],auteurs_objet('article',$id))){
return true;
}
else{
return in_array($qui['statut'], array('0minirezo'));
}
}
}

View file

@ -12,7 +12,7 @@
[(#ENV{id_article}|oui)
[(#AUTORISER{modifier, article, #ENV{id_article}}|?{
<div class="ajax">
[(#FORMULAIRE_EDITER_SUJET{#ENV{id_article},#URL_PAGE{espace_membre}|parametre_url{forum,oui}})]<br>
[(#FORMULAIRE_EDITER_SUJET{#ENV{id_article},#ENV{id_forum},#URL_PAGE{#ENV{url}}|parametre_url{id_forum,#ENV{id_forum}}})]<br>
</div>
,
<div class="reponse_formulaire reponse_formulaire_erreur">Votre compte ne fait pas partie des auteurs autorisés à modifier cet article.</div>
@ -20,7 +20,7 @@
]
[(#ENV{id_article}|non)
<div class="ajax">
[(#FORMULAIRE_EDITER_SUJET{0,#URL_PAGE{espace_membre}|parametre_url{forum,oui}})]
[(#FORMULAIRE_EDITER_SUJET{0,#ENV{id_forum},#URL_PAGE{#ENV{url}}|parametre_url{id_forum,#ENV{id_forum}}})]
</div>
]
]

View file

@ -1,15 +1,16 @@
[(#REM) On affiche la première rubrique par défaut]
<section id="espace_membre" class="section-top section-bottom container">
<?php
if (isset($GLOBALS['visiteur_session']['id_auteur']) AND $GLOBALS['visiteur_session']['id_auteur']) {
?>
[(#REM) On affiche la première rubrique par défaut]
<section id="espace_membre" class="section-top section-bottom container">
<div class="cadre-blanc">
<h1 class="mb-4">Espace membre</h1>
<INCLURE{fond=inclure/espace_membre_contenu,env,ajax}>
</div>
</section>
<?php
}
@ -29,3 +30,6 @@
<?php
}
?>
</section>

View file

@ -1,24 +1,13 @@
<section class="section-top section-bottom container">
<div class="cadre-blanc">
<h1>Forum</h1>
<?php
if (isset($GLOBALS['visiteur_session']['id_auteur']) AND $GLOBALS['visiteur_session']['id_auteur']) {
?>
<div class="cadre-blanc">
<INCLURE{fond=inclure/forum_discussion,env,id_forum=#CONFIG{balint/id_rub_forum},ajax}>
<BOUCLE_intro(ARTICLES){grigri=forum}>
<div class="cadre-gris #EDIT{texte}">
[(#TEXTE|textebrut)]
</div>
</BOUCLE_intro>
<div class="boutons">
<a class="btn btn_editer" href="#URL_PAGE{editer_sujet}"><i class="fas fa-edit"></i> Démarrer une nouvelle discussion</a>
</div>
<INCLURE{fond=inclure/sujets-forum, env, ajax}>
<?php
}
@ -39,8 +28,6 @@
}
?>
</div>
</section>

View file

@ -26,7 +26,7 @@
<td class="cellule-tableau">
[(#STATUT|=={0minirezo}|oui) Administrateur]
[(#STATUT|=={1comite}|oui) Rédacteur]
[(#STATUT|=={6forum}|oui) Membre]
[(#STATUT|=={6forum}|oui) Inscrit]
</td>
<td class="cellule-tableau">
<BOUCLE_groupes(ARTICLES){id_secteur=#CONFIG{balint/id_rub_groupes}}{id_auteur=#ID_AUTEUR}>

View file

@ -900,8 +900,8 @@ body{
.sujet-forum{
padding: 1rem 0;
background: $fond-transparent;
&:not(:last-of-type){
border-bottom: solid 3px $gris-clair;
&:not(:first-of-type){
border-top: solid 3px $gris-clair;
}
.spip_logo{
border-radius: 100%;

View file

@ -12902,8 +12902,8 @@ body {
background: rgba(255, 255, 255, 0.92);
}
.sujet-forum:not(:last-of-type) {
border-bottom: solid 3px #f2f2f2;
.sujet-forum:not(:first-of-type) {
border-top: solid 3px #f2f2f2;
}
.sujet-forum .spip_logo {

View file

@ -43,6 +43,7 @@
#SET{name1,id_rub_articles}
#SET{name2,id_rub_groupes}
#SET{name3,id_rub_forum}
#SET{name3b,id_rub_forum_prive}
#SET{name4,id_mots_medias}
#SET{name5,id_mots_espace_membre}
#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name1}}|table_valeur{#GET{name2}}}
@ -59,10 +60,15 @@
<input type="text" name="#GET{name2}" id="#GET{name2}" value="#ENV{#GET{name2}}">
</div>
<div class="editer_[(#GET{name3})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]">
<label for="#GET{name3}">ID du secteur du forum</label>
<label for="#GET{name3}">ID du secteur du forum public</label>
[<span class="erreur_message">(#GET{erreurs})</span>]
<input type="text" name="#GET{name3}" id="#GET{name3}" value="#ENV{#GET{name3}}">
</div>
<div class="editer_[(#GET{name3b})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]">
<label for="#GET{name3b}">ID du secteur du forum privé</label>
[<span class="erreur_message">(#GET{erreurs})</span>]
<input type="text" name="#GET{name3b}" id="#GET{name3b}" value="#ENV{#GET{name3b}}">
</div>
<div class="editer_[(#GET{name4})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]">
<label for="#GET{name4}">ID du groupe de mots de la médiathèque</label>
[<span class="erreur_message">(#GET{erreurs})</span>]

View file

@ -14,12 +14,12 @@
<legend><i class="fas fa-pencil"></i> Texte</legend>
<div class="titre">
<label for="titre">Titre</label>
<input class="text" type="text" name="titre" value="#ENV{titre}">
<input class="text" type="text" name="titre" value="#ENV{titre}" tabindex='1'>
</div>
<div class="texte">
<label for="texte">Texte</label>
<textarea class="text" type="text" name="texte">#ENV{texte}</textarea>
<textarea class="text" type="text" name="texte" tabindex='2'>#ENV{texte}</textarea>
</div>
</fieldset>
@ -36,7 +36,7 @@
<div class="col-lg-3 formulaire-col-droite">
<div class="boutons text-center">
<button type="submit" class="submit btn">
<button type="submit" class="submit btn" tabindex='3'>
<i class="fas fa-save"></i> Enregistrer</a>
</button>
</div>

View file

@ -1,11 +1,11 @@
<?php
if (!defined('_ECRIRE_INC_VERSION')) return;
function formulaires_editer_sujet_charger_dist($id_article=0, $redirect=''){
function formulaires_editer_sujet_charger_dist($id_article=0, $id_rubrique, $redirect=''){
$erreurs = array();
include_spip('inc/autoriser');
if (! autoriser("creer","article")) {
if (! autoriser("creer","sujet")) {
$erreurs['message_erreur'] = "Vous devez être connecté pour utiliser ce formulaire.";
return $erreurs;
}
@ -42,11 +42,11 @@ function formulaires_editer_sujet_charger_dist($id_article=0, $redirect=''){
return $valeurs;
}
function formulaires_editer_sujet_verifier_dist($id_article=0, $redirect=''){
function formulaires_editer_sujet_verifier_dist($id_article=0, $id_rubrique, $redirect=''){
$erreurs = array();
include_spip('inc/autoriser');
if (! autoriser("creer","article")) {
if (! autoriser("creer","sujet")) {
$erreurs['message_erreur'] = "Vous devez être connecté pour utiliser ce formulaire.";
return $erreurs;
}
@ -71,11 +71,9 @@ function formulaires_editer_sujet_verifier_dist($id_article=0, $redirect=''){
return $erreurs;
}
function formulaires_editer_sujet_traiter_dist($id_article = 0, $redirect = ''){
function formulaires_editer_sujet_traiter_dist($id_article = 0, $id_rubrique, $redirect = ''){
$new = $id_article;
$id_rubrique = lire_config('balint/id_rub_forum');
if (!intval($id_article)) {
include_spip('action/editer_article');

View file

@ -141,12 +141,14 @@ function formulaires_inscription_traiter_dist($mode = '', $id = 0) {
// 1. On cree l'auteur en BDD :
// statut = 6forum
$mode="6forum";
$nom = _request('nom_inscription');
$mail_complet = _request('mail_inscription');
$password = _request('password');
$inscrire_auteur = charger_fonction('inscrire_auteur', 'action');
$desc = $inscrire_auteur($mode, $mail_complet, $nom, array('id' => $id));
include_spip('action/editer_auteur');
if ($id_auteur = intval($desc['id_auteur'])){
// On modifie le mot de passe en utilisant les API de SPIP
@ -158,8 +160,6 @@ function formulaires_inscription_traiter_dist($mode = '', $id = 0) {
auteur_modifier($id_auteur, $set);
}
// 2. On connecte l'auteur
// appeler auth_identifier_login qui va :

View file

@ -1,4 +1,4 @@
<a href="[(#URL_PAGE{espace_membre}|parametre_url{forum,oui})]"><i class="fas fa-arrow-circle-left"></i> Retour</a>
<a href="[(#URL_PAGE{#ENV{type-page}}|parametre_url{id_forum,#ENV{id_forum}})]"><i class="fas fa-arrow-circle-left"></i> Retour</a>
<BOUCLE_sujet(ARTICLES){id_article=#ENV{id_article}}>
<div id="sujet-forum" class="sujet-forum">

View file

@ -1,4 +1,6 @@
<a class="btn btn_supprimer" href="[(#URL_ACTION_AUTEUR{supprimer_sujet,#ENV{id_article}})]"
[(#AUTORISER{supprimer, sujet, #ENV{id_article}}|oui)
<a class="btn btn_supprimer" href="[(#URL_ACTION_AUTEUR{supprimer_sujet,#ENV{id_article},[(#URL_PAGE{#ENV{type-page}}|parametre_url{forum,oui})]})]"
onclick="if (!confirm('Etes vous certain de vouloir effacer ce sujet ?')) return false;">
<i class="fas fa-trash"></i> Supprimer
</a>
]

View file

@ -11,11 +11,11 @@
<INCLURE{fond=inclure/menu-espace_membre,env}>
<?php if (isset($GLOBALS['visiteur_session']['statut']) AND $GLOBALS['visiteur_session']['statut'] == '0minirezo') { ?>
[(#ENV{forum}|=={oui}|non)
[(#ENV{id_forum}|non)
<INCLURE{fond=inclure/bouton_ordre,env,ordre=#GET{ordre,DESC},objet=mot}>
]
<?php } ?>
[(#ENV{forum}|=={oui}|oui)
[(#ENV{id_forum}|oui)
[(#ENV{id_article}|oui)
<INCLURE{fond=inclure/article-forum,env}/>
]
@ -27,7 +27,7 @@
<B_articles>
<div class="row liste-articles">
#ANCRE_PAGINATION
<BOUCLE_articles(ARTICLES){id_mot=#ENV{id_mot}}{par rang}{inverse #GET{tri}}{par date}{inverse #GET{tri}}{pagination 8}{si #ENV{forum}|!={oui}}>
<BOUCLE_articles(ARTICLES){id_mot=#ENV{id_mot}}{par rang}{inverse #GET{tri}}{par date}{inverse #GET{tri}}{pagination 8}{si #ENV{id_forum}|non}>
<div class="col-lg-3 mt-4 mt-lg-3">
<INCLURE{fond=inclure/bloc_article, env, id_article}/>
</div>
@ -36,7 +36,7 @@
[<div class="pagination">(#PAGINATION{page_precedent_suivant})</div>]
</B_articles>
<div>
[(#ENV{forum}|=={oui}|non)
[(#ENV{id_forum}|non)
Il n'y a aucun article à afficher dans cette section pour l'instant.
]
</div>

View file

@ -1,6 +1,6 @@
<h2>Forum</h2>
<BOUCLE_intro(ARTICLES){grigri=forum_#ENV{id_forum}}{si #ENV{id_article}|non}>
<h2 class="#EDIT{titre}">#TITRE</h2>
<BOUCLE_intro(ARTICLES){grigri=forum}{si #ENV{id_article}|non}>
<div class="cadre-gris #EDIT{texte}">
[(#TEXTE|textebrut)]
</div>
@ -8,12 +8,12 @@
[(#ENV{id_article}|non)
<div class="boutons">
<a class="btn btn_editer" href="#URL_PAGE{editer_sujet}"><i class="fas fa-edit"></i> Démarrer une nouvelle discussion</a>
<a class="btn btn_editer" href="[(#URL_PAGE{editer_sujet}|parametre_url{id_forum,#ENV{id_forum}}|parametre_url{url,#ENV{type-page}})]"><i class="fas fa-edit"></i> Démarrer une nouvelle discussion</a>
</div>
<INCLURE{fond=inclure/sujets-forum, env}>
<INCLURE{fond=inclure/sujets-forum,env,url=#ENV{type-page}}>
]
[(#ENV{id_article}|oui)
<INCLURE{page=article-forum, env}>
<INCLURE{fond=inclure/article-forum,env,url=#ENV{type-page}}>
]

View file

@ -5,8 +5,11 @@
</button>
<div class="collapse navbar-collapse" id="liste-groupes">
<ul class="navbar-nav">
<li class="nav-item [(#ENV{forum}|=={oui}|oui) active]">
<a class="nav-link ajax nocache" href="[(#URL_PAGE{espace_membre}|parametre_url{forum,oui})]">Forum</a>
<li class="nav-item [(#ENV{id_forum}|=={#CONFIG{balint/id_rub_forum}}|oui) active]">
<a class="nav-link ajax nocache" href="[(#URL_PAGE{espace_membre}|parametre_url{id_forum,#CONFIG{balint/id_rub_forum}})]">Forum</a>
</li>
<li class="nav-item [(#ENV{id_forum}|=={#CONFIG{balint/id_rub_forum_prive}}|oui) active]">
<a class="nav-link ajax nocache" href="[(#URL_PAGE{espace_membre}||parametre_url{id_forum,#CONFIG{balint/id_rub_forum_prive}})]">Échanges privés</a>
</li>
<BOUCLE_menu_membre(MOTS){id_groupe = #CONFIG{balint/id_mots_espace_membre}}{par id_mot}{tout}>
<li class="nav-item [(#ENV{id_mot}|=={#ID_MOT}|oui) active]">

View file

@ -35,15 +35,23 @@
<a class="nav-link" href="[(#URL_PAGE{association})]">L'association</a>
</li>
<?php
if (isset($GLOBALS['visiteur_session']['id_auteur']) AND $GLOBALS['visiteur_session']['id_auteur']) {
if (isset($GLOBALS['visiteur_session']['statut']) AND $GLOBALS['visiteur_session']['statut']=="6forum") {
?>
<li class="nav-item [(#SI_PAGE{forum_discussion}|oui) active]">
<a class="nav-link" href="[(#URL_PAGE{forum_discussion})]">Forum</a>
</li>
<?php
}
if (isset($GLOBALS['visiteur_session']['statut']) AND in_array($GLOBALS['visiteur_session']['statut'],['0minirezo','1comite'])) {
?>
<li class="nav-item dropdown [(#SI_PAGE{espace_membre}|oui) active]">
<a class="nav-link dropdown-toggle" href="[(#URL_PAGE{espace_membre})]" id="membresDropdown" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">Espace membre</a>
<div class="dropdown-menu" aria-labelledby="membresDropdown">
<a class="dropdown-item" href="[(#URL_PAGE{espace_membre}|parametre_url{forum,oui})]">Forum</a>
<a class="dropdown-item" href="[(#URL_PAGE{espace_membre}|parametre_url{id_forum,#CONFIG{balint/id_rub_forum}})]">Forum</a>
<BOUCLE_menu_prive(MOTS){id_groupe=#CONFIG{balint/id_mots_espace_membre}}{par id_mot}{tout}>
<a class="dropdown-item" href="[(#URL_PAGE{espace_membre}|parametre_url{id_mot,#ID_MOT})]">#TITRE</a>
</BOUCLE_menu_prive>
<a class="dropdown-item" href="[(#URL_PAGE{espace_membre}|parametre_url{id_forum,#CONFIG{balint/id_rub_forum_prive}})]">Échanges privés</a>
</div>
</li>
<?php } ?>

View file

@ -1,20 +1,20 @@
<B_sujets>
#ANCRE_PAGINATION
<BOUCLE_sujets(ARTICLES){id_secteur=#CONFIG{balint/id_rub_forum}}{!par date}{pagination 10}>
<BOUCLE_sujets(ARTICLES){id_secteur=#ENV{id_forum}}{!par date}{pagination 10}>
<div class="sujet-forum row">
<div class="col-1">
<div class="col-3 col-xl-1">
<BOUCLE_auteur(AUTEURS){id_article}{0,1}>
<INCLURE{fond=inclure/avatar_auteur,env,id_auteur=#ID_AUTEUR,taille=mini}>
</BOUCLE_auteur>
</div>
<div class="col-11">
<a class="titre-sujet ajax nocache" href="[(#URL_PAGE{espace_membre}|parametre_url{id_article,#ID_ARTICLE}|parametre_url{forum,oui}|ancre_url{sujet-forum})]">#TITRE</a>
<div class="col-9 col-xl-11">
<a class="titre-sujet ajax nocache" href="[(#URL_PAGE{#ENV{url}}|parametre_url{id_article,#ID_ARTICLE}|parametre_url{id_forum,#ENV{id_forum}}|ancre_url{sujet-forum})]">#TITRE</a>
[<div class="resume-sujet">(#TEXTE|couper{150, '...'})</div>]
<div class="infos-sujet mt-2">Démarré par #LESAUTEURS [(#DATE|date_relative)]</div>
<BOUCLE_reponse(FORUMS){id_article}{! par date}{0,1}>
<div class="infos-sujet font-italic">[(#TOTAL_BOUCLE|singulier_ou_pluriel{balint:1_reponse, balint:n_reponses})] | Dernier message de #AUTEUR [(#DATE_HEURE|date_relative)]</div>
</BOUCLE_reponse>
<a class="d-block mt-2 ajax nocache" href="[(#URL_PAGE{espace_membre,id_article=#ID_ARTICLE}|parametre_url{forum,oui}|ancre_url{sujet-forum})]"><i class="fas fa-edit"></i> Participer à la discussion</a>
<a class="d-block mt-2 ajax nocache" href="[(#URL_PAGE{#ENV{url}}|parametre_url{id_article,#ID_ARTICLE}|parametre_url{id_forum,#ENV{id_forum}}|ancre_url{sujet-forum})]"><i class="fas fa-edit"></i> Participer à la discussion</a>
</div>
</div>

View file

@ -12,6 +12,6 @@
<:form_forum_bonjour{nom=#ENV{nom}}:>
Vous êtes enregistré sur le site #URL_SITE_SPIP.
Vous pouvez vous y connecter avec votre mot de passe, ou en demandant à redéfinir votre mot de passe.
Vous pouvez vous y connecter avec votre mot de passe, ou en demandant à redéfinir votre mot de passe sur la page de connexion.
#FILTRE{supprimer_tags|filtrer_entites|trim}