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:
Georges Dupéron 2010-08-21 22:13:39 +02:00
parent 5b858a027b
commit 921beb8e27
41 changed files with 235 additions and 68 deletions

View File

@ -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). 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é. 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 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");

View File

@ -33,7 +33,7 @@ class CMS {
$ret = Modules::action($chemin, $action, $paramètres); $ret = Modules::action($chemin, $action, $paramètres);
if (!Page::is_page($ret)) { 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 { } else {
$ret->envoyer(); $ret->envoyer();
} }

View File

@ -73,7 +73,7 @@ class Page {
} }
public static function is_page($obj) { public static function is_page($obj) {
return get_class($obj) === __CLASS__; return is_object($obj) && get_class($obj) === __CLASS__;
} }
} }

View File

@ -5,37 +5,80 @@ class ForumIndex {
if ($action == "anuler") { if ($action == "anuler") {
return new Page($chemin, '', "redirect"); return new Page($chemin, '', "redirect");
} else if ($action == "nouvelle_page") { } 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"); $np = Stockage::nouvelle_page($chemin, "Nouveau sujet", "forum-sujet");
Stockage::set_prop($np, "proprietaire", Authentification::get_utilisateur()); 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"); return new Page($np, '', "redirect");
} else { } 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"])) { if (isset($paramètres["vue"])) {
self::vue($chemin, $paramètres["vue"]); return self::vue($chemin, $paramètres["vue"]);
} else { } else {
self::vue($chemin); return self::vue($chemin);
} }
} }
} }
public static function vue($chemin, $vue = "normal") { public static function vue($chemin, $vue = "normal") {
if ($vue == "normal") { if ($vue == "normal") {
$ret = ''; $ret = '';
$ret .= "<h2>Forum</h2>";
if (Permissions::vérifier_permission($chemin, "nouvelle_page", Authentification::get_utilisateur())) { if (Permissions::vérifier_permission($chemin, "set_prop", Authentification::get_utilisateur())) {
// afficher le lien "Nouveau sujet" $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 .= '<ul class="forum index">';
foreach (stockage::liste_enfants($chemin) as $k) { $ret .= '<div class="forum sujets index">';
$ret .= '<li><a href="' . chemin::vers_url($k) . '">' . modules::vue($k, 'miniature') . '</a></li>'; // TODO : escape l'url ! $ret .= '<ul>';
}
$ret .= '</ul>'; if (Permissions::vérifier_permission($chemin, "nouvelle_page", Authentification::get_utilisateur())) {
return $ret; $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>';
}
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 new Page($ret, Stockage::get_prop($chemin, "titre"));
} }
} }
} }
Modules::enregister_module("ForumIndex", "forum-index", "vue"); Modules::enregister_module("ForumIndex", "forum-index", "vue", "titre description");
?> ?>

View File

