Gestion widgets + paramètres widgets, fonction Page->rendu(), plein d'autres choses...

This commit is contained in:
Georges Dupéron 2010-10-05 17:35:58 +02:00
parent a75254c8ca
commit 180fcbe171
5 changed files with 110 additions and 25 deletions

View File

@ -5,12 +5,21 @@ class Debug {
public static function niy($msg) { public static function niy($msg) {
array_push(self::$errors, "Not implemented yet : $msg"); array_push(self::$errors, "Not implemented yet : $msg");
} }
public static function info($msg) {
array_push(self::$errors, "Info : $msg");
}
public static function error($msg) {
array_push(self::$errors, "Error : $msg");
self::afficher();
die();
}
public static function afficher() { public static function afficher() {
echo "<pre>"; echo "<pre>";
echo "Erreurs:\n"; echo '<span style="color:red">Erreurs:</span>' . "\n";
foreach (self::$errors as $e) { foreach (self::$errors as $e) {
echo $e . "\n"; echo $e . "\n";
} }
echo '<span style="color:red">Fin erreurs.</span>' . "\n";
echo "</pre>"; echo "</pre>";
} }
} }

View File

@ -10,8 +10,10 @@ class ElementDocument {
public $espaceCss = null; public $espaceCss = null;
private static $enfantsÉléments = array(); private static $enfantsÉléments = array();
private static $attributsÉléments = array(); private static $attributsÉléments = array();
private static $widgets = array();
private $type = null; private $type = null;
private $enfants = array(); private $enfants = array();
private $attr = array();
public static function ajouter_type_élément($type, $typesEnfants, $attributs = "") { public static function ajouter_type_élément($type, $typesEnfants, $attributs = "") {
self::$enfantsÉléments[$type] = qw($typesEnfants); self::$enfantsÉléments[$type] = qw($typesEnfants);
@ -19,7 +21,7 @@ class ElementDocument {
} }
public static function ajouter_widget($nom, $callback) { public static function ajouter_widget($nom, $callback) {
niy("ajouter_widget"); self::$widgets["w_" . $nom] = $callback;
} }
public function inclure($elem) { public function inclure($elem) {
@ -27,8 +29,26 @@ class ElementDocument {
niy("inclure"); niy("inclure");
} }
public function to_XHTML_5() { public function attr($nom, $valeur) {
niy("to_XHTML_5"); $this->attr[$nom] = $valeur;
}
public function to_XHTML_5($indent = "") {
$ret = "";
$ret .= "$indent<" . $this->type;
foreach ($this->attr as $k => $v) {
$ret .= " " . $k . '="' . htmlspecialchars($v) . '"'; // TODO : htmlspecialchars ne suffit pas !
}
if (count($this->enfants) == 0) {
$ret .= "/>\n";
} else {
$ret .= ">\n";
foreach ($this->enfants as $k => $v) {
$ret .= $v->to_XHTML_5($indent . " ");
}
$ret .= "$indent</" . $this->type . ">\n";
}
return $ret;
} }
public function to_HTML_5() { public function to_HTML_5() {
@ -52,9 +72,20 @@ class ElementDocument {
if (array_key_exists($this->type, self::$enfantsÉléments) if (array_key_exists($this->type, self::$enfantsÉléments)
&& in_array($fn, self::$enfantsÉléments[$this->type])) { && in_array($fn, self::$enfantsÉléments[$this->type])) {
$elem = new self($fn); $elem = new self($fn);
foreach (self::$attributsÉléments[$fn] as $i => $nom) {
$elem->attr($nom, $args[$i]);
}
$this->enfants[] = $elem; $this->enfants[] = $elem;
return $elem; return $elem;
} else if (array_key_exists($fn, self::$widgets)) {
$f = self::$widgets[$fn];
$a = $args;
array_unshift($a, $this);
return call_user_func_array($f, $a);
} else { } else {
Debug::error("Impossible d'ajouter un élément $fn");
return null; return null;
} }
} }
@ -63,36 +94,66 @@ class ElementDocument {
class Document extends ElementDocument { class Document extends ElementDocument {
} }
/*****
TODO
Comment s'assurer que le header, footer, nav soit unique ?
******/
$inline_elems = "span text a strong em img";
ElementDocument::ajouter_type_élément("document", "header footer nav article script style"); ElementDocument::ajouter_type_élément("document", "header footer nav article script style");
ElementDocument::ajouter_type_élément("header", "title"); ElementDocument::ajouter_type_élément("header", "title");
ElementDocument::ajouter_type_élément("title", "text");
ElementDocument::ajouter_type_élément("footer", ""); ElementDocument::ajouter_type_élément("footer", "");
ElementDocument::ajouter_type_élément("nav", "ul"); ElementDocument::ajouter_type_élément("nav", "ul");
ElementDocument::ajouter_type_élément("article", "ul p form"); ElementDocument::ajouter_type_élément("article", "ul p form");
ElementDocument::ajouter_type_élément("script", "", "src"); ElementDocument::ajouter_type_élément("script", "", "src");
ElementDocument::ajouter_type_élément("style", "", "src"); ElementDocument::ajouter_type_élément("style", "", "src");
ElementDocument::ajouter_type_élément("ul", "li"); ElementDocument::ajouter_type_élément("ul", "li");
ElementDocument::ajouter_type_élément("li", "text a strong em"); ElementDocument::ajouter_type_élément("li", $inline_elems);
ElementDocument::ajouter_type_élément("form", "input_text_line input_text_multi input_text_rich input_file"); ElementDocument::ajouter_type_élément("form", "input_text_line input_text_multi input_text_rich input_file");
ElementDocument::ajouter_type_élément("a", "text strong em", "href"); ElementDocument::ajouter_type_élément("a", $inline_elems, "href");
ElementDocument::ajouter_type_élément("span", "text a strong em", "class"); ElementDocument::ajouter_type_élément("span", $inline_elems, "class");
ElementDocument::ajouter_type_élément("img", "", "alt src"); ElementDocument::ajouter_type_élément("img", "", "alt src");
// ElementDocument::ajouter_type_élément("", ""); ElementDocument::ajouter_type_élément("p", $inline_elems);
ElementDocument::ajouter_type_élément("text", "", "text");
ElementDocument::ajouter_widget("titre", function($d, $select){
// renvoie un <h2> ou un <input> selon les droits
return $d->header()->title()->text("Not Implemented Yet : w_titre($select)");
});
ElementDocument::ajouter_widget("en_tete", function($d){
//$d->w_titre($this->select("titre"));
//$d->w_description($this->select("description"));
$d->w_titre("NIY en_tete");
$d->w_description("NIY en_tete");
});
ElementDocument::ajouter_widget("description", function($d, $select){
return $d->article()->p()->text("NIY Descrption($select)");
});
//ElementDocument::ajouter_widget("titre", function($select){}); // renvoie un <h2> ou un <input> selon les droits
//ElementDocument::ajouter_widget("richText", function($select){}); // similaire //ElementDocument::ajouter_widget("richText", function($select){}); // similaire
//ElementDocument::ajouter_widget("field", function($select){}); // ... //ElementDocument::ajouter_widget("field", function($select){}); // ...
// Peut-être que _field peut détecter automatiquement s'il faut traiter un champ de la BDD // Peut-être que _field peut détecter automatiquement s'il faut traiter un champ de la BDD
// (par ex. pour le richText) en fonction d'une info "type" dans la classe correspondant à la page de ce champ ? // (par ex. pour le richText) en fonction d'une info "type" dans la classe correspondant à la page de ce champ ?
//ElementDocument::ajouter_widget("liste", function($select, $function_formattage_elements)); ElementDocument::ajouter_widget("liste", function($d, $select, $function_formattage_elements) {
$l = $d->ul();
$l->li()->text("Not Implemented Yet");
return $l;
});
/* Widgets : /* Widgets :
function en_tete() {
$d = new Document();
$d->titre($this->select("titre"));
$d->description($this->select("description"));
return $d;
}
function liste($elts, $format) { function liste($elts, $format) {
$d = new Document(); $d = new Document();
$ul = $d->append->ul(); $ul = $d->append->ul();

View File

@ -2,9 +2,12 @@
function main() { function main() {
$g = new GalerieIndex(); $g = new GalerieIndex();
$g->res_h_page();
Debug::afficher(); Debug::afficher();
$p = $g->rendu();
echo "<pre>";
echo htmlspecialchars($p->to_XHTML_5());
echo "</pre>";
} }
?> ?>

View File

@ -3,6 +3,8 @@
// TODO : gestion du renomage (pseudo-réécriture d'URL). // TODO : gestion du renomage (pseudo-réécriture d'URL).
class Page { class Page {
public static $types = array();
// Convention de nommage : // Convention de nommage :
// res_h_xxx = html, res_i_xxx = image, res_c_xxx = css, res_j_xxx = javascript // res_h_xxx = html, res_i_xxx = image, res_c_xxx = css, res_j_xxx = javascript
public static function ressources_statiques() { public static function ressources_statiques() {
@ -27,8 +29,7 @@ class Page {
} }
public static function ajouter_type($type) { public static function ajouter_type($type) {
niy("Page::ajouter_type($type);"); array_push(self::$types, $type);
// Insérer la ressource "res_c_style" dans le CSS principal
} }
private $parent = null; private $parent = null;
@ -38,7 +39,12 @@ class Page {
public function rendu() { public function rendu() {
// Renvoie un document (classe ElementDocument). // Renvoie un document (classe ElementDocument).
niy("rendu"); // L'appel à une fonction statique via $this-> n'est pas propre, mais comment appeller la
// fonction du sous-type et pas celle de Page sinon ?
if (count($this->ressources_dynamiques()) == 0)
return new Document();
$res = $this->ressources_dynamiques();
return call_user_func(array($this, "res_" . $res[0]));
} }
public function url($ressource = null) { public function url($ressource = null) {
@ -96,6 +102,14 @@ class Page {
} }
class CollectionPages { class CollectionPages {
public function size() {
niy("CollectionPages::size()");
}
public function get($i) {
niy("CollectionPages::get($i)");
}
function __construct() { function __construct() {
niy("CollectionPages"); niy("CollectionPages");
} }

View File

@ -39,7 +39,7 @@ abstract class GalerieBase extends Page {
}); });
$nouveau = $l->li(); $nouveau = $l->li();
$nouveau->span("miniature")->img("", $this->url("i_icône_nouvelle_page")); $nouveau->span("miniature")->img("", $this->url("i_icône_nouvelle_page"));
$nouveau->span("titre")->texte(self::$texte_nouvelle_page); $nouveau->span("titre")->text(self::$texte_nouvelle_page);
return $d; return $d;
} }
@ -51,8 +51,6 @@ abstract class GalerieBase extends Page {
} }
public function res_h_mini_miniature() { public function res_h_mini_miniature() {
// Prendre le 1er par ordre décroissant sur la date, ou bien :
// TODO : prendre l'élément ayant la propriété "aperçu" à true (s'il y en a un, sinon date).
$a = $this->enfants("@apercu = true", "date desc", 1); $a = $this->enfants("@apercu = true", "date desc", 1);
if ($a->size() != 1) if ($a->size() != 1)
$a = $this->enfants(true, "date desc", 1); $a = $this->enfants(true, "date desc", 1);