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
// 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
// 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 ?
@ -41,6 +27,9 @@ class BDD {
public static function reset() {
self::unbuf_query('drop table if exists ' . self::table("pages"));
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")).
self::unbuf_query('drop table if exists ' . self::table("modules"));
self::init();
@ -62,7 +51,7 @@ class BDD {
. ')');
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";
@ -80,20 +69,24 @@ class BDD {
}
}
$table .= ")";
self::unbuf_query($table);
self::modify("replace into " . self::table("modules") . " values('" . $nom_module . "')");
self::unbuf_query($table);
}
self::test();
}
public static function test() {
// Insertion de la racine :
self::modify("replace into " . self::table("pages") . " values(1, '0', '0', 'true', 'racine', '', 'mGalerieIndex')");
self::modify("replace into " . self::table("pages") . " values(2, '0', '0', 'true', '', '', 'mGaleriePeriode')");
self::modify("replace into " . self::table("pages") . " values(3, '0', '0', 'true', '', '', 'mGaleriePeriode')");
self::modify("replace into " . self::table("liens") . " values(1, 2, 'enfant')");
self::modify("replace into " . self::table("liens") . " values(1, 3, 'enfant')");
// TODO : dans les modules qui proposent un nom_systeme, faire une fonction init_<nom_systeme>
// Cette fonction sera appellée lors de l'initialisation de la BDD.
self::modify("replace into " . self::table("pages") . " values(1, '0', '0', 'true', 'racine', '', 'mGalerieIndex', 'true')");
self::modify("replace into " . self::table("pages") . " values(2, '0', '0', 'true', '', 'periode-1', 'mGaleriePeriode', 'true')");
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, 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() {
@ -113,7 +106,7 @@ class BDD {
debug::info("sql : " . $q);
$qres = mysql_query($q, BDD::get()) or Debug::sqlerror();
$ret = array();
while ($row = mysql_fetch_array($qres)) {
while ($row = mysql_fetch_assoc($qres)) {
$ret[] = $row;
}
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){
// input[file] et <img>
return $d->text("Not Implemented Yet : w_img_file($select)");

View File

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

View File

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

View File

@ -18,7 +18,7 @@ class mAdminListeUtilisateurs extends Page {
public function res_h_page($d) {
$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);
});
$nouveau = $l->tbody(0)->tr()->td(6);
@ -29,7 +29,7 @@ class mAdminListeUtilisateurs extends Page {
public function res_h_liste_mots_de_passe($d) {
$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);
});
return $d;

View File

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

View File

@ -7,6 +7,7 @@ class mNouveautes extends Page {
groupes_enfants("sources");
attribut("titre", "text_line", "Nouveautés");
attribut("description", "text_rich", "");
attributs_globaux("dans_nouveautes");
}
public function res_i_icône_nouvelle_page() {
@ -20,7 +21,7 @@ class mNouveautes extends Page {
public function res_h_page($d) {
$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());
// 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.