Création d'une nouvelle instance d'une sous-classe de Page en fonction de l'uid.

+ Page->enfants() marche presque.
This commit is contained in:
Georges Dupéron 2010-10-12 19:23:40 +02:00
parent 20aafcf6dc
commit 0a9a9aa99f
7 changed files with 70 additions and 121 deletions

View File

@ -1,19 +1,5 @@
<?php <?php
// Le widget w_img doit gérer le stockage de l'image dans un dossier, la création de la miniature et le stockage dans la BDD du chemin vers l'image.
/*
Base de données :
table page (uid autoincrement primary key, nomSysteme, composantUrl, parent)
Racine : (?,'racine','',NULL)
table propriétés(uid auto pk, fk uid_page, bool systeme, nom, valeur)
(?,true,dateCréation,?)
(?,true,dateModification,?)
(?,false,publier,?)
(?,true,nomSysteme,?)
(?,true,composantUrl,?)
*/
// Lors d'une requête, ne renvoyer que les éléments que l'utilisateur a // Lors d'une requête, ne renvoyer que les éléments que l'utilisateur a
// le droit de voir. Filtrage après la requête (attention au LIMIT et OFFSET !) ? // le droit de voir. Filtrage après la requête (attention au LIMIT et OFFSET !) ?
// ou y a-t-il moyen d'exprimer ça directement dans la requête ? // ou y a-t-il moyen d'exprimer ça directement dans la requête ?
@ -41,6 +27,9 @@ class BDD {
public static function reset() { public static function reset() {
self::unbuf_query('drop table if exists ' . self::table("pages")); self::unbuf_query('drop table if exists ' . self::table("pages"));
self::unbuf_query('drop table if exists ' . self::table("liens")); self::unbuf_query('drop table if exists ' . self::table("liens"));
foreach (self::select('select * from ' . self::table("modules")) as $module) {
self::unbuf_query('drop table if exists ' . self::table($module["nom_module"]));
}
// TODO : drop les tables des classes (les noms sont dans self::table("modules")). // TODO : drop les tables des classes (les noms sont dans self::table("modules")).
self::unbuf_query('drop table if exists ' . self::table("modules")); self::unbuf_query('drop table if exists ' . self::table("modules"));
self::init(); self::init();
@ -62,7 +51,7 @@ class BDD {
. ')'); . ')');
self::unbuf_query('create table if not exists ' . self::table("modules") . ' (' self::unbuf_query('create table if not exists ' . self::table("modules") . ' ('
. 'modules varchar(50) primary key' . 'nom_module varchar(50) primary key'
. ')'); . ')');
$table = "create table if not exists " . self::table("pages") . " (uid_page integer auto_increment primary key"; $table = "create table if not exists " . self::table("pages") . " (uid_page integer auto_increment primary key";
@ -80,20 +69,24 @@ class BDD {
} }
} }
$table .= ")"; $table .= ")";
self::unbuf_query($table);
self::modify("replace into " . self::table("modules") . " values('" . $nom_module . "')"); self::modify("replace into " . self::table("modules") . " values('" . $nom_module . "')");
self::unbuf_query($table);
} }
self::test(); self::test();
} }
public static function test() { public static function test() {
// Insertion de la racine : // TODO : dans les modules qui proposent un nom_systeme, faire une fonction init_<nom_systeme>
self::modify("replace into " . self::table("pages") . " values(1, '0', '0', 'true', 'racine', '', 'mGalerieIndex')"); // Cette fonction sera appellée lors de l'initialisation de la BDD.
self::modify("replace into " . self::table("pages") . " values(2, '0', '0', 'true', '', '', 'mGaleriePeriode')"); self::modify("replace into " . self::table("pages") . " values(1, '0', '0', 'true', 'racine', '', 'mGalerieIndex', 'true')");
self::modify("replace into " . self::table("pages") . " values(3, '0', '0', 'true', '', '', 'mGaleriePeriode')"); self::modify("replace into " . self::table("pages") . " values(2, '0', '0', 'true', '', 'periode-1', 'mGaleriePeriode', 'true')");
self::modify("replace into " . self::table("liens") . " values(1, 2, 'enfant')"); self::modify("replace into " . self::table("pages") . " set uid_page = 3, date_creation = '0', date_modification = '0', publier = 'true', nom_systeme = '', composant_url = 'periode-2', type = 'mGaleriePeriode', dans_nouveautes = 'false'");
self::modify("replace into " . self::table("liens") . " values(1, 3, 'enfant')"); self::modify("replace into " . self::table("liens") . " values(1, 2, 'enfants')");
self::modify("replace into " . self::table("liens") . " values(1, 3, 'enfants')");
self::modify("replace into " . self::table("mGalerieIndex") . " values(1, 'Galerie', 'une galerie')");
self::modify("replace into " . self::table("mGaleriePeriode") . " values(2, 'Periode 1', 'été')");
self::modify("replace into " . self::table("mGaleriePeriode") . " values(3, 'Periode 2', 'hiver')");
} }
public static function begin_transaction() { public static function begin_transaction() {
@ -113,7 +106,7 @@ class BDD {
debug::info("sql : " . $q); debug::info("sql : " . $q);
$qres = mysql_query($q, BDD::get()) or Debug::sqlerror(); $qres = mysql_query($q, BDD::get()) or Debug::sqlerror();
$ret = array(); $ret = array();
while ($row = mysql_fetch_array($qres)) { while ($row = mysql_fetch_assoc($qres)) {
$ret[] = $row; $ret[] = $row;
} }
return $ret; return $ret;
@ -137,53 +130,4 @@ class BDD {
} }
} }
/*
class DB extends Selectable {
private static $handle = null;
public function __construct() {
if (self::$handle === null) {
niy("Connexion à la BDD");
} else {
return self::$handle;
}
}
}
class Selectable {
// TODO : comment faire un select sur la table page ?
// TODO : comment créer une nouvelle page ?
function select($qw_champs, $qw_ordre = "", $limit = 0, $offset = 0) {
// Retourne un selectable, qui a une méthode run() (la méthode run renvoie la liste d'éléments. Chaque élément a une méthode set()).
// Une limit de 0 signifie qu'on prend tous les éléments à partir de $offset.
}
function set($valeur, $qw_champs) {
// Appelle set(valeur) sur chaque élément de $this->select(champs, ordre, 0, 0)->run()
}
function set_with_uid($valeur, int $uid) {
// Appelle set(valeur) sur la ligne de la base de données avec cet uid.
// Les <form> des pages ont des champ <input type="hidden" name"_uid_"> et un bouton submit.
// Lorsqu'on active ce submit, les lignes correspondant aux _uid_ dans la base de données reçoivent la bonne valeur.
}
function sql() {
}
function add_setter($condition, $fonction_setter) {
// Si on fait un set qui remplit la condition, la fonction_setter est appellée au lieu de modifier directement la bdd.
// Condition peut être :
// true // toujours appellé (pour les permissions, les dates de modification etc.).
// type de page parente // lorsqu'on récupère la liste des enfants d'une page de ce type.
// type de page, nom attribut // lorsqu'on récupère cet attribut d'une page de ce type.
}
function add_getter($condition, $fonction_getter) {
// Comme add_setter().
}
}
*/
?> ?>