@ -1,38 +1,41 @@
<?php <?php
function action($chemin, $action, $paramètres) { class ForumMessage {
if ($action == "anuler") { public static function action($chemin, $action, $paramètres) {
return new Page($chemin, '', "redirect"); if ($action == "anuler") {
} else if ($action == "supprimer") { return new Page($chemin, '', "redirect");
Stockage::supprimer($chemin); } else if ($action == "supprimer") {
return new Page($chemin->parent(), '', "redirect"); Stockage::supprimer($chemin, true); // TODO ! gérer correctement le récursif
} else { return new Page($chemin->parent(), '', "redirect");
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 { } else {
Modules::vue($chemin->parent()); if (isset($paramètres["message"])) {
Stockage::set_prop($chemin, "message", $paramètres["message"]);
}
return new Page($chemin->parent(), '', "redirect");
} }
} }
}
public static function vue($chemin, $vue = "normal") {
function vue($chemin, $vue = "normal") { if ($vue == "normal") {
if ($vue == "normal") { $ret = '';
$ret = '';
if (Permissions::vérifier_permission($chemin, "set_prop", Authentification::get_utilisateur())) { if (Permissions::vérifier_permission($chemin, "set_prop", Authentification::get_utilisateur())) {
$ret .= formulaire_édition_texte_enrichi(Stockage::get_prop($chemin, "message"), "message"); $ret .= '<form class="forum message edition" enctype="multipart/form-data" method="post" action="' . $chemin->get_url() . '">';
} else { $ret .= formulaire_édition_texte_enrichi(Stockage::get_prop($chemin, "message"), "message");
$ret .= affichage_texte_enrichi(Stockage::get_prop($chemin, "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 new Page($ret, Stockage::get_prop($chemin, "titre"));
} }
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;
} }
} }

View File

@ -10,33 +10,37 @@ class ForumSujet {
Stockage::set_prop($chemin, "dernier_numero", $numéro_message); Stockage::set_prop($chemin, "dernier_numero", $numéro_message);
$np = Stockage::nouvelle_page($chemin, "" . $numéro_message, "forum-message"); $np = Stockage::nouvelle_page($chemin, "" . $numéro_message, "forum-message");
Stockage::set_prop($np, "proprietaire", Authentification::get_utilisateur()); Stockage::set_prop($np, "proprietaire", Authentification::get_utilisateur());
Stockage::set_prop($np, "message", "");
return new Page($chemin, "#message" . $numéro_message, "redirect"); return new Page($chemin, "#message" . $numéro_message, "redirect");
} else if ($action == "supprimer") { } else if ($action == "supprimer") {
Stockage::supprimer($chemin); Stockage::supprimer($chemin, true); // TODO ! gérer correctement le récursif
return new Page($chemin->parent(), '', "redirect"); return new Page($chemin->parent(), '', "redirect");
} else { } 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"]); Stockage::renomer($chemin, $paramètres["titre"]);
$chemin = $chemin->renomer($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"])) { if (isset($paramètres["vue"])) {
self::vue($chemin, $paramètres["vue"]); return self::vue($chemin, $paramètres["vue"]);
} else { } else {
self::vue($chemin); return self::vue($chemin);
} }
} }
} }
public static function vue($chemin, $vue = "normal") { public static function vue($chemin, $vue = "normal") {
if ($vue == "normal") { if ($vue == "normal") {
$ret = ''; $ret = '';
if (Permissions::vérifier_permission($chemin, "set_prop", Authentification::get_utilisateur())) { if (Permissions::vérifier_permission($chemin, "set_prop", Authentification::get_utilisateur())) {
$ret .= '<form action="' . $chemin->get_url() . '">'; $ret .= '<form class="forum sujet infos" method="post" action="' . $chemin->get_url() . '">';
$ret .= '<input type="text" name="titre" class="forum sujet titre edition" value="' . Stockage::get_prop($chemin, "titre") . '"/>'; $ret .= '<h2><input type="text" name="titre" value="' . Stockage::get_prop($chemin, "titre") . '" /></h2>';
$ret .= '<input type="submit" value="renomer" />'; $ret .= '<p><input type="submit" value="appliquer" /></p>';
$ret .= '</form>'; $ret .= '</form>';
} else { } else {
$ret .= '<h2 class="forum sujet titre affichage">' . Stockage::get_prop($chemin, "titre") . '</h2>'; $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())) { if (Permissions::vérifier_permission($chemin, "supprimer", Authentification::get_utilisateur())) {
$ret .= '<form action="' . $chemin->get_url() . '">'; $ret .= '<form action="' . $chemin->get_url() . '">';
$ret .= '<input type="hidden" name="action" value="supprimer"/>'; $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 .= '</form>';
} }
$ret .= '<ul class="forum sujet">'; $ret .= '<ul class="forum sujet">';
foreach (stockage::liste_enfants($chemin) as $k) { 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())) { 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="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 .= '</form>';
$ret .= '</li>';
} }
return $ret;
$ret .= '</ul>';
return new Page($ret, Stockage::get_prop($chemin, "titre"));
} else if ($vue == "miniature") { } else if ($vue == "miniature") {
return Stockage::get_prop($chemin, "titre"); return new Page("Sujet.", Stockage::get_prop($chemin, "titre"));
} }
} }
} }

View File

