Compare commits

...

67 Commits
main ... td

Author SHA1 Message Date
Georges Dupéron
34a694008a Modules pour le site de l'association Théodore Dubois. 2010-10-17 11:57:00 +02:00
Georges Dupéron
a36bb6ca0f module Accueil. 2010-10-17 00:12:28 +02:00
Georges Dupéron
e1cc3f3939 Merge branch 'sql' into td 2010-10-17 00:07:04 +02:00
Georges Dupéron
2f5fe4f3ae Petites modifs. 2010-10-16 23:47:58 +02:00
Georges Dupéron
de1f853520 widgets en écriture, fonctions de sérialisation (appellées lors d'un set). 2010-10-16 20:58:39 +02:00
Georges Dupéron
129dc91905 Widget en ériture pour text_line. 2010-10-16 12:28:49 +02:00
Georges Dupéron
5f84ce3848 Refactor : création de la classe Module. 2010-10-16 00:39:57 +02:00
Georges Dupéron
91206e21cb w_field détecte le type du champ et appelle le w_??? correspondant. 2010-10-15 17:03:39 +02:00
Georges Dupéron
01e73fed15 Set sur des propriétés et actions à partir de $_GET / $_POST. 2010-10-15 16:59:20 +02:00
Georges Dupéron
2f3356b156 Chargement auto de ma configuration pour free.fr si elle est là. 2010-10-15 12:43:04 +02:00
Georges Dupéron
91de3f81c9 Compatibilité free.fr : suite et fin. Pas de clôtures (fonctions anonymes), pas de __callStatic, ... :( *haine profonde* 2010-10-15 12:30:26 +02:00
Georges Dupéron
fc654bde1c Instruction de création de la BDD innutiles car elle est créée automatiquement. 2010-10-15 10:49:14 +02:00
Georges Dupéron
49932b5d29 Renomage dans les fichiers : *.php -> *.php5 (compatibilité free.fr). 2010-10-15 10:48:18 +02:00
Georges Dupéron
e2270aa4c5 *.php -> *.php5 (compatibilité free.fr). 2010-10-15 10:16:01 +02:00
Georges Dupéron
d4d827118c XSLT : XML -> XHTML5 2010-10-15 09:50:40 +02:00
Georges Dupéron
bdc1fc7016 Amélioration de l'affichage du debug. Ça soulage un peu... 2010-10-14 19:08:39 +02:00
Georges Dupéron
c0136f67ce Implémentation (partielle) de plusieurs widgets. 2010-10-14 18:27:40 +02:00
Georges Dupéron
1a23977b37 Nettoyage + TODOs. 2010-10-14 17:51:46 +02:00
Georges Dupéron
2989d15aca Conventions de nommage pour les attributs et les modules. 2010-10-14 17:50:18 +02:00
Georges Dupéron
b5842c2a85 Utilisation de l'uid_page directement dans l'url pour l'instant (pas de pseudo-redirection). 2010-10-14 16:31:55 +02:00
Georges Dupéron
3986ab9076 Création des enfants, valeurs par défaut pour les attributs globaux, dates de création / modification. 2010-10-14 11:49:05 +02:00
Georges Dupéron
fca8e1f7f1 Page->get(), set(), parent(), url(). On peut maintenant naviguer à 100% (via le code) dans les différentes pages.
Il manque juste la création des enfants...
2010-10-13 19:42:11 +02:00
Georges Dupéron
a53de8845b Condition pour Page->enfants() 2010-10-13 16:54:49 +02:00
Georges Dupéron
52a5eea2ff order, limit et offset dans Page->enfants(). 2010-10-13 13:21:35 +02:00
Georges Dupéron
0a9a9aa99f Création d'une nouvelle instance d'une sous-classe de Page en fonction de l'uid.
+ Page->enfants() marche presque.
2010-10-12 19:23:40 +02:00
Georges Dupéron
20aafcf6dc Création des tables avec la nouvelle structure + autres modifs. 2010-10-12 15:35:59 +02:00
Georges Dupéron
a277140fdf Restructuration des infos des modules. 2010-10-11 20:58:28 +02:00
Georges Dupéron
7e5281971e Convention de nommage pour les mModules, fonction module(). 2010-10-11 18:00:58 +02:00
Georges Dupéron
323bb52c61 Récupération de données dans la BDD.
Mais ça coince pour les tris. Je vais passer à une organisation avec une table par classe / type de page + une table pour les attributs communs à toutes les pages.
2010-10-11 17:08:27 +02:00
Georges Dupéron
32c1b57387 Premiers "select" dans la BDD. 2010-10-11 00:03:14 +02:00
Georges Dupéron
e4a330f5b5 Début d'implémentation d'accès à la base de données. 2010-10-10 15:22:56 +02:00
Georges Dupéron
42b220434a Attributs optionnels pour les éléments (td : colspan rowspan, span : class). 2010-10-09 23:57:05 +02:00
Georges Dupéron
ee7abc0a6e Header, footer, article et nav sont des "singletons" dans le document. 2010-10-09 23:49:59 +02:00
Georges Dupéron
70c662e164 Réduction du nombre de TODOs. 2010-10-09 20:39:51 +02:00
Georges Dupéron
f69ce46d60 Type pour les attributs (text_line, text_rich, text_no_space, date, bool, file, ...). 2010-10-09 20:18:09 +02:00
Georges Dupéron
e2093ed37a Nouveautés (squelette) 2010-10-09 17:22:47 +02:00
Georges Dupéron
4680f19279 Galerie -> Enregistrements (ne marche pas). 2010-10-09 16:56:43 +02:00
Georges Dupéron
7f8f7aadbf Page d'accueil pour le site TD. 2010-10-08 21:25:53 +02:00
Georges Dupéron
8242faeab8 Petit commit avant le week-end. 2010-10-08 14:48:02 +02:00
Georges Dupéron
fed9e432da assert(type = tr) pour les lignes "utilisateur" dans admin-utilisateur. 2010-10-06 11:28:38 +02:00
Georges Dupéron
777195e69b Corrections dans admin-utilisateurs. 2010-10-06 11:00:29 +02:00
Georges Dupéron
345a4be1ce déplacement de fichier. 2010-10-06 10:25:00 +02:00
Georges Dupéron
80666658d2 J'ai oublié de faire add sur les nouveaux fichiers dans le dernier commit. 2010-10-05 22:24:05 +02:00
Georges Dupéron
47de9ca1ea Squelette de AdminListeUtilisateurs et AdminUtilisateur. 2010-10-05 18:18:02 +02:00
Georges Dupéron
180fcbe171 Gestion widgets + paramètres widgets, fonction Page->rendu(), plein d'autres choses... 2010-10-05 17:35:58 +02:00
Georges Dupéron
a75254c8ca Implémentation quasi-complète du module Galerie. 2010-10-05 16:28:13 +02:00
Georges Dupéron
bae7ebbf9e Revert des deux commit précédents 2010-10-05 16:27:04 +02:00
Georges Dupéron
19c8de6039 Tentative (échouée) de récupérer les erreurs de PHP :( . 2010-10-05 16:23:28 +02:00
Georges Dupéron
93c5b602c9 Des trucs. 2010-10-04 23:36:41 +02:00
Georges Dupéron
4f7b2d0e8d Quelques modifs. 2010-10-04 12:32:38 +02:00
Georges Dupéron
810098df01 Quelques modifs sur galerie-index. 2010-10-04 00:36:43 +02:00
Georges Dupéron
9a7add7181 Brouillon de l'implémentation de la nouvelle structure. 2010-10-03 23:18:46 +02:00
Georges Dupéron
ca40793f22 Restauration de la version d'origine de galerie-index.php.
Je mange puis je code avec la nouvelle structure. Allez hop !
2010-10-03 13:09:27 +02:00
Georges Dupéron
ef750a3dae Déplacement des notes griffonées dans galerie-index. 2010-10-03 12:54:35 +02:00
Georges Dupéron
86c94d030d Encore des réflexions sur la nouvelle architecture. 2010-10-03 03:40:29 +02:00
Georges Dupéron
73282aa93a Encore des notes. 2010-09-27 00:10:43 +02:00
Georges Dupéron
5c4ed5ebd9 Notes sur le "langage de requêtes". 2010-09-26 19:43:17 +02:00
Georges Dupéron
d5857f1fae Notes et idées pour le refactor. 2010-09-26 00:26:20 +02:00
Georges Dupéron
cf21b871ec Horaires dans la section équipes. 2010-09-24 19:44:44 +02:00
Georges Dupéron
cc95daa8d2 Section horaires. 2010-09-22 23:37:18 +02:00
Georges Dupéron
29a850c97f Logo MCHB. 2010-09-22 23:20:44 +02:00
Georges Dupéron
bcf9c91b1d Bandeau de navigation (breadcrumbs). 2010-09-22 23:05:47 +02:00
Georges Dupéron
b2ed8db6d5 Rappatriement des changements effectués lors de la démo (et en préparation sur un autre pc). 2010-09-15 22:40:01 +02:00
Georges Dupéron
42767c181c Backslash qui traîne... 2010-09-14 21:33:27 +02:00
Georges Dupéron
ba33e6524b Gros nettoyage / débogage / etc. 2010-09-14 19:14:11 +02:00
Georges Dupéron
0db01aaf23 Suppression des fichiers qui traînenet dans "Nouveautés". 2010-09-14 18:48:04 +02:00
Georges Dupéron
d6cec82c3f Descriptions des photos. Ne pas changer l'image si le champ FILE est vide. 2010-09-14 18:47:08 +02:00
255 changed files with 3510 additions and 394 deletions

View File

@ -49,6 +49,18 @@ class Chemin {
public function get($slash_debut = true) {
return ($slash_debut ? '/' : '') . join($this->segments, '/');
}
public function hiérarchie() {
$c = new self($this->segments);
$r = new self("/");
$ret = array();
while (! $c->est_racine()) {
array_unshift($ret, $c);
$c = $c->parent();
}
array_unshift($ret, $c);
return $ret;
}
public function get_url($fin = "") {
// Config::get("url_base") DOIT se terminer par '/', tel que spécifié
@ -87,6 +99,10 @@ class Chemin {
return end($this->segments);
}
public function est_racine() {
return (count($this->segments) == 0);
}
public static function nettoyer_chemin($chemin, $est_un_motif = false) {
// SÉCURITÉ : $chemin nettoyé

View File

@ -11,8 +11,6 @@ if (get_magic_quotes_runtime()) set_magic_quotes_runtime(false);
class CMS {
public static function page($chemin_str) {
// TODO : appeller Modules::action($chemin, $action, $paramètres);
$chemin = new Chemin($chemin_str);
$module = Modules::get_module($chemin);

View File

@ -8,8 +8,10 @@ class Page {
public $sendprop_prop = "";
public $redirect_destination = "";
public $type = "page";
public $chemin = null;
public function __construct($a, $b, $type = "page") {
public function __construct($chemin, $a, $b, $type = "page") {
$this->chemin = $chemin;
if ($type == "page") {
$this->set_page($a, $b);
} else if ($type == "sendfile") {

View File

@ -3,7 +3,7 @@
class AdminApparence {
public static function action($chemin, $action, $paramètres) {
if ($action == "anuler") {
return new Page($chemin, '', "redirect");
return new Page($chemin, $chemin, '', "redirect");
} else {
if (isset($paramètres["Couleur_A"])) {
Stockage::set_prop($chemin, "Couleur_A", $paramètres["Couleur_A"]);
@ -32,6 +32,7 @@ class AdminApparence {
// on affiche la version modifiable plutôt que la "vue".
$ret = '';
if (Permissions::vérifier_permission($chemin, "set_prop", Authentification::get_utilisateur())) {
$ret .= '<p><strong>Attention :</strong> Les couleurs du site ne peuvent pas encore être modifiées...</p>';
$ret .= '<form method="post" action="' . $chemin->get_url() . '">';
$ret .= '<ul>';
$ret .= '<li><label for="Couleur_A">Couleur A : </label><input type="text" id="Couleur_A" name="Couleur_A" value="#000" /></li>';
@ -50,7 +51,7 @@ class AdminApparence {
$ret .= '<li>Couleur D : #fff</li>';
$ret .= '</ul>';
}
return new Page($ret, "Apparence");
return new Page($chemin, $ret, "Apparence");
} else if ($vue == "css") {
// TODO : où mettre ce gen_css... ?
return Site::gen_css(array(

View File

@ -27,25 +27,25 @@ class AdminConnexion {
// formulaire de connexion, formulaire + "mauvais mdp")
if ($vue == "normal") {
$ret = self::formulaire_connexion($chemin);
return new Page($ret, "Connexion");
return new Page($chemin, $ret, "Connexion");
} else if ($vue == "connexion réussie") {
$ret = "<h2>Connexion réussie</h2>";
$ret .= "<p>Pour vous déconnecter, utilisez le lien «déconnexion» en haut à droite.</p>";
$ret .= "<p><a href=\"" . Config::get("url_base") . "\">Retour à la page d'accueil</a>.</p>";
return new Page($ret, "Connexion réussie");
return new Page($chemin, $ret, "Connexion réussie");
}else if ($vue == "connexion échouée") {
$msg = "<p><strong>Mauvais mot de passe et/ou nom d'utilisateur. Ré-essayez ou retournez à la ";
$msg .= "<a href=\"" . Config::get("url_base") . "\">page d'accueil</a>";
$msg .= ".</strong></p>";
$ret = self::formulaire_connexion($chemin, "Connexion échouée", $msg);
return new Page($ret, "Connexion échouée");
return new Page($chemin, $ret, "Connexion échouée");
}else if ($vue == "déconnexion") {
$ret = "<h2>Déconnexion réussie</h2>";
$ret .= "<p>Vous êtes déconnecté. Vous pouvez à présent retourner à la ";
$ret .= "<a href=\"" . Config::get("url_base") . "\">page d'accueil</a>";
$ret .= ".</p>";
return new Page($ret, "Déconnexion réussie");
return new Page($chemin, $ret, "Déconnexion réussie");
}
}

View File

@ -24,9 +24,9 @@ class AdminIndex {
}
}
$ret .= '</ul>';
return new Page($ret, Stockage::get_prop($chemin, "nom_site"));
return new Page($chemin, $ret, Stockage::get_prop($chemin, "nom_site"));
}
return new Page('',''); // TODO : devrait renvoyer une page d'erreur !
return new Page($chemin, '',''); // TODO : devrait renvoyer une page d'erreur !
}
}

View File

@ -4,7 +4,7 @@ class AdminPermissions {
public static function action($chemin, $action, $paramètres) {
$singleton = new Chemin("/admin/permissions/");
if ($action == "anuler") {
return new Page($chemin, '', "redirect");
return new Page($chemin, $chemin, '', "redirect");
} else {
if (isset($paramètres["regles"])) {
Stockage::set_prop($singleton, "regles", $paramètres["regles"]);
@ -21,15 +21,16 @@ class AdminPermissions {
public static function vue($chemin, $vue = "normal") {
$singleton = new Chemin("/admin/permissions/");
if ($vue == "normal") {
$ret = "";
$ret .= "<h2>Règles de sécurité</h2>";
$ret .= "<p>La première règle correspondant à une action de l'utilisateur est appliquée. TODO Bla-bla blabla sur le fonctionnement.</p>";
$ret = '';
$ret .= '<h2>Règles de sécurité</h2>';
$ret .= '<p><strong>Attention ! Ne modifiez pas ces paramètres si vous ne comprennez pas <em>complètement</em> à quoi ça sert !!!</strong></p>';
$ret .= '<p>La première règle correspondant à une action de l\'utilisateur est appliquée. TODO Bla-bla blabla sur le fonctionnement.</p>';
if (Permissions::vérifier_permission($singleton, "set_prop", Authentification::get_utilisateur())) {
$ret .= '<textarea class="admin permissions regles" cols="200" rows="20">' . Stockage::get_prop($singleton, "regles") . "</textarea>"; // TODO : html escape chars etc.
} else {
$ret .= "<pre><code>" . Stockage::get_prop($singleton, "regles") . "</code></pre>"; // TODO : html escape chars etc.
}
return new Page($ret, "Permissions");
return new Page($chemin, $ret, "Permissions");
}
}
}

View File

@ -4,7 +4,7 @@ class AdminUtilisateurs {
public static function action($chemin, $action, $paramètres) {
$singleton = new Chemin("/admin/utilisateurs/");
if ($action == "anuler") {
return new Page($chemin, '', "redirect");
return new Page($chemin, $chemin, '', "redirect");
// TODO ...
// Solution A (propre) :
@ -63,7 +63,8 @@ class AdminUtilisateurs {
if (Permissions::vérifier_permission($chemin, "nouvelle_page", Authentification::get_utilisateur())) {
// afficher le lien "Nouvel utilisateur"
}
$ret .= '<table class="utilisateurs index"><thead><th>Nom</th><th>Prénom</th><th>Groupe</th><th>Mot de passe</th><th>Peut se connecter</th><th colspan="2"></th></thead><tbody>';
$ret .= '<p><strong>Attention :</strong> On ne peut pas encore ajouter des utilisateurs au site...</p>';
$ret .= '<table class="admin utilisateurs liste"><thead><th>Nom</th><th>Prénom</th><th>Groupe</th><th colspan="2">Mot de passe</th><th>Peut se connecter</th><th colspan="2"></th></thead><tbody>';
$listegroupes = ""; // Construire la liste des groupes sous forme de menu drop-down.
foreach (Authentification::liste_utilisateurs() as $u) {
$ret .= '<tr>'
@ -71,7 +72,8 @@ class AdminUtilisateurs {
. '<td>' . $u . '</td>' // TODO : Nom
. '<td>' . $u . '</td>' // TODO : Prénom
. '<td>' . Authentification::get_groupe($u) . '</td>'
. '<td>' . Authentification::get_mot_de_passe($u) . '<input type="submit" value="Générer un nouveau mot de passe"/></td>'
. '<td>' . Authentification::get_mot_de_passe($u) . '</td>'
. '<td>' . '<input type="submit" value="Générer un nouveau mot de passe"/>' . '</td>'
. '<td>' . (Authentification::get_peut_se_connecter($u) ? "oui" : "non") . '</td>'
. '<td><input type="submit" value="appliquer"/></td>'
. '<td><input type="submit" value="supprimer"/></td>' // TODO
@ -82,7 +84,7 @@ class AdminUtilisateurs {
// $chemin->enfant("$utilisateur") ?action=gen_mdp .
}
$ret .= '</tbody></table>';
return new Page($ret, "Utilisateurs");
return new Page($chemin, $ret, "Utilisateurs");
}
}
}

View File

@ -3,10 +3,10 @@
class ArticlesArticle {
public static function action($chemin, $action, $paramètres) {
if ($action == "anuler") {
return new Page($chemin, '', "redirect");
return new Page($chemin, $chemin, '', "redirect");
} else if ($action == "supprimer") {
Stockage::supprimer($chemin, true); // TODO ! gérer correctement le récursif
return new Page($chemin->parent(), '', "redirect");
return new Page($chemin, $chemin->parent(), '', "redirect");
} else {
if (isset($paramètres["contenu"])) {
Stockage::set_prop($chemin, "contenu", $paramètres["contenu"]);
@ -18,7 +18,7 @@ class ArticlesArticle {
Stockage::renomer($chemin, $paramètres["titre"]);
$chemin = $chemin->renomer($paramètres["titre"]);
// TODO : transmettre le paramètre "vue"
return new Page($chemin, '', "redirect");
return new Page($chemin, $chemin, '', "redirect");
}
if (isset($paramètres["vue"])) {
@ -47,10 +47,10 @@ class ArticlesArticle {
// TODO : afficher le bouton "Supprimer".
}
return new Page($ret, Stockage::get_prop($chemin, "titre"));
return new Page($chemin, $ret, Stockage::get_prop($chemin, "titre"));
} elseif ($vue == "miniature") {
$ret = miniature_texte_enrichi(Stockage::get_prop($chemin, "contenu"));
return new Page($ret, Stockage::get_prop($chemin, "titre"));
return new Page($chemin, $ret, Stockage::get_prop($chemin, "titre"));
}
}
}

View File

@ -3,14 +3,13 @@
class ArticlesIndex {
public static function action($chemin, $action, $paramètres) {
if ($action == "anuler") {
return new Page($chemin, '', "redirect");
return new Page($chemin, $chemin, '', "redirect");
} else if ($action == "nouvelle_page") {
$np = Stockage::nouvelle_page($chemin, "Nouvel article", "articles-article");
Stockage::set_prop($np, "proprietaire", Authentification::get_utilisateur());
Stockage::set_prop($np, "titre", "Nouvel article");
Stockage::set_prop($np, "contenu", "Bla bla bla.");
enregistrer_nouveaute($np);
return new Page($np, '', "redirect");
return new Page($chemin, $np, '', "redirect");
} else {
if (isset($paramètres["description"])) {
Stockage::set_prop($chemin, "description", $paramètres["description"]);
@ -78,7 +77,7 @@ class ArticlesIndex {
$ret .= '</ul>';
return new Page($ret, Stockage::get_prop($chemin, "titre"));
return new Page($chemin, $ret, Stockage::get_prop($chemin, "titre"));
}
}
}

View File

@ -3,10 +3,10 @@
class ContactContact {
public static function action($chemin, $action, $paramètres) {
if ($action == "anuler") {
return new Page($chemin, '', "redirect");
return new Page($chemin, $chemin, '', "redirect");
} else if ($action == "supprimer") {
Stockage::supprimer($chemin, true); // TODO ! gérer correctement le récursif
return new Page($chemin->parent(), '', "redirect");
return new Page($chemin, $chemin->parent(), '', "redirect");
} else {
if (isset($paramètres["nom"])) {
Stockage::set_prop($chemin, "nom", $paramètres["nom"]);
@ -18,7 +18,7 @@ class ContactContact {
Stockage::set_prop($chemin, "description", $paramètres["description"]);
}
return new Page($chemin->parent(), '', "redirect");
return new Page($chemin, $chemin->parent(), '', "redirect");
}
}
@ -46,7 +46,7 @@ class ContactContact {
$ret .= '</form>';
}
return new Page($ret, Stockage::get_prop($chemin, "titre"));
return new Page($chemin, $ret, Stockage::get_prop($chemin, "titre"));
}
}
}

View File

@ -3,7 +3,7 @@
class ContactIndex {
public static function action($chemin, $action, $paramètres) {
if ($action == "anuler") {
return new Page($chemin, '', "redirect");
return new Page($chemin, $chemin, '', "redirect");
} else if ($action == "nouvelle_page") {
// SECURITE : On ne doit PAS pouvoir modifier dernier_numero arbitrairement
// CONCURENCE : Faire un lock quelque part...
@ -14,8 +14,7 @@ class ContactIndex {
Stockage::set_prop($np, "nom", "Dupondt");
Stockage::set_prop($np, "prenom", "Jean");
Stockage::set_prop($np, "description", "");
enregistrer_nouveaute($np);
return new Page($np, '', "redirect");
return new Page($chemin, $np, '', "redirect");
} else {
if (isset($paramètres["description"])) {
Stockage::set_prop($chemin, "description", $paramètres["description"]);
@ -72,7 +71,7 @@ class ContactIndex {
$ret .= '</ul>';
return new Page($ret, Stockage::get_prop($chemin, "titre"));
return new Page($chemin, $ret, Stockage::get_prop($chemin, "titre"));
}
}
}

View File

@ -3,7 +3,7 @@
class ÉquipesÉquipe {
public static function action($chemin, $action, $paramètres) {
if ($action == "anuler") {
return new Page($chemin, '', "redirect");
return new Page($chemin, $chemin, '', "redirect");
} else if ($action == "nouvelle_page") {
// SECURITE : On ne doit PAS pouvoir modifier dernier_numero arbitrairement
// CONCURENCE : Faire un lock quelque part...
@ -14,19 +14,18 @@ class ÉquipesÉquipe {
Stockage::set_prop($np, "nom", "Dupondt");
Stockage::set_prop($np, "prenom", "Jean");
Stockage::set_prop($np, "description", "");
enregistrer_nouveaute($np);
return new Page($chemin, '', "redirect");
return new Page($chemin, $chemin, '', "redirect");
} else if ($action == "supprimer") {
Stockage::supprimer($chemin, true); // TODO ! gérer correctement le récursif
return new Page($chemin->parent(), '', "redirect");
return new Page($chemin, $chemin->parent(), '', "redirect");
} else {
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 : transmettre le paramètre "vue"
return new Page($chemin, '', "redirect");
return new Page($chemin, $chemin, '', "redirect");
}
if (isset($paramètres["vue"])) {
@ -74,9 +73,9 @@ class ÉquipesÉquipe {
$ret .= '</ul>';
return new Page($ret, Stockage::get_prop($chemin, "titre"));
return new Page($chemin, $ret, Stockage::get_prop($chemin, "titre"));
} else if ($vue == "miniature") {
return new Page("Équipe.", Stockage::get_prop($chemin, "titre"));
return new Page($chemin, "Équipe.", Stockage::get_prop($chemin, "titre"));
}
}
}

View File

@ -3,14 +3,13 @@
class ÉquipesIndex {
public static function action($chemin, $action, $paramètres) {
if ($action == "anuler") {
return new Page($chemin, '', "redirect");
return new Page($chemin, $chemin, '', "redirect");
} else if ($action == "nouvelle_page") {
$np = Stockage::nouvelle_page($chemin, "Nouvelle équipe", "equipes-equipe");
Stockage::set_prop($np, "proprietaire", Authentification::get_utilisateur());
Stockage::set_prop($np, "titre", "Nouvelle équipe");
Stockage::set_prop($np, "dernier_numero", 0);
enregistrer_nouveaute($np);
return new Page($np, '', "redirect");
return new Page($chemin, $np, '', "redirect");
} else {
if (isset($paramètres["description"])) {
Stockage::set_prop($chemin, "description", $paramètres["description"]);
@ -32,6 +31,9 @@ class ÉquipesIndex {
if ($vue == "normal") {
$ret = '';
$ret .= '<h2>Horaires</h2>';
$ret .= Modules::vue(new Chemin("/horaires"), 'miniature')->contenu;
if (Permissions::vérifier_permission($chemin, "set_prop", Authentification::get_utilisateur())) {
$ret .= '<form class="equipes infos" method="post" action="' . $chemin->get_url() . '">';
$ret .= '<h2><input type="text" name="titre" value="' . Stockage::get_prop($chemin, "titre") . '" /></h2>';
@ -74,7 +76,7 @@ class ÉquipesIndex {
$ret .= '</ul>';
return new Page($ret, Stockage::get_prop($chemin, "titre"));
return new Page($chemin, $ret, Stockage::get_prop($chemin, "titre"));
}
}
}

View File

@ -3,10 +3,10 @@
class ÉquipesJoueur {
public static function action($chemin, $action, $paramètres) {
if ($action == "anuler") {
return new Page($chemin, '', "redirect");
return new Page($chemin, $chemin, '', "redirect");
} else if ($action == "supprimer") {
Stockage::supprimer($chemin, true); // TODO ! gérer correctement le récursif
return new Page($chemin->parent(), '', "redirect");
return new Page($chemin, $chemin->parent(), '', "redirect");
} else {
if (isset($paramètres["nom"])) {
Stockage::set_prop($chemin, "nom", $paramètres["nom"]);
@ -18,7 +18,7 @@ class ÉquipesJoueur {
Stockage::set_prop($chemin, "description", $paramètres["description"]);
}
return new Page($chemin->parent(), '', "redirect");
return new Page($chemin, $chemin->parent(), '', "redirect");
}
}
@ -48,7 +48,7 @@ class ÉquipesJoueur {
// Peut-être afficher le bouton "citer" ? ou est-ce trop d'options ?
return new Page($ret, Stockage::get_prop($chemin, "prenom") . " " . Stockage::get_prop($chemin, "nom"));
return new Page($chemin, $ret, Stockage::get_prop($chemin, "prenom") . " " . Stockage::get_prop($chemin, "nom"));
}
}
}

View File

@ -3,14 +3,13 @@
class ForumIndex {
public static function action($chemin, $action, $paramètres) {
if ($action == "anuler") {
return new Page($chemin, '', "redirect");
return new Page($chemin, $chemin, '', "redirect");
} else if ($action == "nouvelle_page") {
$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);
enregistrer_nouveaute($np);
return new Page($np, '', "redirect");
return new Page($chemin, $np, '', "redirect");
} else {
if (isset($paramètres["description"])) {
Stockage::set_prop($chemin, "description", $paramètres["description"]);
@ -75,7 +74,7 @@ class ForumIndex {
$ret .= '</ul>';
return new Page($ret, Stockage::get_prop($chemin, "titre"));
return new Page($chemin, $ret, Stockage::get_prop($chemin, "titre"));
}
}
}

View File

@ -3,16 +3,16 @@
class ForumMessage {
public static function action($chemin, $action, $paramètres) {
if ($action == "anuler") {
return new Page($chemin, '', "redirect");
return new Page($chemin, $chemin, '', "redirect");
} else if ($action == "supprimer") {
Stockage::supprimer($chemin, true); // TODO ! gérer correctement le récursif
return new Page($chemin->parent(), '', "redirect");
return new Page($chemin, $chemin->parent(), '', "redirect");
} else {
if (isset($paramètres["message"])) {
Stockage::set_prop($chemin, "message", $paramètres["message"]);
}
return new Page($chemin->parent(), '', "redirect");
return new Page($chemin, $chemin->parent(), '', "redirect");
}
}
@ -34,7 +34,7 @@ class ForumMessage {
// Peut-être afficher le bouton "citer" ? ou est-ce trop d'options ?
return new Page($ret, Stockage::get_prop($chemin, "titre"));
return new Page($chemin, $ret, Stockage::get_prop($chemin, "titre"));
}
}
}

View File

@ -3,7 +3,7 @@
class ForumSujet {
public static function action($chemin, $action, $paramètres) {
if ($action == "anuler") {
return new Page($chemin, '', "redirect");
return new Page($chemin, $chemin, '', "redirect");
} else if ($action == "nouvelle_page") {
// SECURITE : On ne doit PAS pouvoir modifier dernier_numero arbitrairement
// CONCURENCE : Faire un lock quelque part...
@ -12,19 +12,18 @@ class ForumSujet {
$np = Stockage::nouvelle_page($chemin, "" . $numéro_message, "forum-message");
Stockage::set_prop($np, "proprietaire", Authentification::get_utilisateur());
Stockage::set_prop($np, "message", "");
enregistrer_nouveaute($np);
return new Page($chemin, "#message" . $numéro_message, "redirect");
return new Page($chemin, $chemin, "#message" . $numéro_message, "redirect");
} else if ($action == "supprimer") {
Stockage::supprimer($chemin, true); // TODO ! gérer correctement le récursif
return new Page($chemin->parent(), '', "redirect");
return new Page($chemin, $chemin->parent(), '', "redirect");
} else {
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 : transmettre le paramètre "vue"
return new Page($chemin, '', "redirect");
return new Page($chemin, $chemin, '', "redirect");
}
if (isset($paramètres["vue"])) {
@ -72,9 +71,9 @@ class ForumSujet {
$ret .= '</ul>';
return new Page($ret, Stockage::get_prop($chemin, "titre"));
return new Page($chemin, $ret, Stockage::get_prop($chemin, "titre"));
} else if ($vue == "miniature") {
return new Page("Sujet.", Stockage::get_prop($chemin, "titre"));
return new Page($chemin, "Sujet.", Stockage::get_prop($chemin, "titre"));
}
}
}

View File

@ -1,19 +1,38 @@
@titre : url
@description :
Enfants : galerie-photo
Actions : créer_enfant, supprimer, vue
Vue normale :
(titre @titre)
(action supprimer "Supprimer cet événement")
(texte-riche @description)
+ liste des enfants :
<li>[miniature][titre]</li>
si permission créer page :
<li>(action nouvelle_page)</li>
Vue miniature :
Sélectionner le 1er enfant, lui demander sa vue "miniature", en renvoyer la partie image.
Donnée statique : icône "nouvelle image".
<?php
class GalerieÉvènement {
public static function action($chemin, $action, $paramètres) {
if ($action == "anuler") {
return new Page($chemin, '', "redirect");
return new Page($chemin, $chemin, '', "redirect");
} else if ($action == "nouvelle_page") {
$np = Stockage::nouvelle_page($chemin, "Nouvelle photo", "galerie-photo");
Stockage::set_prop($np, "proprietaire", Authentification::get_utilisateur());
Stockage::set_prop($np, "titre", "Nouvelle photo");
Stockage::set_prop($np, "description", "");
enregistrer_nouveaute($np);
return new Page($np, '', "redirect");
return new Page($chemin, $np, '', "redirect");
} else if ($action == "supprimer") {
Stockage::supprimer($chemin, true); // TODO ! gérer correctement le récursif
return new Page($chemin->parent(), '', "redirect");
return new Page($chemin, $chemin->parent(), '', "redirect");
} else {
if (isset($paramètres["description"])) {
Stockage::set_prop($chemin, "description", $paramètres["description"]);
@ -25,7 +44,7 @@ class GalerieÉvènement {
Stockage::renomer($chemin, $paramètres["titre"]);
$chemin = $chemin->renomer($paramètres["titre"]);
// TODO : transmettre le paramètre "vue"
return new Page($chemin, '', "redirect");
return new Page($chemin, $chemin, '', "redirect");
}
if (isset($paramètres["vue"])) {
@ -95,21 +114,21 @@ class GalerieÉvènement {
$ret .= '<input type="submit" value="Supprimer l\'évènement"/>';
$ret .= '</form>';
}
return new Page($ret, Stockage::get_prop($chemin, "titre"));
return new Page($chemin, $ret, Stockage::get_prop($chemin, "titre"));
} else if ($vue == "miniature") {
$ret = "Aucune<br/>photo";
$enfants = Stockage::liste_enfants($chemin);
if (isset($enfants[0])) $ret = Modules::vue($enfants[0], 'miniature')->contenu;
return new Page($ret, Stockage::get_prop($chemin, "titre"));
return new Page($chemin, $ret, Stockage::get_prop($chemin, "titre"));
} else if ($vue == "image_nouvelle_photo") {
// Houlàlà ça sent le hack pas beau !
return new Page(Path::combine(Config::get("chemin_base"), "/code/site/nouvelle_photo.jpg"), null, "sendfile");
return new Page($chemin, Path::combine(Config::get("chemin_base"), "/code/site/nouvelle_photo.jpg"), null, "sendfile");
}
}
}
Modules::enregister_module("GalerieÉvènement", "galerie-evenement", "vue", "titre description");
?>
?>

View File

@ -3,14 +3,13 @@
class GalerieIndex {
public static function action($chemin, $action, $paramètres) {
if ($action == "anuler") {
return new Page($chemin, '', "redirect");
return new Page($chemin, $chemin, '', "redirect");
} else if ($action == "nouvelle_page") {
$np = Stockage::nouvelle_page($chemin, "Nouvelle période", "galerie-periode");
$np = Stockage::nouvelle_page($chemin, "Nouvelle période", "galerie-photo");
Stockage::set_prop($np, "proprietaire", Authentification::get_utilisateur());
Stockage::set_prop($np, "titre", "Nouvelle période");
Stockage::set_prop($np, "titre", "Nouvel enregistrement");
Stockage::set_prop($np, "description", "");
enregistrer_nouveaute($np);
return new Page($np, '', "redirect");
return new Page($chemin, $np, '', "redirect");
} else {
if (isset($paramètres["description"])) {
Stockage::set_prop($chemin, "description", $paramètres["description"]);
@ -62,14 +61,14 @@ class GalerieIndex {
if (Permissions::vérifier_permission($chemin, "nouvelle_page", Authentification::get_utilisateur())) {
$ret .= '<li>';
$ret .= '<div class="miniature">';
$ret .= '<img alt="nouvelle période" src="' . $chemin->get_url("?vue=image_nouvelle_periode") . '" />';
$ret .= '<img alt="nouvel enregistrement" src="' . $chemin->get_url("?vue=image_nouvelle_periode") . '" />';
$ret .= '</div>';
$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="Nouvelle période"/>';
$ret .= '<input type="submit" value="Nouvel enregistrement"/>';
$ret .= '</p>';
$ret .= '</form>';
@ -81,10 +80,10 @@ class GalerieIndex {
$ret .= '<div class="clearboth"></div>';
$ret .= '</div>';
return new Page($ret, Stockage::get_prop($chemin, "titre"));
return new Page($chemin, $ret, Stockage::get_prop($chemin, "titre"));
} else if ($vue == "image_nouvelle_periode") {
// Houlàlà ça sent le hack pas beau !
return new Page(Path::combine(Config::get("chemin_base"), "/code/site/nouvelle_image.jpg"), null, "sendfile");
return new Page($chemin, Path::combine(Config::get("chemin_base"), "/code/site/nouvelle_image.jpg"), null, "sendfile");
}
}
}

View File

@ -1,19 +1,38 @@
@titre : url
@description :
Enfants : galerie-evenement
Actions : créer_enfant, supprimer, vue
Vue normale :
(titre @titre)
(texte-riche @description)
(action supprimer "Supprimer cette période.") # ssi permission supprimer
+ liste des enfants :
<li>[miniature][titre]</li>
si permission créer page :
<li>(action nouvelle_page)</li>
Vue miniature :
Sélectionner le 1er enfant, lui demander sa vue "miniature", en renvoyer la partie image.
Donnée statique : icône "nouvel évènement".
<?php
class GaleriePériode {
public static function action($chemin, $action, $paramètres) {
if ($action == "anuler") {
return new Page($chemin, '', "redirect");
return new Page($chemin, $chemin, '', "redirect");
} else if ($action == "nouvelle_page") {
$np = Stockage::nouvelle_page($chemin, "Nouvel évènement", "galerie-evenement");
Stockage::set_prop($np, "proprietaire", Authentification::get_utilisateur());
Stockage::set_prop($np, "titre", "Nouvel évènement");
Stockage::set_prop($np, "description", "");
enregistrer_nouveaute($np);
return new Page($np, '', "redirect");
return new Page($chemin, $np, '', "redirect");
} else if ($action == "supprimer") {
Stockage::supprimer($chemin, true); // TODO ! gérer correctement le récursif
return new Page($chemin->parent(), '', "redirect");
return new Page($chemin, $chemin->parent(), '', "redirect");
} else {
if (isset($paramètres["description"])) {
Stockage::set_prop($chemin, "description", $paramètres["description"]);
@ -26,7 +45,7 @@ class GaleriePériode {
$chemin = $chemin->renomer($paramètres["titre"]);
// TODO : transmettre le paramètre "vue"
// TODO : ne marche pas.
return new Page($chemin, '', "redirect");
return new Page($chemin, $chemin, '', "redirect");
}
if (isset($paramètres["vue"])) {
@ -96,17 +115,17 @@ class GaleriePériode {
$ret .= '<input type="submit" value="Supprimer la période"/>';
$ret .= '</form>';
}
return new Page($ret, Stockage::get_prop($chemin, "titre"));
return new Page($chemin, $ret, Stockage::get_prop($chemin, "titre"));
} else if ($vue == "miniature") {
$ret = "Aucune<br/>photo";
$enfants = Stockage::liste_enfants($chemin);
if (isset($enfants[0])) $ret = Modules::vue($enfants[0], 'miniature')->contenu;
return new Page($ret, Stockage::get_prop($chemin, "titre"));
return new Page($chemin, $ret, Stockage::get_prop($chemin, "titre"));
} else if ($vue == "image_nouvel_evenement") {
// Houlàlà ça sent le hack pas beau !
return new Page(Path::combine(Config::get("chemin_base"), "/code/site/nouvel_evenement.jpg"), null, "sendfile");
return new Page($chemin, Path::combine(Config::get("chemin_base"), "/code/site/nouvel_evenement.jpg"), null, "sendfile");
}
}
}

View File

@ -1,14 +1,33 @@
@titre : url
@description :
# external signifie : ne pas stocker dans la bdd.
@image : external
# private signifie : ne peut pas être modifié directement par l'utilisateur / la requête / les autres modules.
@miniature : private,external
set_image : fonction php qui crée la miniature.
Vue normale :
(@titre titre)
(action supprimer "Supprimer cet évènement")
(@texte-riche description)
(@image image)
Vue miniature :
(@titre titre)
(@image miniature)
<?php
class GaleriePhoto {
public static function action($chemin, $action, $paramètres) {
if ($action == "anuler") {
return new Page($chemin, '', "redirect");
return new Page($chemin, $chemin, '', "redirect");
} else if ($action == "supprimer") {
Stockage::supprimer($chemin, true); // TODO ! gérer correctement le récursif
return new Page($chemin->parent(), '', "redirect");
return new Page($chemin, $chemin->parent(), '', "redirect");
} else {
if (isset($paramètres["fichier_image"])) {
if (isset($paramètres["fichier_image"]) && ($paramètres["fichier_image"]["tmp_name"] != "")) {
$fichier_image = $paramètres["fichier_image"]["tmp_name"];
$fichier_image_mini = self::creer_miniature($fichier_image, 64, 64);
Stockage::set_prop_fichier($chemin, "image_mini", $fichier_image_mini);
@ -25,7 +44,7 @@ class GaleriePhoto {
Stockage::renomer($chemin, $paramètres["titre"]);
$chemin = $chemin->renomer($paramètres["titre"]);
// TODO : transmettre le paramètre "vue"
return new Page($chemin, '', "redirect");
return new Page($chemin, $chemin, '', "redirect");
}
if (isset($paramètres["vue"])) {
@ -53,19 +72,19 @@ class GaleriePhoto {
} else {
$ret .= '<h2>' . Stockage::get_prop($chemin, "titre") . '</h2>';
$ret .= '<img alt="' . Stockage::get_prop($chemin, "titre") . '" src="' . $chemin->get_url("?vue=image") . '"/>';
$ret .= affichage_texte_enrichi(Stockage::get_prop($chemin, "message"));
$ret .= affichage_texte_enrichi(Stockage::get_prop($chemin, "description"));
}
return new Page($ret, Stockage::get_prop($chemin, "titre"));
return new Page($chemin, $ret, Stockage::get_prop($chemin, "titre"));
} else if ($vue == "miniature" || $vue == "mini") {
$ret = '<img alt="' . Stockage::get_prop($chemin, "titre") . '" src="' . $chemin->get_url("?vue=image_mini") . '"/>';
return new Page($ret, Stockage::get_prop($chemin, "titre"));
return new Page($chemin, $ret, Stockage::get_prop($chemin, "titre"));
} else if ($vue == "image") {
return new Page($chemin, "image", "sendprop");
return new Page($chemin, $chemin, "image", "sendprop");
} else if ($vue == "image_mini") {
return new Page($chemin, "image_mini", "sendprop");
return new Page($chemin, $chemin, "image_mini", "sendprop");
}
return new Page('',''); // TODO : devrait renvoyer une page d'erreur !
return new Page($chemin, '',''); // TODO : devrait renvoyer une page d'erreur !
}
public static function creer_miniature($chemin_fs, $largeur_max, $hauteur_max) {
@ -109,4 +128,4 @@ class GaleriePhoto {
Modules::enregister_module("GaleriePhoto", "galerie-photo", "vue", "description", "fichier_image");
?>
?>

View File

@ -0,0 +1,66 @@
<?php
class HorairesCreneau {
public static function action($chemin, $action, $paramètres) {
if ($action == "anuler") {
return new Page($chemin, $chemin, '', "redirect");
} else if ($action == "supprimer") {
Stockage::supprimer($chemin, true); // TODO ! gérer correctement le récursif
return new Page($chemin, $chemin->parent(), '', "redirect");
} else {
if (isset($paramètres["equipe"])) {
Stockage::set_prop($chemin, "equipe", $paramètres["equipe"]);
}
if (isset($paramètres["jour"])) {
Stockage::set_prop($chemin, "jour", $paramètres["jour"]);
}
if (isset($paramètres["debut"])) {
Stockage::set_prop($chemin, "debut", $paramètres["debut"]);
}
if (isset($paramètres["fin"])) {
Stockage::set_prop($chemin, "fin", $paramètres["fin"]);
}
return new Page($chemin, $chemin->parent(), '', "redirect");
}
}
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="creneau edition" enctype="multipart/form-data" method="post" action="' . $chemin->get_url() . '">';
$ret .= '<input type="text" name="equipe" value="' . Stockage::get_prop($chemin, "equipe") . '" />';
$ret .= " le ";
$ret .= '<input type="text" name="jour" value="' . Stockage::get_prop($chemin, "jour") . '" />';
$ret .= " de ";
$ret .= '<input type="text" name="debut" value="' . Stockage::get_prop($chemin, "debut") . '" />';
$ret .= " à ";
$ret .= '<input type="text" name="fin" value="' . Stockage::get_prop($chemin, "fin") . '" />';
$ret .= '<p><input type="submit" value="appliquer" /></p>';
$ret .= '</form>';
} else {
$ret .= Stockage::get_prop($chemin, "equipe");
$ret .= " le ";
$ret .= Stockage::get_prop($chemin, "jour");
$ret .= " de ";
$ret .= Stockage::get_prop($chemin, "debut");
$ret .= " à ";
$ret .= Stockage::get_prop($chemin, "fin");
}
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 le créneau"/>';
$ret .= '</form>';
}
return new Page($chemin, $ret, Stockage::get_prop($chemin, "titre"));
}
}
}
Modules::enregister_module("HorairesCreneau", "horaires-creneau", "vue", "equipe jour debut fin");
?>

View File

@ -0,0 +1,56 @@
<?php
class ContactContact {
public static function action($chemin, $action, $paramètres) {
if ($action == "anuler") {
return new Page($chemin, $chemin, '', "redirect");
} else if ($action == "supprimer") {
Stockage::supprimer($chemin, true); // TODO ! gérer correctement le récursif
return new Page($chemin, $chemin->parent(), '', "redirect");
} else {
if (isset($paramètres["nom"])) {
Stockage::set_prop($chemin, "nom", $paramètres["nom"]);
}
if (isset($paramètres["prenom"])) {
Stockage::set_prop($chemin, "prenom", $paramètres["prenom"]);
}
if (isset($paramètres["description"])) {
Stockage::set_prop($chemin, "description", $paramètres["description"]);
}
return new Page($chemin, $chemin->parent(), '', "redirect");
}
}
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="contacts contact edition" enctype="multipart/form-data" method="post" action="' . $chemin->get_url() . '">';
$ret .= '<input type="text" name="prenom" value="' . Stockage::get_prop($chemin, "prenom") . '" />';
$ret .= '<input type="text" name="nom" value="' . Stockage::get_prop($chemin, "nom") . '" />';
$ret .= formulaire_édition_texte_enrichi(Stockage::get_prop($chemin, "description"), "description");
$ret .= '<p><input type="submit" value="appliquer" /></p>';
$ret .= '</form>';
} else {
$ret .= Stockage::get_prop($chemin, "prenom");
$ret .= " ";
$ret .= Stockage::get_prop($chemin, "nom");
$ret .= affichage_texte_enrichi(Stockage::get_prop($chemin, "description"));
}
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 le contact ' . htmlspecialchars(Stockage::get_prop($chemin, "prenom") . " " . Stockage::get_prop($chemin, "nom")) . '"/>';
$ret .= '</form>';
}
return new Page($chemin, $ret, Stockage::get_prop($chemin, "titre"));
}
}
}
Modules::enregister_module("ContactContact", "contact-contact", "vue", "nom prenom description");
?>

View File

@ -0,0 +1,95 @@
<?php
class HorairesIndex {
public static function action($chemin, $action, $paramètres) {
if ($action == "anuler") {
return new Page($chemin, $chemin, '', "redirect");
} else if ($action == "nouvelle_page") {
// SECURITE : On ne doit PAS pouvoir modifier dernier_numero arbitrairement
// CONCURENCE : Faire un lock quelque part...
$numéro_creneau = 1 + Stockage::get_prop($chemin, "dernier_numero");
Stockage::set_prop($chemin, "dernier_numero", $numéro_creneau);
$np = Stockage::nouvelle_page($chemin, "Créneau" . $numéro_creneau, "horaires-creneau");
Stockage::set_prop($np, "proprietaire", Authentification::get_utilisateur());
Stockage::set_prop($np, "equipe", "Nom de l'équipe");
Stockage::set_prop($np, "jour", "Lundi");
Stockage::set_prop($np, "debut", "17h00");
Stockage::set_prop($np, "fin", "18h00");
return new Page($chemin, $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"])) {
return self::vue($chemin, $paramètres["vue"]);
} else {
return self::vue($chemin);
}
}
}
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="horaires 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="horaires index description affichage">' . Stockage::get_prop($chemin, "description") . '</p>';
}
$ret .= '<div class="horaires liste-creneaux index">';
$ret .= '<ul>';
if (Permissions::vérifier_permission($chemin, "nouvelle_page", Authentification::get_utilisateur())) {
$ret .= '<li>';
$ret .= '<div class="titre">';
$ret .= '<form class="horaires 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 créneau"/>';
$ret .= '</p>';
$ret .= '</form>';
$ret .= '</div>';
$ret .= '</li>';
}
foreach (stockage::liste_enfants($chemin) as $k) {
$ret .= '<li>' . Modules::vue($k)->contenu . '</li>';
}
$ret .= '</ul>';
return new Page($chemin, $ret, Stockage::get_prop($chemin, "titre"));
} else if ($vue == "miniature") {
$ret = '';
$ret .= '<div class="horaires liste-creneaux miniature">';
$ret .= '<ul>';
foreach (stockage::liste_enfants($chemin) as $k) {
$ret .= '<li>' . Modules::vue($k)->contenu . '</li>';
}
$ret .= '</ul>';
return new Page($chemin, $ret, Stockage::get_prop($chemin, "titre"));
}
}
}
Modules::enregister_module("HorairesIndex", "horaires-index", "vue", "titre description");
?>

View File

@ -0,0 +1,81 @@
<?php
class ContactIndex {
public static function action($chemin, $action, $paramètres) {
if ($action == "anuler") {
return new Page($chemin, $chemin, '', "redirect");
} else if ($action == "nouvelle_page") {
// SECURITE : On ne doit PAS pouvoir modifier dernier_numero arbitrairement
// CONCURENCE : Faire un lock quelque part...
$numéro_contact = 1 + Stockage::get_prop($chemin, "dernier_numero");
Stockage::set_prop($chemin, "dernier_numero", $numéro_contact);
$np = Stockage::nouvelle_page($chemin, "Contact" . $numéro_contact, "contact-contact");
Stockage::set_prop($np, "proprietaire", Authentification::get_utilisateur());
Stockage::set_prop($np, "nom", "Dupondt");
Stockage::set_prop($np, "prenom", "Jean");
Stockage::set_prop($np, "description", "");
return new Page($chemin, $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"])) {
return self::vue($chemin, $paramètres["vue"]);
} else {
return self::vue($chemin);
}
}
}
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="contact 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="contact index description affichage">' . Stockage::get_prop($chemin, "description") . '</p>';
}
$ret .= '<div class="contact liste-contacts index">';
$ret .= '<ul>';
if (Permissions::vérifier_permission($chemin, "nouvelle_page", Authentification::get_utilisateur())) {
$ret .= '<li>';
$ret .= '<div class="titre">';
$ret .= '<form class="contact 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 contact"/>';
$ret .= '</p>';
$ret .= '</form>';
$ret .= '</div>';
$ret .= '</li>';
}
foreach (stockage::liste_enfants($chemin) as $k) {
$ret .= '<li>' . Modules::vue($k)->contenu . '</li>';
}
$ret .= '</ul>';
return new Page($chemin, $ret, Stockage::get_prop($chemin, "titre"));
}
}
}
Modules::enregister_module("ContactIndex", "contact-index", "vue", "titre description");
?>

View File

@ -0,0 +1,4 @@
<?php
require_once(dirname(__FILE__) . "/horaires-index.php");
require_once(dirname(__FILE__) . "/horaires-creneau.php");
?>

View File

@ -0,0 +1,4 @@
<?php
require_once(dirname(__FILE__) . "/contact-index.php");
require_once(dirname(__FILE__) . "/contact-contact.php");
?>

View File

@ -6,10 +6,10 @@ require_once(dirname(__FILE__) . "/site/include.php");
require_once(dirname(__FILE__) . "/admin/include.php");
require_once(dirname(__FILE__) . "/forum/include.php");
require_once(dirname(__FILE__) . "/galerie/include.php");
require_once(dirname(__FILE__) . "/nouveautes/include.php");
require_once(dirname(__FILE__) . "/articles/include.php");
require_once(dirname(__FILE__) . "/equipes/include.php");
require_once(dirname(__FILE__) . "/liens/include.php");
require_once(dirname(__FILE__) . "/contact/include.php");
require_once(dirname(__FILE__) . "/horaires/include.php");
?>
?>

View File

@ -3,7 +3,7 @@
class LiensIndex {
public static function action($chemin, $action, $paramètres) {
if ($action == "anuler") {
return new Page($chemin, '', "redirect");
return new Page($chemin, $chemin, '', "redirect");
} else if ($action == "nouvelle_page") {
// SECURITE : On ne doit PAS pouvoir modifier dernier_numero arbitrairement
// CONCURENCE : Faire un lock quelque part...
@ -14,8 +14,7 @@ class LiensIndex {
Stockage::set_prop($np, "texte", "Un lien");
Stockage::set_prop($np, "cible", "http://www.example.com/page/");
Stockage::set_prop($np, "description", "Un lien d'exemple très utile.");
enregistrer_nouveaute($np);
return new Page($np, '', "redirect");
return new Page($chemin, $np, '', "redirect");
} else {
if (isset($paramètres["description"])) {
Stockage::set_prop($chemin, "description", $paramètres["description"]);
@ -73,7 +72,7 @@ class LiensIndex {
$ret .= '</ul>';
return new Page($ret, Stockage::get_prop($chemin, "titre"));
return new Page($chemin, $ret, Stockage::get_prop($chemin, "titre"));
}
}
}

View File

@ -3,10 +3,10 @@
class LiensLien {
public static function action($chemin, $action, $paramètres) {
if ($action == "anuler") {
return new Page($chemin, '', "redirect");
return new Page($chemin, $chemin, '', "redirect");
} else if ($action == "supprimer") {
Stockage::supprimer($chemin, true); // TODO ! gérer correctement le récursif
return new Page($chemin->parent(), '', "redirect");
return new Page($chemin, $chemin->parent(), '', "redirect");
} else {
if (isset($paramètres["texte"])) {
Stockage::set_prop($chemin, "texte", $paramètres["texte"]);
@ -18,7 +18,7 @@ class LiensLien {
Stockage::set_prop($chemin, "cible", $paramètres["cible"]);
}
return new Page($chemin->parent(), '', "redirect");
return new Page($chemin, $chemin->parent(), '', "redirect");
}
}
@ -44,7 +44,7 @@ class LiensLien {
$ret .= '</form>';
}
return new Page($ret, Stockage::get_prop($chemin, "titre"));
return new Page($chemin, $ret, Stockage::get_prop($chemin, "titre"));
}
}
}

View File

@ -1,3 +0,0 @@
<?php
require_once(dirname(__FILE__) . "/nouveautes-index.php");
?>

View File

@ -1,84 +0,0 @@
<?php
// TODO : accents pour nouveauté.
class NouveautesIndex {
public static function action($chemin, $action, $paramètres) {
if ($action == "anuler") {
return new Page($chemin, '', "redirect");
} else {
if (isset($paramètres["titre"])) {
Stockage::set_prop($chemin, "titre", $paramètres["titre"]);
}
if (isset($paramètres["vue"])) {
return self::vue($chemin, $paramètres["vue"]);
} else {
return self::vue($chemin);
}
}
}
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="articles 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>' . Stockage::get_prop($chemin, "titre") . '</h2>';
}
$ret .= '<div class="nouveautes list index">';
$ret .= '<ul>';
/*foreach (Stockage::liste_enfants(new Chemin("/forum")) as $k) {
$date = Stockage::get_prop($k, "date_modif");
if (Erreur::is_erreur($date)) $date = "0";
$date = (int)$date;
var_dump($date);
}*/
// TODO : faire dans l'ordre décroissant les 5 dernières nouveautés.
foreach (Stockage::liste_enfants($chemin) as $n) {
$k = new Chemin(Stockage::get_prop($n, "chemin"));
$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 .= '<p class="contenu">';
$ret .= $mini->contenu;
$ret .= '</p>';
$ret .= '</li>';
}
$ret .= '</ul>';
return new Page($ret, Stockage::get_prop($chemin, "titre"));
}
}
}
// TODO : maintenir la liste à jour lors des renomages, suppressions, ...
function enregistrer_nouveaute($chemin) {
$singleton = new Chemin("/nouveautes");
Stockage::set_prop($chemin, "date_modif", "".time());
// SECURITE : On ne doit PAS pouvoir modifier dernier_numero arbitrairement
// CONCURENCE : Faire un lock quelque part...
$numéro_nouveauté = 1 + Stockage::get_prop($singleton, "dernier_numero");
Stockage::set_prop($singleton, "dernier_numero", $numéro_nouveauté);
$nouv = Stockage::nouvelle_page($singleton, "" . $numéro_nouveauté, "nouveaute-element-liste");
Stockage::set_prop($nouv, "chemin", $chemin->get());
}
Modules::enregister_module("NouveautesIndex", "nouveautes-index", "vue", "titre");
?>

View File

@ -25,17 +25,21 @@ class SiteIndex {
if ($vue == "normal") {
$ret = '';
$ret .= '<div class="prochain-evenement">';
$ret .= '<h2>Prochain évènement</h2>';
if (Permissions::vérifier_permission($chemin, "set_prop", Authentification::get_utilisateur())) {
$ret .= '<form method="post" action="' . $chemin->get_url() . '">';
$ret .= formulaire_édition_texte_enrichi(Stockage::get_prop($chemin, "prochain_evenement"), "prochain_evenement");
$ret .= '<p><input type="submit" value="appliquer" /></p>';
$ret .= '</form>';
} else {
$ret .= Stockage::get_prop($chemin, "prochain_evenement");
}
$ret .= '</div>';
// $ret .= '<div class="prochain-evenement">';
// $ret .= '<h2>Prochain évènement</h2>';
// if (Permissions::vérifier_permission($chemin, "set_prop", Authentification::get_utilisateur())) {
// $ret .= '<form method="post" action="' . $chemin->get_url() . '">';
// $ret .= formulaire_édition_texte_enrichi(Stockage::get_prop($chemin, "prochain_evenement"), "prochain_evenement");
// $ret .= '<p><input type="submit" value="appliquer" /></p>';
// $ret .= '</form>';
// } else {
// $ret .= Stockage::get_prop($chemin, "prochain_evenement");
// }
// $ret .= '</div>';
// $ret .= '<div class="logo-site">';
// $ret .= '<img src="' . $chemin->get_url("logo.png") . '">';
// $ret .= '</div>';
$ret .= '<div class="description-site">';
if (Permissions::vérifier_permission($chemin, "set_prop", Authentification::get_utilisateur())) {
@ -55,11 +59,11 @@ class SiteIndex {
$ret .= Stockage::get_prop($chemin, "description");
}
$ret .= '</div>';
return new Page($ret, Stockage::get_prop($chemin, "nom_site"));
return new Page($chemin, $ret, Stockage::get_prop($chemin, "nom_site"));
} else if ($vue == "css") {
return new Page(get_css(), "text/css", "raw");
return new Page($chemin, get_css(), "text/css", "raw");
}
return new Page('',''); // TODO : devrait renvoyer une page d'erreur !
return new Page($chemin, '',''); // TODO : devrait renvoyer une page d'erreur !
}
}

150
__cms__/code/notes.txt Normal file
View File

@ -0,0 +1,150 @@
<h2><?php echo this->select("@titre"); ?></h2>
<p><?php echo this->select("@description"); ?></p>
<ul>
<?php foreach (this->select("periodes") as $k => $periode) { ?>
<li>
<a href="<?php echo $periode->url(); ?>">
<?php $rendu = $periode->rendu(); ?>
<span class="miniature">
<?php echo $rendu->get("contenu"); ?>
</span>
<span class="titre">
<?php echo $rendu->get("titre"); ?>
</span>
</li>
<?php } ?>
</ul>
<%titre @titre %>
<%texte-riche @description %>
<%list ./periodes %>
<li>
<a href="<?php echo $periode->url(); ?>">
<?php $rendu = $periode->rendu(); ?>
<span class="miniature">
<?php echo $rendu->get("contenu"); ?>
</span>
<span class="titre">
<?php echo $rendu->get("titre"); ?>
</span>
</li>
<%/list>
(document @titre
(titre @titre)
(texte-riche @description)
(list ./periodes
(lambda (p)
(let ((rendu (rendu p)))
(<a> (url p)
(<span> :class miniature
(get "contenu" rendu))
(<span> :class titre
(get "titre" rendu)))))))
(document @titre
(titre @titre)
(texte-riche @description)
(<ul>
(foreach/rendu ((p ./periodes))
(<li>
(<a> (url p)
(<span> :class miniature
(get "contenu" rendu))
(<span> :class titre
(get "titre" rendu)))))))
La fonction rendu prend en paramètre une "page" renvoie un fragment html.
Tous les fragments html ont 3 parties :
- le titre
- le head (scripts, css etc.)
- le body
- Peut-être séparer le <h2>...</h2> du reste du body ?
- Peut-être séparer le header, footer, article, nav, ...
- et l'url ?
Dans la base de données, chaque "page" a :
- un identifiant unique. Chaque élément de la base de données a un identifiant unique construit à partir de
son autoincrement, et du nom de la table.
- un systemName (optionnel) : pour les "pages" Permissions, Utilisateurs, etc. Permet d'accéder en chemin absolu sans connaître l'uid / le nom.
- des propriétés accessibles via @nom-propriété.
+ des propriétés "système" (dates, permissions, composantUrl) avec des droits potentiellement différents.
- des groupes de pages enfant (?) :
Pour la page galerie :
./periodes/2009-2010
./periodes/2010-2011
Pour accéder au 3e évènement de la 2e période, on ferait :
./periodes/2010-2011/evenements/1er avril
- et l'url (canonique) ?
Langage de requêtes :
- Récupérer un attribut
- Récupérer une page enfant d'une certaine catégorie (?)
- Trier selon une propriété des éléments renvoyés (plus tard, on pourra trier en fonction d'autres critères).
- Limiter le nombre de résultats (LIMIT et OFFSET).
- Ne renvoie que les éléments que l'utilisateur a la permission de voir.
Un module peut déclarer des ressources statiques (par ex. un fragment de less/css) et dynamiques (p. ex. image).
Les ressources statiques ont une url qui ne dépend pas du chemin de la page en cours, les dynamiques si
(en général).
Les ressources doivent pouvoir être accédées via une certaine url.
=> "Espaces de nommage" : dès la réception de l'url, on s'empresse de trouver son espace de nommage,
et on appelle la fonction correspondante. Par ex. : dans /css, on appelle directement la fonction
qui renverra le fichier CSS. Ou bien, système de "liens" : /css est un lien vers /admin/style:css
(ressource css de /admin/style). La solution "fonction" est plus générale. Par ex. /css/blabla peut
appeller la fonction en question avec "blabla" en paramètre (pour récupérer la bonne feuille de style).
ATTENTION : éviter les conflits de nommage, vu que les espaces de nommage se recouvrent partiellement.
TODO : méthode "shorturl" qui renvoie l'url d'une ressource via son raccourci s'il en existe un, sinon
via le chemin normal.
TODO : Comment les modules indiquent-ils qu'ils ont une feuille css à mettre dans l'espace de nommage
"CSS" ?
NOTE : ça sent le truc bien compliqué avec plein de bugs ça... :( .
Notes en vrac :
===============
On doit pouvoir insérer des éléments supplémentaires dans une liste (entre autres le bouton "nouvelle page").
Donc la "macro" (liste) ne fonctionnera pas. À moins que insérer soit la seule chose à ajouter. Ou si on fait
un mécanisme qui permet d'ajouter d'autre choses à la liste (prepend / append, ou paramètres supplémentaires).
Il faut une macro (action), qui génère en html un bouton.
Dans les actions de chaque module, il y a :
- vue (toujours)
- set_prop (toujours?)
- supprimer (souvent? toujours?)
- créer_enfant (souvent)
Problème des class css.
Solution : chaque classe PHP de création d'élément (Document->ul(), Document->div(), ...) a un méthode
->espaceCSS($class). Lorsqu'on l'appelle, tous les éléments enfants qui ne sont pas déjà dans un espace CSS
reçoivent la classe $class. (ceci est effectué lors de la conversion Document->(x)html5().)
Pour les aperçus dans la galerie : prendre le 1er enfant (ou l'enfant marqué 'aperçu').
Pour les titres :
"@titre url" signifie :
Lorsqu'on modifie le titre, on modifie aussi l'emplacement de la page de pseudo-réécriture d'url.
De plus, lorsqu'on demande l'adresse de cette page, elle est calculée en fonction du titre.
Il faut trouver comment générer automatiquement une url / titre / je-ne-sais-quoi dans le cas où
le titre n'est pas renseigné (par ex. pour les 250 photos de la galerie, pour que les utilisateurs
n'aient pas à indiquer le titre à chaque fois.
Toutes les pages ont une date de création et de modification automatiquement.
TODO : pouvoir accéder l'attribut @image directement depuis l'extérieur.
Abstractions :
- Valeur avec binding (+ callbacks ?).
- Action (créer page, supprimer, ... (générer mot de passe)).
- Getter et setter optionnels sur les valeurs.
Ex: getter de titre : Renvoie "Photo [date]" si le titre est indéfini, sinon le titre.
- Vue vs ressource (chaque ressource a une ou plusieurs(?) vue(s?), une page "photo" est une ressource (celle par défaut), l'image elle-même est une autre ressource).
Ou bien pas de vue, que des ressources (la "vue miniature" est une autre ressource).
Valeurs par défaut pour les @attributs, définies dans le module lui-même.
Pour la galerie : 3 vues : normal, miniature (image + caption), mini-miniature (juste l'image).
Pour les photos : 4 ressources : la page (ressource par défaut), l'image en grand, l'image en 800x600 (par ex.), l'image mini (64x64).
La page affiche la photo 800x600, et si on clique dessus, c'est la version en grand qui est affichée.

View File

@ -46,12 +46,27 @@ class Squelette {
$ret .= ' <li><a href="' . $racine->enfant("forum")->get_url() . '">Forum</a></li>' . $nl;
$ret .= ' <li><a href="' . $racine->enfant("liens")->get_url() . '">Liens utiles</a></li>' . $nl;
$ret .= ' <li><a href="' . $racine->enfant("contact")->get_url() . '">Contact</a></li>' . $nl;
$ret .= ' <li><a href="' . $racine->enfant("horaires")->get_url() . '">Horaires</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;
}
$ret .= ' </ul>' . $nl;
$ret .= ' </div>' . $nl;
$ret .= ' <div class="site contenu">' . $nl;
if (! $page->chemin->est_racine() && ! $page->chemin->parent()->est_racine()) {
$ret .= ' <p class="">' . $nl;
$premier = true;
foreach ($page->chemin->hiérarchie() as $i) {
if (!$i->est_racine()) {
if (!$premier) {
$ret .= ' &gt; ';
}
$ret .= ' <a href="' . $i->get_url() . '">' . $i->dernier() . '</a>' . $nl;
$premier = false;
}
}
$ret .= ' </p>' . $nl;
}
return $ret;
}

View File

@ -90,7 +90,7 @@ class Stockage {
public static function prop_diff($chemin, $prop, $valeur) {
// Renvoie true si la valeur actuelle de $prop est différente de $valeur.
return self::get_prop($chemin, $prop) != $valeur;
return (self::get_prop($chemin, $prop) != $valeur);
}
// TODO : la suppression non récursive d'une page implique de supprimer

View File

@ -14,9 +14,8 @@ class Système_fichiers {
// touch($chemin_fs)
}*/
public static function supprimer($chemin_fs, $récursif) {
var_dump($chemin_fs);
if (is_link($chemin_fs) || is_file($chemin_fs)) {
public static function supprimer($chemin_fs, $récursif = true) { // TODO ne devrait pas avoir de valeur par défaut, mais certaines fonctions l'appellent sans 2e paramètre.
if (is_link($chemin_fs) || is_file($chemin_fs)) {
unlink($chemin_fs);
} else if ($récursif && is_dir($chemin_fs)) {
$d = dir($chemin_fs);

View File

@ -1 +1 @@
Du bla bla sur le handball, l\'association, etc. Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet.
Description de l'association, etc.

View File

@ -1 +1 @@
Montpellier Chamberte Handball
Site de l'association des amis de Théodore Dubois

View File

@ -1 +1 @@
Match au stade de france !
Match au stade de france ! Le 36 du mois.

View File

@ -0,0 +1 @@
Anonyme

View File

@ -1,3 +1,3 @@
Responsable du vestiaire masculin.
06 66 00 06 66
06 69 69 69 69

View File

@ -0,0 +1 @@
Bla bla

View File

@ -0,0 +1 @@
Dupondt

View File

@ -0,0 +1 @@
Jean

View File

@ -0,0 +1 @@
grand___chef

View File

@ -0,0 +1 @@
equipes-joueur

View File

@ -0,0 +1 @@
Chanteur

View File

@ -0,0 +1 @@
McCartney

View File

@ -0,0 +1 @@
Paul

View File

@ -0,0 +1 @@
grand___chef

View File

@ -0,0 +1 @@
equipes-joueur

View File

@ -0,0 +1 @@
Muche

View File

@ -0,0 +1 @@
Truc

View File

@ -0,0 +1 @@
grand___chef

View File

@ -0,0 +1 @@
equipes-joueur

View File

@ -0,0 +1 @@
3

View File

@ -0,0 +1 @@
grand___chef

View File

@ -0,0 +1 @@
Chamberte 3

View File

@ -0,0 +1 @@
equipes-equipe

View File

@ -0,0 +1 @@
dribleur hors pair

View File

@ -0,0 +1 @@
Dupondt

View File

@ -0,0 +1 @@
Jean

View File

@ -0,0 +1 @@
grand___chef

View File

@ -0,0 +1 @@
equipes-joueur

View File

@ -0,0 +1 @@
1

View File

@ -0,0 +1 @@
grand___chef

View File

@ -0,0 +1 @@
Moins de 16 ans

View File

@ -0,0 +1 @@
equipes-equipe

View File

@ -0,0 +1 @@
Super mais bla bla bla.

View File

@ -0,0 +1 @@
grand___chef

View File

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

View File

@ -0,0 +1 @@
grand___chef

View File

@ -0,0 +1 @@
Le site web est genial...

View File

@ -1 +0,0 @@
Nouveau sujet

View File

@ -0,0 +1 @@
Ce sujet est une polémique !

View File

@ -0,0 +1 @@
grand___chef

View File

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

View File

@ -0,0 +1 @@
Mais non !

View File

@ -0,0 +1 @@
grand___chef

View File

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

View File

@ -0,0 +1 @@
Mais si !

View File

@ -0,0 +1 @@
grand___chef

View File

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

View File

@ -0,0 +1 @@
3

View File

@ -0,0 +1 @@
Polémique

View File

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

View File

@ -1 +1 @@
Description du forum.
Description du forum. Pas de grossieretes...

View File

@ -1 +1 @@
Une jolie galerie d'art. Un petit test pour l'édition...
Bla-bla sur le copyright et toutes ces choses-là...

View File

@ -1 +1 @@
Galerie Test
Enregistrements

View File

@ -1 +0,0 @@
periode 1

View File

@ -1 +0,0 @@
galerie-periode

View File

@ -1 +0,0 @@
evenement a

Some files were not shown because too many files have changed in this diff Show More