View File

@ -225,6 +225,7 @@ ElementDocument::add_widget("bool", function($d, $select){
}); });
// Le widget w_img_file doit gérer le stockage de l'image dans un dossier, la création de la miniature et le stockage dans la BDD du chemin vers l'image.
ElementDocument::add_widget("img_file", function($d, $select){ ElementDocument::add_widget("img_file", function($d, $select){
// input[file] et <img> // input[file] et <img>
return $d->text("Not Implemented Yet : w_img_file($select)"); return $d->text("Not Implemented Yet : w_img_file($select)");

View File

@ -7,17 +7,18 @@ function main() {
$bdd = BDD::get(); $bdd = BDD::get();
BDD::reset(); BDD::reset();
echo "</pre>";
$r = Page::page_uid(1);
var_dump($r);
$g = new mAdminListeUtilisateurs(); $p = $r->rendu();
$p = $g->rendu();
echo "<pre>"; echo "<pre>";
echo htmlspecialchars($p->to_XHTML_5()); echo htmlspecialchars($p->to_XHTML_5());
echo "</pre>"; echo "</pre>";
BDD::close(); BDD::close();
Debug::afficher(); Debug::afficher();
echo "</pre>";
} }
?> ?>

View File

@ -152,13 +152,12 @@ class Page {
attribut("type", "text_no_space", "mSiteIndex"); attribut("type", "text_no_space", "mSiteIndex");
} }
private $parent = null; public function nom_module() {
public function parent() { return get_class($this);
return $this->parent;
} }
public function module() { public function module() {
return self::$modules[get_class($this)]; return self::$modules[$this->nom_module()];
} }
public function rendu($res = null, $d = null) { public function rendu($res = null, $d = null) {
@ -177,6 +176,7 @@ class Page {
public function url($ressource = null) { public function url($ressource = null) {
// Renvoie toute l'url (de la ressource principale ou de $ressource). // Renvoie toute l'url (de la ressource principale ou de $ressource).
niy("url"); niy("url");
return "";
} }
public function composant_url() { public function composant_url() {
@ -203,40 +203,21 @@ class Page {
// limit = null || limit = 0 => pas de limite // limit = null || limit = 0 => pas de limite
// offset = null => offset = 0 // offset = null => offset = 0
// Deux possibilités : niy("enfants");
// 1) On select tous les rangs qui correspondent à une des $condition, // TODO : "natural join"
// puis on group by having count(uid_page) = <nombre de condition>. echo "uid : ";
// 2) On met chaque "type" (galerie-index, ...) dans une table séparée, var_dump($this->uid());
// et on a une table des types. On select dans cette table des types $select = "select uid_page_vers from "
// les tables qui ont les champs sur lesquels portent les conditions, . BDD::table("liens")
// puis on construit une requête comme suit : . " join " . BDD::table("pages") . " on uid_page = uid_page_vers "
// select * from (select uid_page, prop_cond_1, prop_cond_2 from table_1) . " natural join " . BDD::table($this->nom_module())
// union (select uid_page, prop_cond_1, prop_cond_2 from table_2) . " where groupe = 'enfants' and uid_page_de = " . $this->uid() . ";";
// union (... table_3) $res = array();
// ... where prop_cond_1 = val_cond_1 and prop_cond_2 = val_cond_2; foreach (BDD::select($select) as $row) {
array_push($res, self::page_uid($row["uid_page_vers"]));
// Tous les enfants
niy("enfants__");
$select = "select uid_page from " . BDD::table("enfants") . " where uid_page_parent = " . $this->uid();
if ($condition !== true) {
// Toutes les propriétés des enfants
$select = "select$distinct uid_page from " . BDD::table("proprietes") . " where uid_page in (" . $select . ")";
// Liste des conditions :
$select .= "and (";
$firstcond = true;
foreach ($conditions as $c) {
if (!$firstcond) {
$select .= " or ";
}
$select .= "(nom = '" . mysql_real_escape_string($c["cle"]) . "' and valeur = '" . mysql_real_escape_string($c["valeur"]) . "')";
$firstcond = false;
}
$select .= ") group by uid_page having count(uid_page) = " . count($conditions);
} }
echo "Page::enfants : result of select : "; return $res;
var_dump(BDD::select($select . ";"));
} }
public function ajouter_enfant($type, $groupe = "main") { public function ajouter_enfant($type, $groupe = "main") {
@ -255,7 +236,26 @@ class Page {
// select from pages where nomSysteme = $nom limit 1 // select from pages where nomSysteme = $nom limit 1
niy("page_systeme"); niy("page_systeme");
} }
public static function page_uid($uid) {
$select = "select type from " . BDD::table("pages") . " where uid_page = " . $uid . ";";
$type = BDD::select($select);
if (count($type) != 1) {
Debug::error("La page avec l'uid $uid n'a pas pu être trouvée.");
return null;
}
$type = $type[0]["type"];
$ret = new $type();
$ret->uid = $uid;
return $ret;
}
public function get_permissions_prop($prop) {
niy("get_permissions_prop");
}
public function get_permissions_enfants($groupe) {
niy("get_permissions_enfants");
}
public function if_perm($action, $nom_propriété) { public function if_perm($action, $nom_propriété) {
// @param $action = suite de lettre parmi les suivantes : // @param $action = suite de lettre parmi les suivantes :
// R = Read prop // R = Read prop

View File

@ -18,7 +18,7 @@ class mAdminListeUtilisateurs extends Page {
public function res_h_page($d) { public function res_h_page($d) {
$d->w_titre("Utilisateurs"); $d->w_titre("Utilisateurs");
$l = $d->article()->w_tableau($this->enfants(true, "nom asc prenom asc"), function($e, $tr) { $l = $d->article()->w_tableau($this->enfants(true, "+nom +prenom"), function($e, $tr) {
$e->rendu("h_admin", $tr); $e->rendu("h_admin", $tr);
}); });
$nouveau = $l->tbody(0)->tr()->td(6); $nouveau = $l->tbody(0)->tr()->td(6);
@ -29,7 +29,7 @@ class mAdminListeUtilisateurs extends Page {
public function res_h_liste_mots_de_passe($d) { public function res_h_liste_mots_de_passe($d) {
$d->w_titre("Liste de mots de passe."); $d->w_titre("Liste de mots de passe.");
$l = $d->article()->w_liste($this->enfants("@groupe = utilisateurs", "nom asc prenom asc"), function($e, $li) { $l = $d->article()->w_liste($this->enfants("u_groupe = 'utilisateurs'", "+nom +prenom"), function($e, $li) {
$e->rendu("h_admin_mdp", $li); $e->rendu("h_admin_mdp", $li);
}); });
return $d; return $d;

View File

@ -25,8 +25,8 @@ abstract class mGalerieBase extends Page {
} }
public function res_h_page($d) { public function res_h_page($d) {
$d->w_en_tete(); // En-tête standard. $d->w_en_tete($this->titre, "".$this->description); // En-tête standard.
$l = $d->article()->w_liste($this->enfants(true, "date_creation desc"), function($e, $li) { $l = $d->article()->w_liste($this->enfants(true, "-date_creation"), function($e, $li) {
$a = $li->a($e->uid()); $a = $li->a($e->uid());
$e->rendu("h_miniature", $a); $e->rendu("h_miniature", $a);
}); });
@ -51,10 +51,12 @@ abstract class mGalerieBase extends Page {
} }
public function res_h_mini_miniature($d) { public function res_h_mini_miniature($d) {
$a = $this->enfants("@apercu = true", "date_creation desc", 1); $a = $this->enfants("apercu = 'true'", "-date_creation", 1); // TODO : l'aperçu devrait être défini par le parent => ajouter un attribut "virtuel".
if ($a->size() != 1) if (count($a) != 1)
$a = $this->enfants(true, "date_creation desc", 1); $a = $this->enfants(true, "-date_creation", 1);
return $a->get(0)->rendu("h_mini_miniature", $d);; if (count($a) != 1)
return; // TODO : aucune photo
return $a[0]->rendu("h_mini_miniature", $d);;
} }
public function set_dans_nouveautes($val) { public function set_dans_nouveautes($val) {

View File

@ -7,6 +7,7 @@ class mNouveautes extends Page {
groupes_enfants("sources"); groupes_enfants("sources");
attribut("titre", "text_line", "Nouveautés"); attribut("titre", "text_line", "Nouveautés");
attribut("description", "text_rich", ""); attribut("description", "text_rich", "");
attributs_globaux("dans_nouveautes");
} }
public function res_i_icône_nouvelle_page() { public function res_i_icône_nouvelle_page() {
@ -20,7 +21,7 @@ class mNouveautes extends Page {
public function res_h_page($d) { public function res_h_page($d) {
$d->w_en_tete(); // En-tête standard. $d->w_en_tete(); // En-tête standard.
$l = $d->article()->w_liste($this->enfants(true, "date_creation desc", 10), function($e, $li) { $l = $d->article()->w_liste($this->enfants(true, "-date_creation", 10), function($e, $li) {
$a = $li->a($e->uid()); $a = $li->a($e->uid());
// TODO : h_miniature_nouveautes s'il existe sinon h_miniature sinon juste un lien. // TODO : h_miniature_nouveautes s'il existe sinon h_miniature sinon juste un lien.
// Comme ça le h_miniature_nouveautes d'une période de la galerie, c'est 3 ou 4 images alors que normalement c'en est juste une seule. // Comme ça le h_miniature_nouveautes d'une période de la galerie, c'est 3 ou 4 images alors que normalement c'en est juste une seule.