commit 37b29e5bdef8cd6663deb267f32044a57772694a
parent 4d3dd2d5d1eeedbba3e440517928505602169d11
Author: Georges Dupéron <jahvascriptmaniac+github@free.fr>
Date: Tue, 29 Jun 2010 04:57:35 +0200
Détection du type de la page, accès en lecture aux prop
Plus d'autres choses :
- Renomage des fichiers _prop_ en __prop__ (pour éviter les conflits).
- Utilisation d'un hack avec un faux "new" pour la détection du type de la page.
- Éviter de considérer les __prop__ comme des enfants, même si ce sont des dossiers.
- Utilisation de self au lieu de Page à plusieurs endroits.
- Exemple de test pour le type galerie.
Diffstat:
4 files changed, 54 insertions(+), 15 deletions(-)
diff --git a/controleur/page.php b/controleur/page.php
@@ -7,11 +7,11 @@ require_once("controleur/chemin_page.php");
// Protocole : http://site/actualités/?nouveau=Le%20titre
// Structure des répertoires
-// article/_prop_article
-// /_prop_type
-// /_prop_photo
-// /_prop_date
-// /_prop_lieu
+// article/__prop__article
+// /__prop__type
+// /__prop__photo
+// /__prop__date
+// /__prop__lieu
// /article_1 // Sous article
// /article_2 // Sous article
@@ -22,11 +22,36 @@ class Page {
self::$types[$nom] = $classe;
}
+
+ /* ****** Début du hack ****** */
+ // Lorsqu'on instancie un objet Page, il faudrait en fait instancier un objet Galerie ou Forum ou ...
+ // selon le type de la page. Il faut donc lors de l'instanciation modifier la classe de $this.
+ //
+ // C'est malheureusement impossible. Avec classkit_method_copy, il serait possible de recopier les
+ // méthodes de Galerie ou Forum ou ... par-dessus les méthodes de $this. Mais classkit_method_copy est
+ // expérimentale.
+ //
+ // Une autre approche consisterait à modifier toutes les méthodes de Page pour qu'elles appellent
+ // d'elles-même leur alter ego dans Galerie ou Forum. Mais ces méthodes (dans Galerie) ne pourraient
+ // pas se servir de la méthode parente (dans Page), donc pas d'héritage complet.
+ //
+ // La solution qui a été retenue consiste à appeller la fonction statique "Page::_new()" au lieu de
+ // "new Page()". Page::_new() détecte le type de la page et instancie la bonne classe.
+ // Cependant, pour accéder à __prop__type, il faudrait pouvoir utiliser Page->get_prop(), qui est non
+ // statique alors que Page::_new() est statique. On instancie donc un objet Page, on utilise
+ // Page->get_prop(), puis on instancie la bonne sous-classe de Page (Galerie, Forum, ...).
+
public static function _new($chemin) {
- // TODO : détecter le type à partir de _prop_type
- // Problème : pour pouvoir faire un get_prop, il faut qu'on ait déjà instancié la classe...
- return new self::$types["Galerie"]($chemin);
+ $page = new Page($chemin);
+ $type = $page->get_prop("type");
+ if (array_key_exists($type, self::$types)) {
+ return new self::$types[$type]($chemin);
+ } else {
+ return new self($chemin);
+ }
}
+ /* ****** Fin du hack ****** */
+
public function __construct($chemin) {
$this->chemin = new CheminPage($chemin);
@@ -44,7 +69,7 @@ class Page {
$enfants = Array();
foreach ($scandir as $k => $v) {
- if (is_dir(concaténer_chemin_fs($this->chemin_fs(), $v)) && $v != "." && $v != "..") {
+ if (strpos($v, "__prop__") !== 0 && is_dir(concaténer_chemin_fs($this->chemin_fs(), $v)) && $v != "." && $v != "..") {
$enfants[] = $this->enfant($v);
}
}
@@ -52,17 +77,17 @@ class Page {
}
public function enfant($nom) {
- return Page::_new($this->chemin->enfant($nom));
+ return self::_new($this->chemin->enfant($nom));
}
public function parent() {
- return Page::_new($this->chemin->parent());
+ return self::_new($this->chemin->parent());
}
public function nouveau($nom) {
// Si nom est null, utiliser "Article" + numéro
// Créer un sous-dossier "nom"
- // L'initialiser avec le modèle donné dans prop_modele_enfants
+ // L'initialiser avec le modèle donné dans __prop__modele_enfants
// Construire un objet Page (code commun avec Page::enfant(nom)).
}
@@ -71,9 +96,21 @@ class Page {
// alors supprimer récursivement le dossier courant
// sinon renvoyer FAUX
}
-
+
+ private function chemin_fs_prop($nom_propriété) {
+ return concaténer_chemin_fs($this->chemin_fs(), "__prop__" . $nom_propriété);
+ }
+
public function get_prop($nom_propriété) {
// lire le contenu du fichier prop_nom_propriété
+ // renvoie toujours une chaîne (vide si pas de propriété ou erreur).
+ $fichier = $this->chemin_fs_prop($nom_propriété);
+ if (file_exists($fichier)) {
+ $a = file_get_contents($fichier);
+ return ($a ? $a : '');
+ } else {
+ return "";
+ }
}
public function set_prop($nom_propriété, $valeur) {
diff --git a/index.php b/index.php
@@ -3,7 +3,7 @@
require_once("types/galerie.php");
-$p = new Galerie("/modele");
+$p = Page::_new("/modele/galerie");
print_r($p->vue());
diff --git a/modele/galerie/__prop__type b/modele/galerie/__prop__type
@@ -0,0 +1 @@
+Galerie
+\ No newline at end of file
diff --git a/types/galerie.php b/types/galerie.php
@@ -8,7 +8,7 @@ class Galerie extends Page {
$ret .= '<ul>';
foreach ($this->liste_enfants() as $k) {
- $ret .= '<li><a href="' . $k->url() . '">' . $k->chemin->get() . $k->vue('miniature') . '</a></li>';
+ $ret .= '<li><a href="' . $k->url() . '">' . '['.$k->chemin->get().'] ' . $k->vue('miniature') . '</a></li>';
}
$ret .= '</ul>';