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:
parent
20aafcf6dc
commit
0a9a9aa99f
|
@ -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().
|
||||
}
|
||||
}
|
||||
|
||||
*/
|
||||
|
||||
?>
|
|
@ -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)");
|
||||
|
|
|
@ -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>";
|
||||
}
|
||||
|
||||
?>
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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.
|
||||
|
|
Loading…
Reference in New Issue
Block a user