Mise en place du forum

This commit is contained in:
Pierre 2020-02-11 03:09:19 +01:00
parent e437443703
commit 993644e527
21 changed files with 526 additions and 28 deletions

View file

@ -0,0 +1,88 @@
<section class="section-top section-bottom container">
<?php
if (isset($GLOBALS['visiteur_session']['id_auteur']) AND $GLOBALS['visiteur_session']['id_auteur']) {
?>
<div class="colonne-blanche">
<h1>Forum</h1>
<BOUCLE_sujet(ARTICLES){id_article=#ENV{id_article}}>
<div class="sujet-forum #EDIT{texte}">
<h2>#TITRE</h2>
[(#TEXTE|textebrut)]
<B_docs>
<div class="row mt-3 mb-3">
<BOUCLE_docs(DOCUMENTS){id_article}{extension==jpg|png|gif|pdf}>
<div class="col-2 text-center">
<a href="#FICHIER">
[(#EXTENSION|=={pdf}|?{
[(#CHEMIN{img/document.png}|balise_img{#TITRE}|image_reduire{0,75})],
[(#FICHIER|balise_img{#TITRE}|image_reduire{0,75})]
})]
[<div class="titre_img #EDIT{titre}">(#TITRE)</div>]
</a>
</div>
</BOUCLE_docs>
</div>
</B_docs>
<div class="infos-sujet mt-2">Démarré par #LESAUTEURS [(#DATE|date_relative)]</div>
</div>
<BOUCLE_reponses(FORUMS){id_article}>
<div class="sujet-forum row">
<div class="col-1">
<INCLURE{fond=inclure/avatar_auteur,env,id_auteur=#ID_AUTEUR,taille=mini}>
</div>
<div class="col-11">
<a class="titre-sujet" href="[(#URL_PAGE{auteur}|parametre_url{id_auteur,#ID_AUTEUR})]">#AUTEUR</a>
<div class="texte-reponse">#TEXTE</div>
<div class="infos-sujet">[(#DATE|date_relative)]</div>
<B_docs2>
<div class="row mt-2">
<BOUCLE_docs2(DOCUMENTS){id_forum}{extension==jpg|png|gif|pdf}>
<div class="col">
<a href="#FICHIER">
[(#EXTENSION|=={pdf}|?{
[(#CHEMIN{img/document.png}|balise_img{#TITRE}|image_reduire{0,75})],
[(#FICHIER|balise_img{#TITRE}|image_reduire{0,75})]
})]
[<div class="titre_img #EDIT{titre}">(#TITRE)</div>]
</a>
</div>
</BOUCLE_docs2>
</div>
</B_docs2>
</div>
</div>
</BOUCLE_reponses>
</BOUCLE_sujet>
</div>
<div class="cadre-gris">
<div class="h2">Répondre</div>
#FORMULAIRE_FORUM
</div>
<?php
}
else {
?>
<div class="row mt-4">
<div class="se_connecter bloc_connexion col-lg-5">
[(#FORMULAIRE_LOGIN{#SELF})]
</div>
<div class="ou col-lg-2 text-center"><h2>ou</h2></div>
<div class="creer_associer_compte bloc_connexion col-lg-5">
[(#FORMULAIRE_INSCRIPTION)]
</div>
</div>
<?php
}
?>
</section>

View file

@ -0,0 +1,4 @@
<composition>
<nom>Article-Sujet du forum</nom>
<description>Affichage des sujets du forum</description>
</composition>

40
content/editer_sujet.html Normal file
View file

@ -0,0 +1,40 @@
<section class="section-top section-bottom">
<div class="container">
[(#ENV{id_article}|?{
<h1>Éditer un sujet</h1>
,
<h1>Rédiger un sujet</h1>
})]
[(#SESSION{id_auteur}|oui)
[(#ENV{id_article}|oui)
[(#AUTORISER{modifier, article, #ENV{id_article}}|?{
<div class="ajax">
[(#FORMULAIRE_EDITER_SUJET{#ENV{id_article},#URL_PAGE{forum}})]<br>
</div>
,
<div class="reponse_formulaire reponse_formulaire_erreur">Votre compte ne fait pas partie des auteurs autorisés à modifier cet article.</div>
})]
]
[(#ENV{id_article}|non)
<div class="ajax">
[(#FORMULAIRE_EDITER_SUJET{0,#URL_PAGE{forum}})]
</div>
]
]
[(#SESSION{id_auteur}|non)
<div class="row mt-4">
<div class="se_connecter bloc_connexion col-lg-5">
[(#FORMULAIRE_LOGIN{#SELF})]
</div>
<div class="ou col-lg-2 text-center"><h2>ou</h2></div>
<div class="creer_associer_compte bloc_connexion col-lg-5">
[(#FORMULAIRE_INSCRIPTION)]
</div>
</div>
]
</div>
</section>

48
content/forum.html Normal file
View file

@ -0,0 +1,48 @@
<section class="section-top section-bottom container">
<div class="colonne-blanche">
<h1>Forum</h1>
<?php
if (isset($GLOBALS['visiteur_session']['id_auteur']) AND $GLOBALS['visiteur_session']['id_auteur']) {
?>
<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
}
else {
?>
<div class="row mt-4">
<div class="se_connecter bloc_connexion col-lg-5">
[(#FORMULAIRE_LOGIN{#SELF})]
</div>
<div class="ou col-lg-2 text-center"><h2>ou</h2></div>
<div class="creer_associer_compte bloc_connexion col-lg-5">
[(#FORMULAIRE_INSCRIPTION)]
</div>
</div>
<?php
}
?>
</div>
</section>

View file

@ -1,3 +1,4 @@
<section class="section-top section-bottom">
<div class="container">
<h1>Modifier mon profil</h1>
<B_modifier_auteur>
@ -16,3 +17,4 @@
<div class="attention">Vous devez être connecté pour accéder à cette page.</div>
<//B_modifier_auteur>
</div>
</section>

View file

@ -0,0 +1,12 @@
<BOUCLE_rub(RUBRIQUES){id_rubrique}>
<div class="rub_en-tete">
[<img src="(#LOGO_RUBRIQUE|image_recadre{1200:350,-,focus}|image_reduire{1200,350}|extraire_attribut{src})" alt="[(#TITRE|attribut_html)]">]
<div class="rub_en-tete_titre">
<h1 class="">#TITRE</h1>
<em class="h3-like">#TEXTE</em>
</div>
</div>
<INCLURE{fond=inclure/choix_articles,env,ajax=choix_articles,id_rubrique=#ID_RUBRIQUE}>
</BOUCLE_rub>
<h1 class="">Liste des articles</h1>
<//B_rub>

View file

@ -0,0 +1,5 @@
<composition>
<nom>Article-Sujet du forum</nom>
<description>Affichage des sujets du forum</description>
<branche type="article" composition="forum" />
</composition>

View file

@ -84,13 +84,25 @@ body{
}
.section-top{
padding-top: 10rem;
padding-top: 8rem;
}
.section-bottom{
padding-bottom: 3rem;
}
.colonne-blanche{
padding: 1.5rem;
background: white;
border-radius: 0.5rem;
}
.cadre-gris{
padding: 1.5rem;
background: $gris-clair;
border-radius: 0.5rem;
}
/**********************************************************************/
/************************* HEADER ******************************/
@ -529,7 +541,7 @@ body{
background: rgb(214, 72, 72)
}
}
.submit {
.submit, .btn_editer {
background-color: #4f56cd;
color: $light;
&:hover{
@ -537,12 +549,13 @@ body{
cursor: pointer;
}
}
.btn_editer{
margin-left: 0;
}
}
.formulaire_spip{
background: $fond-formulaires;
border-radius: 0.5rem;
fieldset legend{
background: none;
}
@ -633,6 +646,7 @@ body{
border: solid 1px #BBB;
padding: 1.5rem;
background-color:#FCFCFC;
border-radius: 0.5rem;
&> div{
margin-bottom: 1.2rem;
}
@ -670,6 +684,25 @@ body{
align-items: center;
}
/**********************************************************************/
/****************************** FORUM *********************************/
/**********************************************************************/
.sujet-forum{
padding: 1rem 0;
background: $fond-transparent;
&:not(:last-of-type){
border-bottom: solid 3px $gris-clair;
}
.spip_logo{
border-radius: 100%;
}
}
#formulaire_forum .saisie_texte_info{
display: none;
}
/**********************************************************************/
/****************************** spip_admin ****************************/
/**********************************************************************/

View file

@ -11960,13 +11960,25 @@ body {
}
.section-top {
padding-top: 10rem;
padding-top: 8rem;
}
.section-bottom {
padding-bottom: 3rem;
}
.colonne-blanche {
padding: 1.5rem;
background: white;
border-radius: 0.5rem;
}
.cadre-gris {
padding: 1.5rem;
background: #f2f2f2;
border-radius: 0.5rem;
}
/**********************************************************************/
/************************* HEADER ******************************/
/**********************************************************************/
@ -12481,19 +12493,18 @@ body {
background: #d64848;
}
.formulaire_spip .boutons .submit, .boutons .submit {
.formulaire_spip .boutons .submit, .formulaire_spip .boutons .btn_editer, .boutons .submit, .boutons .btn_editer {
background-color: #4f56cd;
color: #f8f9fa;
}
.formulaire_spip .boutons .submit:hover, .boutons .submit:hover {
.formulaire_spip .boutons .submit:hover, .formulaire_spip .boutons .btn_editer:hover, .boutons .submit:hover, .boutons .btn_editer:hover {
background-color: #7276ee;
cursor: pointer;
}
.formulaire_spip {
background: rgba(255, 255, 255, 0.8);
border-radius: 0.5rem;
.formulaire_spip .boutons .btn_editer, .boutons .btn_editer {
margin-left: 0;
}
.formulaire_spip fieldset legend {
@ -12618,6 +12629,7 @@ body {
border: solid 1px #BBB;
padding: 1.5rem;
background-color: #FCFCFC;
border-radius: 0.5rem;
}
.container fieldset > div {
@ -12657,6 +12669,26 @@ body {
align-items: center;
}
/**********************************************************************/
/****************************** FORUM *********************************/
/**********************************************************************/
.sujet-forum {
padding: 1rem 0;
background: rgba(255, 255, 255, 0.92);
}
.sujet-forum:not(:last-of-type) {
border-bottom: solid 3px #f2f2f2;
}
.sujet-forum .spip_logo {
border-radius: 100%;
}
#formulaire_forum .saisie_texte_info {
display: none;
}
/**********************************************************************/
/****************************** spip_admin ****************************/
/**********************************************************************/

View file

@ -42,6 +42,7 @@
<fieldset>
#SET{name1,id_rub_articles}
#SET{name2,id_rub_groupes}
#SET{name3,id_rub_forum}
#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name1}}|table_valeur{#GET{name2}}}
#SET{obli,"obligatoire"}
<legend>Configuration de l'arborescence</legend>
@ -55,6 +56,11 @@
[<span class="erreur_message">(#GET{erreurs})</span>]
<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>
[<span class="erreur_message">(#GET{erreurs})</span>]
<input type="text" name="#GET{name3}" id="#GET{name3}" value="#ENV{#GET{name3}}">
</div>
</fieldset>
<fieldset>

View file

@ -30,7 +30,7 @@
<fieldset >
<legend><i class="fas fa-image"></i> Avatar</legend>
<INCLURE{fond=inclure/avatar_auteur,env,ajax=avatar}>
<INCLURE{fond=inclure/avatar_auteur,env,ajax=avatar,taille=normal}>
<div class="ajax">
<INCLURE{fond=inclure/bigform,env,accept="image/*",multiple=non}>
</div>

View file

@ -0,0 +1,54 @@
<link rel="stylesheet" href="[(#CHEMIN{css/tag_editor.css}|compacte|timestamp)]">
<div class="formulaire_spip formulaire_#FORM ajax">
<form name="formulaire_#FORM" action="#ENV{action}" method="post" enctype="multipart/form-data">
#ACTION_FORMULAIRE{#ENV{action}}
[<p class="reponse_formulaire reponse_formulaire_erreur">(#ENV*{message_erreur})</p>]
[<p class="reponse_formulaire reponse_formulaire_ok">(#ENV*{message_ok})</p>]
<div class="row">
<div class="col-lg-9">
<fieldset>
<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}">
</div>
<div class="texte">
<label for="texte">Texte</label>
<textarea class="text" type="text" name="texte">#ENV{texte}</textarea>
</div>
</fieldset>
<fieldset class="upload_vignette">
<legend><i class="fas fa-paperclip"></i> Pièces jointes</legend>
<div class="ajax">
<INCLURE{fond=inclure/bigform,env}>
</div>
<INCLURE{fond=inclure/editer_docs_article,env,id_article=#ENV{id_article},ajax=les_photos}>
</fieldset>
</div>
<div class="col-lg-3 formulaire-col-droite">
<div class="boutons text-center">
<button type="submit" class="submit btn">
<i class="fas fa-save"></i> Enregistrer</a>
</button>
</div>
[(#ENV{id_article}|>{0}|oui)
[(#INCLURE{fond=inclure/bouton_supprimer,id_article=#ENV{id_article}})]
]
</div>
</div>
</form>
</div>
<script src="[(#CHEMIN{js/caret.min.js}|timestamp)]" type="text/javascript"></script>
<script src="[(#CHEMIN{js/editer_article.js}|compacte|timestamp)]" type="text/javascript"></script>

View file

@ -0,0 +1,134 @@
<?php
if (!defined('_ECRIRE_INC_VERSION')) return;
function formulaires_editer_sujet_charger_dist($id_article=0, $redirect=''){
$erreurs = array();
include_spip('inc/autoriser');
if (! autoriser("creer","article")) {
$erreurs['message_erreur'] = "Vous devez être connecté pour utiliser ce formulaire.";
return $erreurs;
}
// Pour récupérer les champs renseignés en cas d'erreur
$titre = _request('titre');
$texte = _request('texte');
$valeurs = array();
$valeurs['titre'] = $titre;
$valeurs['texte'] = $texte;
if (intval($id_article)) {
if (! autoriser("modifier","article", $id_article)) {
$erreurs['message_erreur'] = "Vous n'êtes pas autorisé à modifier cet article.";
return $erreurs;
}
$valeurs = sql_fetsel('*', 'spip_articles', 'id_article='.intval($id_article));
$where = array(
'id_objet='.intval($id_article),
'objet="article"',
);
$res = sql_allfetsel('id_auteur','spip_auteurs_liens',$where);
$valeurs['T_id_auteurs'] = array_column($res,'id_auteur');
}
else {
$valeurs['T_id_auteurs'] = array();
$valeurs['id_article'] = -1 * intval(session_get('id_auteur'));
}
$valeurs['_bigup_rechercher_fichiers'] = true;
return $valeurs;
}
function formulaires_editer_sujet_verifier_dist($id_article=0, $redirect=''){
$erreurs = array();
include_spip('inc/autoriser');
if (! autoriser("creer","article")) {
$erreurs['message_erreur'] = "Vous devez être connecté pour utiliser ce formulaire.";
return $erreurs;
}
if (intval($id_article)) {
if (! autoriser("modifier","article", $id_article)) {
$erreurs['message_erreur'] = "Vous n'êtes pas autorisé à modifier cet article.";
return $erreurs;
}
}
// il faut au minimum titre et un texte pour créer un article
if (_request('titre') == '' OR _request('texte') == ''){
$erreurs['message_erreur'] = "Il faut obligatoirement un titre et un texte pour créer un article.";
return $erreurs;
}
$bigform = charger_fonction('bigform_verifier','inc');
$options = ['mime' => 'tout_mime','taille_max'=>'5000','largeur_max'=>'2048','hauteur_max'=>'2048'];
$bigform($options,$erreurs);
return $erreurs;
}
function formulaires_editer_sujet_traiter_dist($id_article = 0, $redirect = ''){
$new = $id_article;
$id_rubrique = lire_config('balint/id_rub_forum');
if (!intval($id_article)) {
include_spip('action/editer_article');
$set = array(
'statut' => 'publie'
);
$id_article = article_inserer($id_rubrique,$set);
}
// enregistrement de l'image
if (!intval($new)) {
$where = array(
'objet="article"',
'id_objet='.intval(session_get('id_auteur')) * -1
);
sql_updateq('spip_documents_liens',array('id_objet' => intval($id_article)), $where);
}
// maj de l'article
$set = array(
'titre' => _request('titre'),
'texte' => _request('texte')
);
sql_updateq('spip_articles',$set,'id_article='.intval($id_article));
// maj association article -> auteurs
include_spip('action/editer_liens');
$where = array(
'id_objet='.intval($id_article),
'objet="article"',
);
$ids_auteurs = sql_allfetsel('id_auteur', 'spip_auteurs_liens', $where);
$ids_auteurs = array_column($ids_auteurs, 'id_auteur');
$Tauteurs = _request('Tauteurs');
if (count($Tauteurs)) {
$associer = array_diff($Tauteurs, $ids_auteurs);
$dissocier = array_diff($ids_auteurs, $Tauteurs);
objet_associer( array('auteur' => $associer),array('article' => intval($id_article) ));
objet_dissocier( array('auteur' => $dissocier) , array('article' =>intval($id_article) ));
}
include_spip('inc/invalideur');
suivre_invalideur("id='id_article/1'");
$retour = array();
$retour['message_ok'] = "Le sujet a bien été créé.";
$retour['redirect'] = $redirect;
$bigform = charger_fonction('bigform_traiter','inc');
$bigform($id_article, 'article');
return $retour;
}

View file

@ -18,7 +18,6 @@
#ACTION_FORMULAIRE{#ENV{action}}
<fieldset>
<legend><i class="fas fa-sign-in"></i> Se connecter</legend>
[<span id="spip_logo_auteur">(#ENV*{_logo,''})</span>]
<div class="editer-groupe">
<div class="editer editer_login obligatoire[(#ENV**{erreurs}|table_valeur{var_login}|oui)erreur]">
<label for="var_login"><:entree_adresse_email:></label>[

BIN
img/image.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

BIN
img/profile.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

View file

@ -1,6 +1,17 @@
[(#REM)Affichage du logo (dernière image uploadée) d'un auteur]
<BOUCLE_logo(DOCUMENTS){id_auteur=#ENV{id_auteur}}{extension==jpg|png|gif}{!par date}{0,1}>
[(#FICHIER|image_recadre{200:200,-,focus}|image_reduire{200,200})]
<BOUCLE_taille_normal(CONDITION){si #ENV{taille}|=={normal}}>
<BOUCLE_logo(AUTEURS){id_auteur=#ENV{id_auteur}}>
[(#LOGO_AUTEUR|image_recadre{200:200,-,focus}|image_reduire{200,200})]
</BOUCLE_logo>
[(#LOGO_SITE_SPIP|image_recadre{200:200,-,focus}|image_reduire{200,200})]
[(#CHEMIN{img/profile.png}|balise_img{avatar}image_recadre{200:200,+,center}|image_reduire{200,200})]
<//B_logo>
</BOUCLE_taille_normal>
<BOUCLE_taille_mini(CONDITION){si #ENV{taille}|=={mini}}>
<BOUCLE_logo_mini(AUTEURS){id_auteur=#ENV{id_auteur}}>
[(#LOGO_AUTEUR|image_recadre{100:100,-,focus}|image_reduire{100,100})]
</BOUCLE_logo_mini>
[(#CHEMIN{img/profile.png}|balise_img{avatar}image_recadre{100:100,+,center}|image_reduire{100,100})]
<//B_logo_mini>
</BOUCLE_taille_mini>

View file

@ -21,9 +21,13 @@
<li class="nav-item [(#SI_PAGE{mediatheque}|oui) active]">
<a class="nav-link" href="[(#URL_PAGE{mediatheque})]">Médiathèque</a>
</li>
<?php
if (isset($GLOBALS['visiteur_session']['id_auteur']) AND $GLOBALS['visiteur_session']['id_auteur']) {
?>
<li class="nav-item [(#SI_PAGE{forum}|oui) active]">
<a class="nav-link" href="[(#URL_PAGE{forum})]">Forum</a>
</li>
<?php } ?>
</ul>
</div>
</nav>

23
inclure/sujets-forum.html Normal file
View file

@ -0,0 +1,23 @@
<B_sujets>
#ANCRE_PAGINATION
<BOUCLE_sujets(ARTICLES){id_secteur=#CONFIG{balint/id_rub_forum}}{!par date}{pagination 10}>
<div class="sujet-forum row">
<div class="col-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" href="[(#URL_PAGE{article}|parametre_url{id_article,#ID_ARTICLE})]">#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" href="#URL_PAGE{article,id_article=#ID_ARTICLE}"><i class="fas fa-edit"></i> Participer à la discussion</a>
</div>
</div>
</BOUCLE_sujets>
[<div class="pagination">(#PAGINATION{page_precedent_suivant})</div>]
</B_sujets>

View file

@ -11,18 +11,22 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
'1_article' => '1 article',
'n_articles' => '@nb@ articles',
// F
'champslibres_titre' => 'squelette champslibres',
//G
'1_groupe' => '1 groupe',
'n_groupes' => '@nb@ groupes',
// C
'cfg_exemple' => 'Exemple',
'cfg_exemple_explication' => 'Explication de cet exemple',
'cfg_titre_parametrages' => 'Paramétrages',
// F
'champslibres_titre' => 'squelette champslibres',
'forum_texte|typo' => 'rien',
//G
'1_groupe' => '1 groupe',
'n_groupes' => '@nb@ groupes',
// R
'1_reponse' => '1 réponse',
'n_reponses' => '@nb@ réponses',
// T
'titre_page_configurer_champslibres' => 'Champs Libres',
);

View file

@ -21,12 +21,11 @@
<necessite nom="chosen" compatibilite="[1.7.0;]" />
<necessite nom="cextras" compatibilite="[3.11.0;]" />
<necessite nom="iextras" compatibilite="[3.5.0;]" />
<necessite nom="nuage" compatibilite="[4.0.0;]" />
<necessite nom="gamudebase" compatibilite="[1.0.0;]" />
<necessite nom="gis" compatibilite="[1.0.0;]" />
<necessite nom="rang" compatibilite="[1.0.0;]" />
<necessite nom="seo" compatibilite="[2.0.0;]" />
<necessite nom="suivant_precedent" compatibilite="[1.4.4;]" />
<necessite nom="bigform" compatibilite="[1.0.5;]" />
<necessite nom="compositions" compatibilite="[3.8.0;]" />
<necessite nom="comments" compatibilite="[3.5.0;]" />
<pipeline nom="declarer_champs_extras" inclure="base/balint.php" />
<pipeline nom="declarer_tables_principales" inclure="base/balint.php" />