www

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README

commit 3afe99ebb4a09f0248de0c78430f04954d722ba8
parent b27eabf106b5d1cf7ee9e450311ebb53a8123c42
Author: Georges Dupéron <jahvascriptmaniac+github@free.fr>
Date:   Wed, 23 Jun 2010 22:42:47 +0200

Refactoring : La (nouvelle) classe CheminPage s'occupe de la manipulation des chemins du site (gallerie/évènement3/photo5), la classe Page l'utilise et ne fait plus de manipulations de chemins directement.

Diffstat:
Acontroleur/chemin_page.php | 43+++++++++++++++++++++++++++++++++++++++++++
Mcontroleur/page.php | 57++++++++++++++++++++++++---------------------------------
2 files changed, 67 insertions(+), 33 deletions(-)

diff --git a/controleur/chemin_page.php b/controleur/chemin_page.php @@ -0,0 +1,42 @@ +<?php + +// Note : L'implémentation de CheminPage pourrait utiliser une pile au lieu des chaînes de caractère : +// ["Chemin", "Vers", "Page"] == "/Chemin/Vers/Page" + +class CheminPage { + public function __construct($chemin) { + $this->chemin = CheminPage::nettoyer_chemin($chemin); + } + + public function get() { + return $this->chemin; + } + + public function enfant($nom) { + return $this->chemin . '/' . CheminPage::nettoyer_chemin($nom); + } + + public function parent() { + $slash = strrpos($this->chemin, '/'); + if ($slash !== false) { + return substr($this->chemin, 0, $slash); + } else { + return '/'; + } + } + + public static function nettoyer_chemin($chemin) { + // SECURITE : $chemin_nettoyé + // * Ne contient pas '\0' + // * Ne contient pas '../' + // * Ne contient pas de double occurence de '/' + // * Ni d'autres bizarreries des chemins de fichiers. + // * Ne contient pas _prop_ + // * Ne se termine pas par '/' + // * Commence par '/' + + // TODO + return $chemin; + } + +} +\ No newline at end of file diff --git a/controleur/page.php b/controleur/page.php @@ -1,57 +1,48 @@ <?php +require_once("util.php"); require_once("config.php"); +require_once("controleur/chemin_page.php"); // Protocole : http://site/actualités/?nouveau=Le%20titre -// SECURITE : Invariants de sécurité : -// Page::chemin ne contient jamais de chaîne '../' ou autres bizarreries des chemins de fichiers. -// Donc on peut concaténer Page::chemin à un chemin dans le système de fichiers et être sûr d'être dans un sous-dossier. -// TODO : Lors de la construction d'un chemin, tous les composants doivent être nettoyés. - -// TODO : créer une classe chemin_page +// Structure des répertoires +// article/_prop_article +// /_prop_type +// /_prop_photo +// /_prop_date +// /_prop_lieu +// /article_1 // Sous article +// /article_2 // Sous article class Page { - // article/prop_article - // /prop_type - // /prop_photo - // /prop_date - // /prop_lieu - // /article_1 // Sous article - // /article_2 // Sous article - public function __construct($chemin) { - // SECURITE : chemin doit être un sous-dossier de .../modele/ - $this->chemin = nettoyer_chemin($chemin); - } - - // Nettoie un chemin de page pour qu'il respecte l'invariant de sécurité. - public static function nettoyer_chemin($chemin) { - return $chemin; + $this->chemin = new CheminPage($chemin); } // Renvoie le chemin de la page dans le système de fichiers private function chemin_fs() { - return concaténer_chemin_fs($config_chemin_base, $this->chemin); + global $config_chemin_base; + return concaténer_chemin_fs($config_chemin_base, $this->chemin->get()); } public function liste_enfants() { - $lst = scandir($this->chemin_fs()); - $lst_enfants = Array(); - if ($lst !== false) { - foreach ($lst as $k => $v) { - $lst_enfants[] = $this->enfant($v); - } + $scandir = scandir($this->chemin_fs()); + if ($scandir === false) { error_log("Impossible d'accéder à la liste des pages enfant de " . $this->chemin->get()); } + + $enfants = Array(); + foreach ($scandir as $k => $v) { + $enfants[] = $this->enfant($v); } - return $lst_enfants; + return $enfants; } public function enfant($nom) { - return new Page(nettoyer_chemin($this->chemin) . '/' . nettoyer_chemin($nom)); + return new Page($this->chemin->enfant($nom)); } public function parent() { - return new Page(nettoyer_chemin($this->chemin) . '/..'); // TODO + return new Page($this->chemin->parent()); } public function nouveau($nom) { @@ -78,11 +69,11 @@ class Page { public function url() { // calculer l'url de cette page en fonction de son chemin et de l'url de base global $config_url_base; - return $config_url_base . $this->chemin; + return $config_url_base . $this->chemin->get(); } public function vue() { - return "Aucune vue pour «" . $this->chemin . "» ."; + return "Aucune vue pour «" . $this->chemin->get() . "» ."; } }