Forum. C'était beaucoup plus simple à faire que je ne le craignais.
Mais l'API reste très lourde (voir le TODO).
This commit is contained in:
parent
5b858a027b
commit
921beb8e27
29
__cms__/TODO
29
__cms__/TODO
|
@ -7,3 +7,32 @@ Mettre le css dans une page (dossier) qui s'appelle "style.css", comme ça ça d
|
|||
c'est le index.php de cette page qui le génère).
|
||||
Si on ne peut lire la propriété __prop_type, afficher un "Access Denied" au lieu de dire qu'on n'a pas pu lire la propriété.
|
||||
Ajouter une petite horloge sur nouvel_evenement.jpg et un petit calendrier sur nouvelle_periode.jpg
|
||||
Pour les "Nouveau xx", mettre un numéro pour éviter que deux personnes créent la même page mais l'éditent différemment.
|
||||
|
||||
Pour la gestion d'erreurs :
|
||||
public static function foo() {
|
||||
enter("Création d'un fou :-p .");
|
||||
if (!Permission::vérifier_truc()) { return fail("Accès interdit"); }
|
||||
$x = nofail(Stockage::créer_foo()); // Si Stockage::créer_foo() fait un fail, nous aussi.
|
||||
$y = fatal_fail(truc_machin($x)); // Si truc_machin fait un fail, on affiche une erreur et on quite.
|
||||
leave();
|
||||
}
|
||||
|
||||
|
||||
= API =
|
||||
L'API fournie aux modules est trop verbeuse et n'a pas tout à fait les bonnes abstractions. Il faudrait refactoriser tout ça un de ces
|
||||
jours. Nottemment, il faut pouvoir indiquer les éléments de la page de manière plus déclarative. Leur partie éditable et leur partie
|
||||
affichage et la modification des propriétés associées et les valeurs par défaut doivent être gérées plus ou moins automatiquement. Ex :
|
||||
|
||||
// Crée un <textarea> ou un <p>, dont la source / destination est le champ "description", et dont la valeur par défaut lors de la création
|
||||
// de la page est "Description de la page." .
|
||||
champ("description", "Description de la page.", "texte-long");
|
||||
|
||||
// Crée un bouton Appliquer, qui soumet le formulaire en cours.
|
||||
// À étudier...
|
||||
action("Appliquer", "submit");
|
||||
|
||||
// Crée un champ titre avec les trucs spéciaux du titre (renomage de la page + redirect).
|
||||
// champ-special-titre est une fonction de rappel ?
|
||||
// À étudier.
|
||||
champ("titre", "Nouvelle page", "texte-court", "champ-special-titre");
|
|
@ -33,7 +33,7 @@ class CMS {
|
|||
$ret = Modules::action($chemin, $action, $paramètres);
|
||||
|
||||
if (!Page::is_page($ret)) {
|
||||
Erreur::fatale("Le module de " . $chemin->get() . " n'a pas renvoyé une page mais à la place : " . var_export($ret, true));
|
||||
Erreur::fatale("Le module de " . htmlspecialchars($chemin->get()) . " n'a pas renvoyé une page mais à la place : <pre><code>" . htmlspecialchars(var_export($ret, true)) . "</code></pre>", true);
|
||||
} else {
|
||||
$ret->envoyer();
|
||||
}
|
||||
|
|
|
@ -73,7 +73,7 @@ class Page {
|
|||
}
|
||||
|
||||
public static function is_page($obj) {
|
||||
return get_class($obj) === __CLASS__;
|
||||
return is_object($obj) && get_class($obj) === __CLASS__;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -5,16 +5,24 @@ class ForumIndex {
|
|||
if ($action == "anuler") {
|
||||
return new Page($chemin, '', "redirect");
|
||||
} else if ($action == "nouvelle_page") {
|
||||
// TODO : faut-il demander à avoir directement le nom du nouveau sujet ?
|
||||
// TODO : quel est le propriétaire du nouveau sujet ?
|
||||
$np = Stockage::nouvelle_page($chemin, "Nouveau sujet", "forum-sujet");
|
||||
Stockage::set_prop($np, "proprietaire", Authentification::get_utilisateur());
|
||||
Stockage::set_prop($np, "titre", "Nouveau sujet");
|
||||
Stockage::set_prop($np, "dernier_numero", 0);
|
||||
return new Page($np, '', "redirect");
|
||||
} else {
|
||||
if (isset($paramètres["description"])) {
|
||||
Stockage::set_prop($chemin, "description", $paramètres["description"]);
|
||||
}
|
||||
|
||||
if (isset($paramètres["titre"])) {
|
||||
Stockage::set_prop($chemin, "titre", $paramètres["titre"]);
|
||||
}
|
||||
|
||||
if (isset($paramètres["vue"])) {
|
||||
self::vue($chemin, $paramètres["vue"]);
|
||||
return self::vue($chemin, $paramètres["vue"]);
|
||||
} else {
|
||||
self::vue($chemin);
|
||||
return self::vue($chemin);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -22,20 +30,55 @@ class ForumIndex {
|
|||
public static function vue($chemin, $vue = "normal") {
|
||||
if ($vue == "normal") {
|
||||
$ret = '';
|
||||
$ret .= "<h2>Forum</h2>";
|
||||
|
||||
if (Permissions::vérifier_permission($chemin, "set_prop", Authentification::get_utilisateur())) {
|
||||
$ret .= '<form class="forum infos" method="post" action="' . $chemin->get_url() . '">';
|
||||
$ret .= '<h2><input type="text" name="titre" value="' . Stockage::get_prop($chemin, "titre") . '" /></h2>';
|
||||
$ret .= formulaire_édition_texte_enrichi(Stockage::get_prop($chemin, "description"), "description");
|
||||
$ret .= '<p><input type="submit" value="appliquer" /></p>';
|
||||
$ret .= '</form>';
|
||||
} else {
|
||||
$ret .= '<h2>' . Stockage::get_prop($chemin, "titre") . '</h2>';
|
||||
$ret .= '<p class="forum index description affichage">' . Stockage::get_prop($chemin, "description") . '</p>';
|
||||
}
|
||||
|
||||
$ret .= '<div class="forum sujets index">';
|
||||
$ret .= '<ul>';
|
||||
|
||||
if (Permissions::vérifier_permission($chemin, "nouvelle_page", Authentification::get_utilisateur())) {
|
||||
// afficher le lien "Nouveau sujet"
|
||||
$ret .= '<li>';
|
||||
$ret .= '<div class="titre">';
|
||||
|
||||
$ret .= '<form class="galerie nouvelle_page" method="post" action="' . $chemin->get_url() . '">';
|
||||
$ret .= '<p>';
|
||||
$ret .= '<input type="hidden" name="action" value="nouvelle_page"/>';
|
||||
$ret .= '<input type="submit" value="Nouveau sujet de discussion"/>';
|
||||
$ret .= '</p>';
|
||||
$ret .= '</form>';
|
||||
|
||||
$ret .= '</div>';
|
||||
$ret .= '</li>';
|
||||
}
|
||||
$ret .= '<ul class="forum index">';
|
||||
foreach (stockage::liste_enfants($chemin) as $k) {
|
||||
$ret .= '<li><a href="' . chemin::vers_url($k) . '">' . modules::vue($k, 'miniature') . '</a></li>'; // TODO : escape l'url !
|
||||
|
||||
foreach (Stockage::liste_enfants($chemin) as $k) { // TODO : trier par numéro !
|
||||
$mini = Modules::vue($k, 'miniature');
|
||||
$ret .= '<li>';
|
||||
// TODO : mettre une ancre "#message<numéro>"
|
||||
$ret .= '<a href="' . $k->get_url() . '">'; // TODO : escape l'url !
|
||||
$ret .= '<span class="titre">';
|
||||
$ret .= $mini->titre;
|
||||
$ret .= '</span>';
|
||||
$ret .= '</a>';
|
||||
$ret .= '</li>';
|
||||
}
|
||||
|
||||
$ret .= '</ul>';
|
||||
return $ret;
|
||||
|
||||
return new Page($ret, Stockage::get_prop($chemin, "titre"));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Modules::enregister_module("ForumIndex", "forum-index", "vue");
|
||||
Modules::enregister_module("ForumIndex", "forum-index", "vue", "titre description");
|
||||
|
||||
?>
|
|
@ -1,38 +1,41 @@
|
|||
<?php
|
||||
|
||||
function action($chemin, $action, $paramètres) {
|
||||
class ForumMessage {
|
||||
public static function action($chemin, $action, $paramètres) {
|
||||
if ($action == "anuler") {
|
||||
return new Page($chemin, '', "redirect");
|
||||
} else if ($action == "supprimer") {
|
||||
Stockage::supprimer($chemin);
|
||||
Stockage::supprimer($chemin, true); // TODO ! gérer correctement le récursif
|
||||
return new Page($chemin->parent(), '', "redirect");
|
||||
} else {
|
||||
if (isset($paramètres["message"])) {
|
||||
Stockage::set_prop($chemin, "message", $paramètres["message"]);
|
||||
}
|
||||
|
||||
// TODO ... Quelles sont les interactions entre l'utilisateur et le message, dans quel ordre, ...
|
||||
if (isset($paramètres["vue"])) {
|
||||
Modules::vue($chemin->parent(), $paramètres["vue"]);
|
||||
} else {
|
||||
Modules::vue($chemin->parent());
|
||||
return new Page($chemin->parent(), '', "redirect");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function vue($chemin, $vue = "normal") {
|
||||
public static function vue($chemin, $vue = "normal") {
|
||||
if ($vue == "normal") {
|
||||
$ret = '';
|
||||
|
||||
if (Permissions::vérifier_permission($chemin, "set_prop", Authentification::get_utilisateur())) {
|
||||
$ret .= '<form class="forum message edition" enctype="multipart/form-data" method="post" action="' . $chemin->get_url() . '">';
|
||||
$ret .= formulaire_édition_texte_enrichi(Stockage::get_prop($chemin, "message"), "message");
|
||||
$ret .= '<p><input type="submit" value="appliquer" /></p>';
|
||||
$ret .= '</form>';
|
||||
} else {
|
||||
$ret .= affichage_texte_enrichi(Stockage::get_prop($chemin, "message"));
|
||||
}
|
||||
if (Permissions::vérifier_permission($chemin, "supprimer", Authentification::get_utilisateur())) {
|
||||
// peut-être afficher le bouton "Supprimer" ??? ou est-ce trop d'options ?
|
||||
}
|
||||
|
||||
// Peut-être afficher le bouton "citer" ? ou est-ce trop d'options ?
|
||||
return $ret;
|
||||
|
||||
return new Page($ret, Stockage::get_prop($chemin, "titre"));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -10,22 +10,25 @@ class ForumSujet {
|
|||
Stockage::set_prop($chemin, "dernier_numero", $numéro_message);
|
||||
$np = Stockage::nouvelle_page($chemin, "" . $numéro_message, "forum-message");
|
||||
Stockage::set_prop($np, "proprietaire", Authentification::get_utilisateur());
|
||||
Stockage::set_prop($np, "message", "");
|
||||
|
||||
return new Page($chemin, "#message" . $numéro_message, "redirect");
|
||||
} else if ($action == "supprimer") {
|
||||
Stockage::supprimer($chemin);
|
||||
Stockage::supprimer($chemin, true); // TODO ! gérer correctement le récursif
|
||||
return new Page($chemin->parent(), '', "redirect");
|
||||
} else {
|
||||
if (isset($paramètres["titre"])) {
|
||||
if (isset($paramètres["titre"]) && Stockage::prop_diff($chemin, "titre", $paramètres["titre"])) {
|
||||
Stockage::set_prop($chemin, "titre", $paramètres["titre"]);
|
||||
Stockage::renomer($chemin, $paramètres["titre"]);
|
||||
$chemin = $chemin->renomer($paramètres["titre"]);
|
||||
// TODO : peut-être new Page($chemin, '', "redirect") ?
|
||||
// TODO : transmettre le paramètre "vue"
|
||||
return new Page($chemin, '', "redirect");
|
||||
}
|
||||
|
||||
if (isset($paramètres["vue"])) {
|
||||
self::vue($chemin, $paramètres["vue"]);
|
||||
return self::vue($chemin, $paramètres["vue"]);
|
||||
} else {
|
||||
self::vue($chemin);
|
||||
return self::vue($chemin);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -33,10 +36,11 @@ class ForumSujet {
|
|||
public static function vue($chemin, $vue = "normal") {
|
||||
if ($vue == "normal") {
|
||||
$ret = '';
|
||||
|
||||
if (Permissions::vérifier_permission($chemin, "set_prop", Authentification::get_utilisateur())) {
|
||||
$ret .= '<form action="' . $chemin->get_url() . '">';
|
||||
$ret .= '<input type="text" name="titre" class="forum sujet titre edition" value="' . Stockage::get_prop($chemin, "titre") . '"/>';
|
||||
$ret .= '<input type="submit" value="renomer" />';
|
||||
$ret .= '<form class="forum sujet infos" method="post" action="' . $chemin->get_url() . '">';
|
||||
$ret .= '<h2><input type="text" name="titre" value="' . Stockage::get_prop($chemin, "titre") . '" /></h2>';
|
||||
$ret .= '<p><input type="submit" value="appliquer" /></p>';
|
||||
$ret .= '</form>';
|
||||
} else {
|
||||
$ret .= '<h2 class="forum sujet titre affichage">' . Stockage::get_prop($chemin, "titre") . '</h2>';
|
||||
|
@ -44,23 +48,31 @@ class ForumSujet {
|
|||
if (Permissions::vérifier_permission($chemin, "supprimer", Authentification::get_utilisateur())) {
|
||||
$ret .= '<form action="' . $chemin->get_url() . '">';
|
||||
$ret .= '<input type="hidden" name="action" value="supprimer"/>';
|
||||
$ret .= '<input type="submit" value="Supprimer"/>';
|
||||
$ret .= '<input type="submit" value="Supprimer le sujet"/>';
|
||||
$ret .= '</form>';
|
||||
}
|
||||
$ret .= '<ul class="forum sujet">';
|
||||
|
||||
foreach (stockage::liste_enfants($chemin) as $k) {
|
||||
$ret .= '<li>' . Modules::vue($k) . '</li>';
|
||||
$ret .= '<li>' . Modules::vue($k)->contenu . '</li>';
|
||||
}
|
||||
$ret .= '</ul>';
|
||||
|
||||
if (Permissions::vérifier_permission($chemin, "nouvelle_page", Authentification::get_utilisateur())) {
|
||||
$ret .= '<form action="' . $chemin->get_url() . '">';
|
||||
$ret .= '<li>';
|
||||
$ret .= '<form class="forum sujet nouvelle_page" method="post" action="' . $chemin->get_url() . '">';
|
||||
$ret .= '<p>';
|
||||
$ret .= '<input type="hidden" name="action" value="nouvelle_page"/>';
|
||||
$ret .= '<input type="submit" value="Nouvelle page"/>';
|
||||
$ret .= '<input type="submit" value="Nouveau message"/>';
|
||||
$ret .= '</p>';
|
||||
$ret .= '</form>';
|
||||
$ret .= '</li>';
|
||||
}
|
||||
return $ret;
|
||||
|
||||
$ret .= '</ul>';
|
||||
|
||||
return new Page($ret, Stockage::get_prop($chemin, "titre"));
|
||||
} else if ($vue == "miniature") {
|
||||
return Stockage::get_prop($chemin, "titre");
|
||||
return new Page("Sujet.", Stockage::get_prop($chemin, "titre"));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -46,7 +46,7 @@ class GalerieÉvènement {
|
|||
$ret .= '<p><input type="submit" value="appliquer" /></p>';
|
||||
$ret .= '</form>';
|
||||
} else {
|
||||
$ret .= '<h2>' . Stockage::get_prop($chemin, "titre") . '</h2>';
|
||||
$ret .= '<h2 class="galerie evenement titre affichage">' . Stockage::get_prop($chemin, "titre") . '</h2>';
|
||||
$ret .= '<p class="galerie evenement description affichage">' . Stockage::get_prop($chemin, "description") . '</p>';
|
||||
}
|
||||
|
||||
|
|
|
@ -5,7 +5,7 @@ class Erreur {
|
|||
public $message = "erreur";
|
||||
public $string = "";
|
||||
|
||||
public static function fatale($message) {
|
||||
public static function fatale($message, $html = false) {
|
||||
echo '<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
|
||||
|
@ -20,7 +20,7 @@ class Erreur {
|
|||
. htmlspecialchars(rawurlencode("Code de l'erreur : " . $message)) . '">'
|
||||
. htmlspecialchars(Config::get('courriel_admin'))
|
||||
. '</a>. Indiquez l\'erreur ci-dessous dans votre courriel.</p>
|
||||
<p><strong>' . htmlspecialchars($message) . '</strong></p>
|
||||
<p><strong>' . ($html ? $message : htmlspecialchars($message)) . '</strong></p>
|
||||
</body>
|
||||
</html>';
|
||||
//echo "\n"; debug_print_backtrace();
|
||||
|
|
|
@ -39,6 +39,7 @@ class Squelette {
|
|||
$ret .= ' <ul>' . $nl;
|
||||
$ret .= ' <li><a href="' . $racine->get_url() . '">Accueil</a></li>' . $nl;
|
||||
$ret .= ' <li><a href="' . $racine->enfant("galerie")->get_url() . '">Galerie</a></li>' . $nl;
|
||||
$ret .= ' <li><a href="' . $racine->enfant("forum")->get_url() . '">Forum</a></li>' . $nl;
|
||||
if (Permissions::vérifier_permission($racine->enfant("admin"), "set_prop", Authentification::get_utilisateur())) {
|
||||
$ret .= '<li><a href="' . $racine->enfant("admin")->get_url() . '">Administration</a></li>' . $nl;
|
||||
}
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
Un ptit message !
|
|
@ -0,0 +1 @@
|
|||
admin
|
|
@ -0,0 +1 @@
|
|||
forum-message
|
|
@ -0,0 +1 @@
|
|||
1
|
|
@ -0,0 +1 @@
|
|||
admin
|
|
@ -0,0 +1 @@
|
|||
Un sujet de discussion
|
|
@ -0,0 +1 @@
|
|||
forum-sujet
|
|
@ -0,0 +1 @@
|
|||
Bla bla bla...
|
|
@ -0,0 +1 @@
|
|||
admin
|
|
@ -0,0 +1 @@
|
|||
forum-message
|
|
@ -0,0 +1 @@
|
|||
Plop
|
|
@ -0,0 +1 @@
|
|||
admin
|
|
@ -0,0 +1 @@
|
|||
forum-message
|
|
@ -0,0 +1 @@
|
|||
Truc
|
|
@ -0,0 +1 @@
|
|||
admin
|
|
@ -0,0 +1 @@
|
|||
forum-message
|
|
@ -0,0 +1 @@
|
|||
3
|
|
@ -0,0 +1 @@
|
|||
admin
|
1
__cms__/donnees/forum/Une autre discussion/__prop__titre
Normal file
1
__cms__/donnees/forum/Une autre discussion/__prop__titre
Normal file
|
@ -0,0 +1 @@
|
|||
Une autre discussion
|
1
__cms__/donnees/forum/Une autre discussion/__prop__type
Normal file
1
__cms__/donnees/forum/Une autre discussion/__prop__type
Normal file
|
@ -0,0 +1 @@
|
|||
forum-sujet
|
1
__cms__/donnees/forum/__prop__description
Normal file
1
__cms__/donnees/forum/__prop__description
Normal file
|
@ -0,0 +1 @@
|
|||
Description du forum.
|
1
__cms__/donnees/forum/__prop__titre
Normal file
1
__cms__/donnees/forum/__prop__titre
Normal file
|
@ -0,0 +1 @@
|
|||
Forum
|
1
__cms__/donnees/forum/__prop__type
Normal file
1
__cms__/donnees/forum/__prop__type
Normal file
|
@ -0,0 +1 @@
|
|||
forum-index
|
7
forum/Nouveau sujet/1/index.php
Normal file
7
forum/Nouveau sujet/1/index.php
Normal file
|
@ -0,0 +1,7 @@
|
|||
<?php
|
||||
|
||||
require_once(dirname(__FILE__) . "/./../../../__cms__/cms.php");
|
||||
|
||||
CMS::page("/forum/Nouveau sujet/1");
|
||||
|
||||
?>
|
7
forum/Nouveau sujet/index.php
Normal file
7
forum/Nouveau sujet/index.php
Normal file
|
@ -0,0 +1,7 @@
|
|||
<?php
|
||||
|
||||
require_once(dirname(__FILE__) . "/./../../__cms__/cms.php");
|
||||
|
||||
CMS::page("/forum/Nouveau sujet");
|
||||
|
||||
?>
|
7
forum/Un sujet de discussion/index.php
Normal file
7
forum/Un sujet de discussion/index.php
Normal file
|
@ -0,0 +1,7 @@
|
|||
<?php
|
||||
|
||||
require_once(dirname(__FILE__) . "/./../../__cms__/cms.php");
|
||||
|
||||
CMS::page("/forum/Un sujet de discussion");
|
||||
|
||||
?>
|
7
forum/Une autre discussion/1/index.php
Normal file
7
forum/Une autre discussion/1/index.php
Normal file
|
@ -0,0 +1,7 @@
|
|||
<?php
|
||||
|
||||
require_once(dirname(__FILE__) . "/./../../../__cms__/cms.php");
|
||||
|
||||
CMS::page("/forum/Une autre discussion/1");
|
||||
|
||||
?>
|
7
forum/Une autre discussion/2/index.php
Normal file
7
forum/Une autre discussion/2/index.php
Normal file
|
@ -0,0 +1,7 @@
|
|||
<?php
|
||||
|
||||
require_once(dirname(__FILE__) . "/./../../../__cms__/cms.php");
|
||||
|
||||
CMS::page("/forum/Une autre discussion/2");
|
||||
|
||||
?>
|
7
forum/Une autre discussion/3/index.php
Normal file
7
forum/Une autre discussion/3/index.php
Normal file
|
@ -0,0 +1,7 @@
|
|||
<?php
|
||||
|
||||
require_once(dirname(__FILE__) . "/./../../../__cms__/cms.php");
|
||||
|
||||
CMS::page("/forum/Une autre discussion/3");
|
||||
|
||||
?>
|
7
forum/Une autre discussion/index.php
Normal file
7
forum/Une autre discussion/index.php
Normal file
|
@ -0,0 +1,7 @@
|
|||
<?php
|
||||
|
||||
require_once(dirname(__FILE__) . "/./../../__cms__/cms.php");
|
||||
|
||||
CMS::page("/forum/Une autre discussion");
|
||||
|
||||
?>
|
7
forum/index.php
Normal file
7
forum/index.php
Normal file
|
@ -0,0 +1,7 @@
|
|||
<?php
|
||||
|
||||
require_once(dirname(__FILE) . "/./../__cms__/cms.php");
|
||||
|
||||
CMS::page("/forum");
|
||||
|
||||
?>
|
|
@ -1,6 +1,6 @@
|
|||
#!/bin/sh
|
||||
|
||||
fichiers="index.php galerie admin __cms__/donnees"
|
||||
fichiers="index.php galerie forum admin __cms__/donnees"
|
||||
|
||||
chgrp -R www-data $fichiers
|
||||
chmod -R 664 $fichiers
|
||||
|
|
Loading…
Reference in New Issue
Block a user