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 = '';
            $ret .= '<h2>Administration</h2>';
            $ret .= '<ul>';
            foreach (Stockage::liste_enfants($chemin) as $k) {
                if (Stockage::get_prop($k, "inclure_administration") == "oui") {
                    $ret .= '<li>';
                    $ret .= '<a href="' . $k->get_url() . '">';
                    // TODO : escape l'url !
                    $ret .= Stockage::get_prop($k, "titre");
                    $ret .= '</a>';
                    $ret .= '</li>';
                }
            }
            $ret .= '</ul>';
            return new Page($ret, Stockage::get_prop($chemin, "nom_site"));
        }
        return new Page('', '');
        // TODO : devrait renvoyer une page d'erreur !
    }
}
Modules::enregister_module("AdminIndex", "admin-index", "vue");
                $ret .= '</li>';
            }
            $ret .= '</ul>';
            $ret .= '<div class="clearboth"></div>';
            $ret .= '</div>';
            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 la période"/>';
                $ret .= '</form>';
            }
            return new Page($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"));
            } 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");
                }
            }
        }
    }
}
Modules::enregister_module("GaleriePériode", "galerie-periode", "vue", "titre 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 l\'équipe"/>';
                $ret .= '</form>';
            }
            $ret .= '<ul class="équipes équipe">';
            foreach (stockage::liste_enfants($chemin) as $k) {
                $ret .= '<li>' . Modules::vue($k)->contenu . '</li>';
            }
            if (Permissions::vérifier_permission($chemin, "nouvelle_page", Authentification::get_utilisateur())) {
                $ret .= '<li>';
                $ret .= '<form class="équipes équipe 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 joueur"/>';
                $ret .= '</p>';
                $ret .= '</form>';
                $ret .= '</li>';
            }
            $ret .= '</ul>';
            return new Page($ret, Stockage::get_prop($chemin, "titre"));
        } else {
            if ($vue == "miniature") {
                return new Page("Équipe.", Stockage::get_prop($chemin, "titre"));
            }
        }
    }
}
Modules::enregister_module("ÉquipesÉquipe", "equipes-equipe", "vue", "titre");
            $ret .= '</div>';
            $ret .= '<div class="description-site">';
            if (Permissions::vérifier_permission($chemin, "set_prop", Authentification::get_utilisateur())) {
                $ret .= '<form class="nom_site infos" method="post" action="' . $chemin->get_url() . '">';
                $ret .= '<h2><input type="text" name="nom_site" value="' . Stockage::get_prop($chemin, "nom_site") . '" /></h2>';
                $ret .= '<p><input type="submit" value="appliquer" /></p>';
                $ret .= '</form>';
            } else {
                $ret .= "<h2>" . Stockage::get_prop($chemin, "nom_site") . "</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, "description"), "description");
                $ret .= '<p><input type="submit" value="appliquer" /></p>';
                $ret .= '</form>';
            } else {
                $ret .= Stockage::get_prop($chemin, "description");
            }
            $ret .= '</div>';
            return new Page($ret, Stockage::get_prop($chemin, "nom_site"));
        } else {
            if ($vue == "css") {
                return new Page(get_css(), "text/css", "raw");
            }
        }
        return new Page('', '');
        // TODO : devrait renvoyer une page d'erreur !
    }
}
Modules::enregister_module("SiteIndex", "site-index", "vue", "nom_site prochain_evenement description");
            if (Permissions::vérifier_permission($chemin, "nouvelle_page", Authentification::get_utilisateur())) {
                $ret .= '<li>';
                $ret .= '<div class="titre">';
                $ret .= '<form class="equipes 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 équipe"/>';
                $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>';
                $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("ÉquipesIndex", "equipes-index", "vue", "titre description");
                return self::vue($chemin, $paramètres["vue"]);
            } else {
                return self::vue($chemin);
            }
        }
    }
    public static function vue($chemin, $vue = "normal")
    {
        $singleton = new Chemin("/admin/utilisateurs/");
        if ($vue == "normal") {
            $ret = '';
            $ret .= "<h2>Utilisateurs</h2>";
            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>';
            $listegroupes = "";
            // Construire la liste des groupes sous forme de menu drop-down.
            foreach (Authentification::liste_utilisateurs() as $u) {
                $ret .= '<tr>' . '<form action="' . $chemin->get_url() . '">' . '<td>' . $u . '</td>' . '<td>' . $u . '</td>' . '<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_peut_se_connecter($u) ? "oui" : "non") . '</td>' . '<td><input type="submit" value="appliquer"/></td>' . '<td><input type="submit" value="supprimer"/></td>' . '</form>' . '</tr>';
                // Le champ mot de passe doit être un lien / bouton "nouveau
                // mot de passe automatique" qui redirige vers
                // $chemin->enfant("$utilisateur") ?action=gen_mdp .
            }
            $ret .= '</tbody></table>';
            return new Page($ret, "Utilisateurs");
        }
    }
}
Modules::enregister_module("AdminUtilisateurs", "admin-utilisateurs", "vue", "nouveau_nom nom mot_de_passe groupe peut_se_connecter");
                $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($ret, Stockage::get_prop($chemin, "titre"));
        }
    }
}
Modules::enregister_module("ContactIndex", "contact-index", "vue", "titre description");
                $ret .= '<li>';
                $ret .= '<div class="titre">';
                $ret .= '<form class="forum 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", "titre description");
        } else {
            if (isset($paramètres["regles"])) {
                Stockage::set_prop($singleton, "regles", $paramètres["regles"]);
            }
            if (isset($paramètres["vue"])) {
                return self::vue($chemin, $paramètres["vue"]);
            } else {
                return self::vue($chemin);
            }
        }
    }
    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>";
            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");
        }
    }
}
Modules::enregister_module("AdminPermissions", "admin-permissions", "vue", "regles");
                } 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");
                    }
                }
            }
        }
    }
    public static function formulaire_connexion($chemin, $titre = "Connexion", $message = "")
    {
        // TODO
        $ret = "<h2>" . $titre . "</h2>";
        $ret .= $message;
        $ret .= '<form method="post" action="' . $chemin->get_url() . '">';
        $ret .= '<p><label for="utilisateurnom">Nom : </label><input type="text" id="utilisateurnom" name="utilisateurnom" value="" /></p>';
        $ret .= '<p><label for="utilisateurprenom">Prénom : </label><input type="text" id="utilisateurprenom" name="utilisateurprenom" value="" /></p>';
        $ret .= '<p><label for="mdp">Mot de passe : </label><input type="password" id="mdp" name="mdp" value="" /></p>';
        $ret .= '<p>';
        $ret .= '<input type="hidden" name="action" value="connexion" />';
        $ret .= '<input type="submit" value="Connexion" />';
        $ret .= '</p>';
        $ret .= '</form>';
        return $ret;
    }
}
Modules::enregister_module("AdminConnexion", "admin-connexion", "vue", "utilisateurnom utilisateurprenom mdp");
                $ret .= '</li>';
            }
            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 .= '</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 .= '</p>';
                $ret .= '</form>';
                $ret .= '</div>';
                $ret .= '</li>';
            }
            $ret .= '</ul>';
            $ret .= '<div class="clearboth"></div>';
            $ret .= '</div>';
            return new Page($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");
            }
        }
    }
}
Modules::enregister_module("GalerieIndex", "galerie-index", "vue", "titre 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 sujet"/>';
                $ret .= '</form>';
            }
            $ret .= '<ul class="forum sujet">';
            foreach (stockage::liste_enfants($chemin) as $k) {
                $ret .= '<li>' . Modules::vue($k)->contenu . '</li>';
            }
            if (Permissions::vérifier_permission($chemin, "nouvelle_page", Authentification::get_utilisateur())) {
                $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="Nouveau message"/>';
                $ret .= '</p>';
                $ret .= '</form>';
                $ret .= '</li>';
            }
            $ret .= '</ul>';
            return new Page($ret, Stockage::get_prop($chemin, "titre"));
        } else {
            if ($vue == "miniature") {
                return new Page("Sujet.", Stockage::get_prop($chemin, "titre"));
            }
        }
    }
}
Modules::enregister_module("ForumSujet", "forum-sujet", "vue", "titre");
                // 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");
                $ret .= '<p>';
                $ret .= '<input type="hidden" name="action" value="nouvelle_page"/>';
                $ret .= '<input type="submit" value="Nouvel article"/>';
                $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 .= '<p class="contenu">';
                $ret .= $mini->contenu;
                $ret .= '</p>';
                $ret .= '</a>';
                $ret .= '</li>';
            }
            $ret .= '</ul>';
            return new Page($ret, Stockage::get_prop($chemin, "titre"));
        }
    }
}
Modules::enregister_module("ArticlesIndex", "articles-index", "vue", "titre description");
            $ret = '';
            if (Permissions::vérifier_permission($chemin, "set_prop", Authentification::get_utilisateur())) {
                $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>';
                $ret .= '<li><label for="Couleur_B">Couleur B : </label><input type="text" id="Couleur_B" name="Couleur_B" value="#eee" /></li>';
                $ret .= '<li><label for="Couleur_C">Couleur C : </label><input type="text" id="Couleur_C" name="Couleur_C" value="#ff6" /></li>';
                $ret .= '<li><label for="Couleur_D">Couleur D : </label><input type="text" id="Couleur_D" name="Couleur_D" value="#fff" /></li>';
                $ret .= '</ul>';
                $ret .= '<p>';
                $ret .= '<input type="submit" value="Appliquer" />';
                $ret .= '</p>';
            } else {
                $ret .= '<ul>';
                $ret .= '<li>Couleur A : ' . Stockage::get_prop($chemin, "Coucleur_A") . '</li>';
                $ret .= '<li>Couleur B : #eee</li>';
                $ret .= '<li>Couleur C : #ff6</li>';
                $ret .= '<li>Couleur D : #fff</li>';
                $ret .= '</ul>';
            }
            return new Page($ret, "Apparence");
        } else {
            if ($vue == "css") {
                // TODO : où mettre ce gen_css... ?
                return Site::gen_css(array("Couleur_A" => Stockage::get_prop($chemin, "Coucleur_A"), "Couleur_B" => Stockage::get_prop($chemin, "Coucleur_B"), "Couleur_C" => Stockage::get_prop($chemin, "Coucleur_C"), "Couleur_D" => Stockage::get_prop($chemin, "Coucleur_D")));
            }
        }
    }
}
Modules::enregister_module("AdminApparence", "admin-apparence", "vue", "Couleur_A Couleur_B Couleur_C Couleur_D");
                return new Page($chemin->parent(), '', "redirect");
            } else {
                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")
    {
        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 new Page($ret, Stockage::get_prop($chemin, "titre"));
        }
    }
}
Modules::enregister_module("ForumMessage", "forum-message", "vue", "message");
    }
    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="équipes joueur 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 joueur ' . htmlspecialchars(Stockage::get_prop($chemin, "prenom") . " " . Stockage::get_prop($chemin, "nom")) . '"/>';
                $ret .= '</form>';
            }
            // 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"));
        }
    }
}
Modules::enregister_module("ÉquipesJoueur", "equipes-joueur", "vue", "nom prenom description");
                $ret .= '</li>';
            }
            $ret .= '</ul>';
            $ret .= '<div class="clearboth"></div>';
            $ret .= '</div>';
            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 l\'évènement"/>';
                $ret .= '</form>';
            }
            return new Page($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"));
            } 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");
                }
            }
        }
    }
}
Modules::enregister_module("GalerieÉvènement", "galerie-evenement", "vue", "titre description");
        $image = imagecreatefromjpeg($chemin_fs);
        // ... formpng()
        $largeur = imageSX($image);
        $hauteur = imageSY($image);
        if ($largeur < $largeur_max && $hauteur < $hauteur_max) {
            $largeur_miniature = $largeur;
            $hauteur_miniature = $hauteur;
        } else {
            if ($largeur / $hauteur < $largeur_max / $hauteur_max) {
                // limité par la hauteur.
                $largeur_miniature = $largeur_max;
                $hauteur_miniature = $hauteur * $largeur_miniature / $largeur;
            } else {
                // limité par la largeur
                $hauteur_miniature = $hauteur_max;
                $largeur_miniature = $largeur * $hauteur_miniature / $hauteur;
            }
        }
        $miniature = ImageCreateTrueColor($largeur_miniature, $hauteur_miniature);
        // miniatures de tailles différentes
        var_dump($largeur_miniature, $hauteur_miniature, $largeur, $hauteur);
        imagecopyresampled($miniature, $image, 0, 0, 0, 0, $largeur_miniature, $hauteur_miniature, $largeur, $hauteur);
        imagedestroy($image);
        // On libère la mémoire le plus tôt possible.
        imagejpeg($miniature, $chemin_fs_dest);
        imagedestroy($miniature);
        return $chemin_fs_dest;
    }
}
Modules::enregister_module("GaleriePhoto", "galerie-photo", "vue", "description", "fichier_image");
                return new Page($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="liens lien edition" enctype="multipart/form-data" method="post" action="' . $chemin->get_url() . '">';
                $ret .= '<input type="text" name="texte" value="' . Stockage::get_prop($chemin, "texte") . '" />';
                $ret .= '<input type="text" name="cible" value="' . Stockage::get_prop($chemin, "cible") . '" />';
                $ret .= formulaire_édition_texte_enrichi(Stockage::get_prop($chemin, "description"), "description");
                $ret .= '<p><input type="submit" value="appliquer" /></p>';
                $ret .= '</form>';
            } else {
                $ret .= '<a href="' . htmlspecialchars(Stockage::get_prop($chemin, "cible")) . '">' . Stockage::get_prop($chemin, "texte") . '</a>';
                $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 lien ' . htmlspecialchars(Stockage::get_prop($chemin, "cible")) . '"/>';
                $ret .= '</form>';
            }
            return new Page($ret, Stockage::get_prop($chemin, "titre"));
        }
    }
}
Modules::enregister_module("LiensLien", "liens-lien", "vue", "texte cible description");
        }
    }
    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($ret, Stockage::get_prop($chemin, "titre"));
        }
    }
}
Modules::enregister_module("ContactContact", "contact-contact", "vue", "nom prenom description");
                    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 article edition" enctype="multipart/form-data" 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, "contenu"), "contenu");
                $ret .= '<p><input type="submit" value="appliquer" /></p>';
                $ret .= '</form>';
            } else {
                $ret .= '<h2>' . Stockage::get_prop($chemin, "titre") . '</h2>';
                $ret .= affichage_texte_enrichi(Stockage::get_prop($chemin, "contenu"));
            }
            if (Permissions::vérifier_permission($chemin, "supprimer", Authentification::get_utilisateur())) {
                // TODO : afficher le bouton "Supprimer".
            }
            return new Page($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"));
        }
    }
}
Modules::enregister_module("ArticlesArticle", "articles-article", "vue", "titre contenu");
                $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="liens index description affichage">' . Stockage::get_prop($chemin, "description") . '</p>';
            }
            $ret .= '<div class="liens liste-liens index">';
            $ret .= '<ul>';
            if (Permissions::vérifier_permission($chemin, "nouvelle_page", Authentification::get_utilisateur())) {
                $ret .= '<li>';
                $ret .= '<div class="titre">';
                $ret .= '<form class="liens 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 lien"/>';
                $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($ret, Stockage::get_prop($chemin, "titre"));
        }
    }
}
Modules::enregister_module("LiensIndex", "liens-index", "vue", "titre description");