@ -46,7 +46,7 @@ class GalerieÉvènement {
$ret .= '<p><input type="submit" value="appliquer" /></p>'; $ret .= '<p><input type="submit" value="appliquer" /></p>';
$ret .= '</form>'; $ret .= '</form>';
} else { } 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>'; $ret .= '<p class="galerie evenement description affichage">' . Stockage::get_prop($chemin, "description") . '</p>';
} }

View File

@ -5,7 +5,7 @@ class Erreur {
public $message = "erreur"; public $message = "erreur";
public $string = ""; public $string = "";
public static function fatale($message) { public static function fatale($message, $html = false) {
echo '<?xml version="1.0" encoding="UTF-8"?> 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"> <!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"> <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(rawurlencode("Code de l'erreur : " . $message)) . '">'
. htmlspecialchars(Config::get('courriel_admin')) . htmlspecialchars(Config::get('courriel_admin'))
. '</a>. Indiquez l\'erreur ci-dessous dans votre courriel.</p> . '</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> </body>
</html>'; </html>';
//echo "\n"; debug_print_backtrace(); //echo "\n"; debug_print_backtrace();

View File

@ -39,6 +39,7 @@ class Squelette {
$ret .= ' <ul>' . $nl; $ret .= ' <ul>' . $nl;
$ret .= ' <li><a href="' . $racine->get_url() . '">Accueil</a></li>' . $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("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())) { 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; $ret .= '<li><a href="' . $racine->enfant("admin")->get_url() . '">Administration</a></li>' . $nl;
} }

View File

@ -0,0 +1 @@
Un ptit message !

View File

@ -0,0 +1 @@
admin

View File

@ -0,0 +1 @@
forum-message

View File

@ -0,0 +1 @@
admin

View File

@ -0,0 +1 @@
Un sujet de discussion

View File

@ -0,0 +1 @@
forum-sujet

View File

@ -0,0 +1 @@
Bla bla bla...

View File

@ -0,0 +1 @@
admin

View File

@ -0,0 +1 @@
forum-message

View File

@ -0,0 +1 @@
Plop

View File

@ -0,0 +1 @@
admin

View File

@ -0,0 +1 @@
forum-message

View File

@ -0,0 +1 @@
Truc

View File

@ -0,0 +1 @@
admin

View File

@ -0,0 +1 @@
forum-message

View File

@ -0,0 +1 @@
admin

View File

@ -0,0 +1 @@
Une autre discussion

View File

@ -0,0 +1 @@
forum-sujet

View File

@ -0,0 +1 @@
Description du forum.

View File

@ -0,0 +1 @@
Forum

View File

@ -0,0 +1 @@
forum-index

View File

@ -0,0 +1,7 @@
<?php
require_once(dirname(__FILE__) . "/./../../../__cms__/cms.php");
CMS::page("/forum/Nouveau sujet/1");
?>

View File

@ -0,0 +1,7 @@
<?php
require_once(dirname(__FILE__) . "/./../../__cms__/cms.php");
CMS::page("/forum/Nouveau sujet");
?>

View File

@ -0,0 +1,7 @@
<?php
require_once(dirname(__FILE__) . "/./../../__cms__/cms.php");
CMS::page("/forum/Un sujet de discussion");
?>

View File

@ -0,0 +1,7 @@
<?php
require_once(dirname(__FILE__) . "/./../../../__cms__/cms.php");
CMS::page("/forum/Une autre discussion/1");
?>

View File

@ -0,0 +1,7 @@
<?php
require_once(dirname(__FILE__) . "/./../../../__cms__/cms.php");
CMS::page("/forum/Une autre discussion/2");
?>

View File

@ -0,0 +1,7 @@
<?php
require_once(dirname(__FILE__) . "/./../../../__cms__/cms.php");
CMS::page("/forum/Une autre discussion/3");
?>

View 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
View File

@ -0,0 +1,7 @@
<?php
require_once(dirname(__FILE) . "/./../__cms__/cms.php");
CMS::page("/forum");
?>

View File

@ -1,6 +1,6 @@
#!/bin/sh #!/bin/sh
fichiers="index.php galerie admin __cms__/donnees" fichiers="index.php galerie forum admin __cms__/donnees"
chgrp -R www-data $fichiers chgrp -R www-data $fichiers
chmod -R 664 $fichiers chmod -R 664 $fichiers