Compare commits

...

10 Commits

26 changed files with 708 additions and 399 deletions

1
cms2/.gitignore vendored Normal file
View File

@ -0,0 +1 @@
config_free.fr.php5

1
cms2/.htaccess Normal file
View File

@ -0,0 +1 @@
php 5

View File

@ -1,8 +1,32 @@
- Debug : grouper les erreurs, améliorer l'affichage.
- Valeur de retour des res_t_xxx ? - Valeur de retour des res_t_xxx ?
Lorsqu'on appelle GalerieIndex::res_i_icône_nouvelle_page(), ça fait un sendfile alors que GalerieIndex::res_h_page() renvoie un objet Lorsqu'on appelle GalerieIndex::res_i_icône_nouvelle_page(), ça fait un sendfile alors que GalerieIndex::res_h_page() renvoie un objet
ElementDocument, et GalerieIndex::res_c_style() renvoie du texte (CSS) pour inclusion dans le CSS principal... alors que ElementDocument, et GalerieIndex::res_c_style() renvoie du texte (CSS) pour inclusion dans le CSS principal... alors que
res_c_style_supplémentaire() fait je-sais-pas-quoi... res_c_style_supplémentaire() fait je-sais-pas-quoi...
Comment gérer tout ça ? Selon le type de ressource on envoie direct ou on récupère (html,css => récup, img => envoi). Comment gérer tout ça ? Selon le type de ressource on envoie direct ou on récupère (html,css => récup, img => envoi).
- PHP5.3 chez ovh : http://guide.ovh.com/Php5ChezOvh (.htaccess avec "SetEnv PHP_VER 5_TEST")
- Compatibilité free.fr :
soit il faut supprimer le fichier index.php (pour que index.php5 ait la priorité),
soit il faut transférer .htaccess (qui spécifie qu'il faut utiliser php5).
- Pouvoir ajouter des types plutôt que des widgets. Type = widget affichage + wiget modification (affichage/modification) + sérialisation (stockage) (+ autre chose ?)
- modules pour le site 4h
- squelette 1h
+ barre de navigation latérale 1h
- css pour le site 2h
==== OK.
- authentification 3h
- if_perm() 3h
- chercher le form parent, s'il n'y en a pas, créer un nouveau. 1h
- sécurité : if_perm quand on get_prop_direct() ou set_prop_direct() 1h
- import / export de la BDD. 2h
- refactor : une classe par type (2 widgets + serialize), dans un fichier séparé de document.
OK :
- widgets en écriture. Un form pour chaque champ. 2h (real : 3h)

View File

@ -1,9 +1,12 @@
<?php <?php
require_once(dirname(__FILE__) . "/module.php5");
// 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 ?
// TODO : sécurité : faire une méthode select qui construise une requête sans risques de triche de la part de l'utilisateur. Idem pour insert / update etc.
class BDD { class BDD {
private static $handle = null; private static $handle = null;
@ -15,7 +18,7 @@ class BDD {
Config::get('db_mot_de_passe') Config::get('db_mot_de_passe')
); );
if (!is_resource(self::$handle)) { if (!is_resource(self::$handle)) {
Debug::erreur("Échec à la connexion à la base de données"); Debug("erreur", "Échec à la connexion à la base de données");
} }
// TODO : begin transaction à la 1ere écriture. // TODO : begin transaction à la 1ere écriture.
self::begin_transaction(); self::begin_transaction();
@ -33,7 +36,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") . ' ('
. 'nom_module varchar(50) primary key' . 'nom_module varchar(50) primary key'
. ')'); . ')');
foreach (self::select('select * from ' . self::table("_modules")) as $module) { foreach (self::select('select nom_module from ' . self::table("_modules")) as $module) {
self::unbuf_query('drop table if exists ' . self::table($module["nom_module"])); self::unbuf_query('drop table if exists ' . self::table($module["nom_module"]));
} }
self::unbuf_query('drop table if exists ' . self::table("_modules")); self::unbuf_query('drop table if exists ' . self::table("_modules"));
@ -42,10 +45,10 @@ class BDD {
public static function init() { public static function init() {
self::unbuf_query("create database if not exists " . Config::get('db_base')); self::unbuf_query("create database if not exists " . Config::get('db_base'));
mysql_select_db(Config::get('db_base'), self::$handle) or Debug::erreur_sql(); mysql_select_db(Config::get('db_base'), self::$handle) or Debug("erreur_sql");
if (count(self::select("show tables like '" . self::table("_pages") . "'")) == 1) { if (count(self::select("show tables like '" . self::table("_pages") . "'")) == 1) {
Debug::info("La base de données est déjà initialisée, on continue..."); Debug("info", "La base de données est déjà initialisée, on continue...");
return; return;
} }
@ -59,7 +62,7 @@ class BDD {
. 'nom_module varchar(50) primary key' . 'nom_module varchar(50) primary key'
. ')'); . ')');
foreach (mPage::$modules as $nom_module => $m) { foreach (Module::$modules as $nom_module => $m) {
$table = "create table if not exists " . self::table($nom_module) . " (_uid_page integer"; $table = "create table if not exists " . self::table($nom_module) . " (_uid_page integer";
foreach ($m['attributs'] as $nom => $attr) { foreach ($m['attributs'] as $nom => $attr) {
if (!$attr['global']) { if (!$attr['global']) {
@ -74,7 +77,7 @@ class BDD {
$table = "create table if not exists " . self::table("_pages") . " (" $table = "create table if not exists " . self::table("_pages") . " ("
. "_uid_page integer auto_increment primary key" . "_uid_page integer auto_increment primary key"
. ", _type varchar(50)"; . ", _type varchar(50)";
foreach (mPage::$attributs_globaux as $nom => $attr) { foreach (Module::$attributs_globaux as $nom => $attr) {
$table .= ", $nom varchar(50)"; $table .= ", $nom varchar(50)";
} }
$table .= ")"; $table .= ")";
@ -113,13 +116,13 @@ class BDD {
} }
public static function unbuf_query($q) { public static function unbuf_query($q) {
debug::sql($q . ";"); Debug("sql", $q . ";");
mysql_unbuffered_query($q . ";", self::get()) or Debug::erreur_sql(); mysql_unbuffered_query($q . ";", self::get()) or Debug("erreur_sql");
} }
public static function select($q) { public static function select($q) {
debug::sql($q); Debug("sql", $q);
$qres = mysql_query($q, BDD::get()) or Debug::erreur_sql(); $qres = mysql_query($q, BDD::get()) or Debug("erreur_sql");
$ret = array(); $ret = array();
while ($row = mysql_fetch_array($qres)) { while ($row = mysql_fetch_array($qres)) {
$ret[] = $row; $ret[] = $row;
@ -131,55 +134,74 @@ class BDD {
public static function select_one($q, $strict = true) { public static function select_one($q, $strict = true) {
$res = self::select($q); $res = self::select($q);
if ($strict && count($res) != 1) { if ($strict && count($res) != 1) {
Debug::erreur("Un rang de la base de données a été demmandé, mais, soit aucun rang correspondant aux critères n'a été trouvé, soit plusieurs ont été trouvés."); Debug("erreur", "Un rang de la base de données a été demmandé, mais, soit aucun rang correspondant aux critères n'a été trouvé, soit plusieurs ont été trouvés.");
return null; return null;
} }
if (count($res) == 0) { if (count($res) == 0) {
Debug::erreur("Un rang de la base de données a été demmandé, mais, aucun rang correspondant aux critères n'a été trouvé."); Debug("erreur", "Un rang de la base de données a été demmandé, mais, aucun rang correspondant aux critères n'a été trouvé.");
} }
return $res[0][0]; return $res[0][0];
} }
public static function modify($q) { public static function modify($q) {
debug::sql($q . ";"); Debug("sql", $q . ";");
mysql_unbuffered_query($q . ";", self::get()) or Debug::erreur_sql(); mysql_unbuffered_query($q . ";", self::get()) or Debug("erreur_sql");
// http://stackoverflow.com/questions/621369/sql-insert-and-catch-the-id-auto-increment-value // http://stackoverflow.com/questions/621369/sql-insert-and-catch-the-id-auto-increment-value
return mysql_insert_id(self::get()); return mysql_insert_id(self::get());
} }
public static function table($nom) { public static function table($nom) {
if (! preg_match('/^[a-zA-Z_]*$/', $nom)) {
Debug("erreur", "Nom de table malformé : " . htmlspecialchars(var_export($nom, true)) . ".");
}
return Config::get('db_prefixe') . $nom; return Config::get('db_prefixe') . $nom;
} }
public static function escape($str) {
return mysql_real_escape_string($str, self::get());
}
public static function escape_int($str) {
return intval($str);
}
public static function close() { public static function close() {
if (is_resource(self::$handle)) { if (is_resource(self::$handle)) {
self::commit(); self::commit();
mysql_close(self::get()) or Debug::erreur_sql(); mysql_close(self::get()) or Debug("erreur_sql");
self::$handle = null; self::$handle = null;
} }
} }
} }
class BDDCell { class BDDCell {
private $uid_page; private $page;
private $propriete; private $nom_attribut;
private $type;
private $valeur; private $valeur;
public function __construct($uid_page, $propriete, $valeur) { public function __construct($page, $nom_attribut, $type, $valeur) {
$this->uid_page = $uid_page; $this->page = $page;
$this->propriete = $propriete; $this->nom_attribut = $nom_attribut;
$this->type = $type;
$this->valeur = $valeur; $this->valeur = $valeur;
} }
public function uid_page() { public function page() {
return $this->uid_page; return $this->page;
} }
public function propriete() { public function nom_attribut() {
return $this->propriete; return $this->nom_attribut;
}
public function type() {
return $this->type;
} }
public function valeur() { public function valeur() {
return $this->valeur; return $this->valeur;
} }
public function __toString() { public function toString() {
return "".$this->valeur; return toString($this->valeur);
}
public function name_for_set() {
return "set_" . $this->page->uid() . "_" . $this->nom_attribut;
} }
} }

View File

@ -1,16 +1,16 @@
<?php <?php
/*************************************** /****************************************
* La configuration n'est pas ici, * * La configuration n'est pas ici, *
* elle est dans le fichier config.php * * elle est dans le fichier config.php5 *
***************************************/ ****************************************/
class Config { class Config {
private static $config = array(); private static $config = array();
public static function get($nom) { public static function get($nom) {
if (!isset(self::$config[$nom])) { if (!isset(self::$config[$nom])) {
// Utilisation de die() plutôt que de Debug::erreur car Debug n'est peut-être pas encore chargé. // Utilisation de die() plutôt que de Debug("erreur") car Debug n'est peut-être pas encore chargé.
echo "Variable de configuration manquante : $nom"; echo "Variable de configuration manquante : $nom";
die(); die();
} }
@ -22,12 +22,13 @@ class Config {
} }
} }
require_once(dirname(__FILE__) . "/util.php"); // class Path. require_once(dirname(__FILE__) . "/util.php5"); // class Path.
require_once(dirname(__FILE__) . "/../config.php"); require_once(dirname(__FILE__) . "/../config.php5");
if (Config::get('courriel_admin') === null) { if (Config::get('courriel_admin') === null) {
echo "Vous devez indiquer le courriel de l'administrateur dans le fichier config.php."; echo "Vous devez indiquer le courriel de l'administrateur dans le fichier config.php5 .";
exit; // Utilisation de die() plutôt que de Debug("erreur") car Debug n'est peut-être pas encore chargé.
die();
} }

View File

@ -1,30 +1,48 @@
<?php <?php
class Debug { // TODO : sécurité : permettre d'avoir des modèles pour les erreurs, et remplir des champs dedans, en échappant les méchants caractères etc.
// TODO : sécurité : ne pas faire de backtrace en production !
class _Debug {
public static $types_erreur = array( public static $types_erreur = array(
"erreur" => '<span style="color:red">Erreur</span>', "erreur" => '<span style="font-weight:bold;color:red;">Erreur</span>',
"niy" => '<span style="color:brown">Pas encore implémenté</span>', "warn" => '<span style="font-weight:bold;color:#ef6f00;">Attention</span>',
"info" => '<span style="color:blue">Info</span>', "info" => '<span style="color:blue;">Info</span>',
"sql" => 'Requête SQL', "utilisateur" => '<span style="font-weight:bold;color:red;">Erreur</span>',
"erreur_sql" => 'Erreur SQL', "niy" => '<span style="color:brown;">Pas encore implémenté</span>',
"permission" => '<span style="color:red">Permission non accordée</span>' "sql" => 'Requête SQL',
"erreur_sql" => '<span style="font-weight:bold;color:red;">Erreur SQL</span>',
"permission" => '<span style="font-weight:bold;color:red;">Permission non accordée</span>'
); );
public static $filtre_erreurs = array( public static $filtre_erreurs = array(
"erreur" => true, "erreur" => true,
"niy" => true, "warn" => true,
"info" => true, "info" => true,
"sql" => false, "niy" => true,
"erreur_sql" => true, "sql" => false,
"permission" => true "erreur_sql" => true,
"utilisateur" => true,
"permission" => true
); );
public static $filtre_erreurs_en_production = array(
"erreur" => false,
"warn" => false,
"info" => false,
"niy" => false,
"sql" => false,
"erreur_sql" => false,
"utilisateur" => true, // erreur générée par des données de l'utilisateur.
"permission" => true // permission non accordée.
);
public static $toutes_erreurs = false; // true <=> ignorer le filtre. public static $toutes_erreurs = false; // true <=> ignorer le filtre.
public static $erreurs = array(); public static $erreurs = array();
public static function __callStatic($nom, $args) { public function __call($nom, $args) {
if (!array_key_exists($nom, self::$types_erreur)) { if (!array_key_exists($nom, self::$types_erreur)) {
self::erreur("Type d'erreur inconnu : " . $nom . "\nArguments de Debug::$nom() : " . var_export($args, true)); self::erreur("Type d'erreur inconnu : " . $nom . "\nArguments de Debug->$nom : " . var_export($args, true));
} elseif (count($args) != 1) { } elseif (count($args) != 1) {
self::erreur("Mauvais nombre d'arguments pour Debug::$nom().\nArguments : " . var_export($args, true)); self::erreur("Mauvais nombre d'arguments pour Debug->$nom.\nArguments : " . var_export($args, true));
} else { } else {
self::push($nom, $args[0]); self::push($nom, $args[0]);
} }
@ -55,7 +73,9 @@ class Debug {
} }
if ($print) { if ($print) {
foreach (self::$erreurs as $e) { foreach (self::$erreurs as $e) {
if (self::$toutes_erreurs === true || self::$filtre_erreurs[$e[0]] === true) { if (self::$toutes_erreurs === true
|| (array_key_exists($e[0], self::$filtre_erreurs)
&& self::$filtre_erreurs[$e[0]] === true)) {
$ret .= self::$types_erreur[$e[0]] . " : " . $e[1] . "\n"; $ret .= self::$types_erreur[$e[0]] . " : " . $e[1] . "\n";
} }
} }
@ -67,8 +87,15 @@ class Debug {
} }
} }
function Debug($fn) {
$args = func_get_args();
array_shift($args);
$d = new _Debug();
call_user_func_array(array($d, $fn), $args);
}
function niy($name) { function niy($name) {
Debug::niy($name); Debug("niy", $name);
} }
?> ?>

View File

@ -1,5 +1,7 @@
<?php <?php
require_once(dirname(__FILE__) . "/module.php5");
// Chaque type d'élément est une sous-classe de ElementDocument, et impléménte uniquement les méthodes de création qui respectent les règles d'imbrication des éléments. // Chaque type d'élément est une sous-classe de ElementDocument, et impléménte uniquement les méthodes de création qui respectent les règles d'imbrication des éléments.
// Pour les éléments dont les enfants possibles dépendent du parent (par ex. <a>), on restreindra les enfants et (parents) possibles à quelque chose de sensé. // Pour les éléments dont les enfants possibles dépendent du parent (par ex. <a>), on restreindra les enfants et (parents) possibles à quelque chose de sensé.
// Plutôt que d'avoir plein de sous-classes, ElementDocument a une méthode __call(), qui vérifie ce qu'on peut appeller en fonction du type de l'élément. // Plutôt que d'avoir plein de sous-classes, ElementDocument a une méthode __call(), qui vérifie ce qu'on peut appeller en fonction du type de l'élément.
@ -31,8 +33,8 @@ class ElementDocument {
); );
} }
public static function add_widget($nom, $callback) { public static function add_widget($nom) {
self::$widgets["w_" . $nom] = $callback; self::$widgets["w_" . $nom] = "fn_w_" . $nom;
} }
public function type() { public function type() {
@ -86,6 +88,10 @@ class ElementDocument {
niy("to_XHTML_1_1"); niy("to_XHTML_1_1");
} }
public function url() {
return $this->document->page->url();
}
public function __construct($type = "document", &$doc = null) { public function __construct($type = "document", &$doc = null) {
$this->type = $type; $this->type = $type;
$this->document = $doc; $this->document = $doc;
@ -112,7 +118,7 @@ class ElementDocument {
$max = 0; $max = 0;
foreach (self::$types[$type]["attributs_oblig"] as $i => $nom) { foreach (self::$types[$type]["attributs_oblig"] as $i => $nom) {
if (!isset($args[$i])) { if (!isset($args[$i])) {
Debug::erreur("Argument manquant : $nom pour " . $elem->type); Debug("erreur", "Argument manquant : $nom pour " . $elem->type);
} }
$elem->attr($nom, $args[$i]); $elem->attr($nom, $args[$i]);
$max = $i; $max = $i;
@ -142,7 +148,7 @@ class ElementDocument {
} elseif (self::has_widget($fn)) { } elseif (self::has_widget($fn)) {
return $this->créer_widget($fn, $args); return $this->créer_widget($fn, $args);
} else { } else {
Debug::erreur("Impossible d'ajouter un élément $fn à " . $this->type); Debug("erreur", "Impossible d'ajouter un élément $fn à " . $this->type);
return null; return null;
} }
} }
@ -150,17 +156,19 @@ class ElementDocument {
class Document extends ElementDocument { class Document extends ElementDocument {
protected $singletons = array(); protected $singletons = array();
public function __construct() { protected $page = null;
public function __construct($page) {
parent::__construct("document", $this); parent::__construct("document", $this);
$this->erreurs(); $this->erreurs();
$this->header(); $this->header();
$this->nav(); $this->nav();
$this->article(); $this->article();
$this->footer(); $this->footer();
$this->page = $page;
} }
} }
$inline_elems = "span text a strong em img"; $inline_elems = "span text a strong em img form";
ElementDocument::add_type("document", "erreurs header footer nav article script style"); ElementDocument::add_type("document", "erreurs header footer nav article script style");
ElementDocument::add_type(true, "header", "title"); ElementDocument::add_type(true, "header", "title");
ElementDocument::add_type(true, "erreurs", "litteral"); ElementDocument::add_type(true, "erreurs", "litteral");
@ -179,7 +187,11 @@ ElementDocument::add_type("tr", "td th");
ElementDocument::add_type("td", $inline_elems, "", "colspan rowspan"); ElementDocument::add_type("td", $inline_elems, "", "colspan rowspan");
ElementDocument::add_type("th", $inline_elems); ElementDocument::add_type("th", $inline_elems);
ElementDocument::add_type("li", $inline_elems); ElementDocument::add_type("li", $inline_elems);
ElementDocument::add_type("form", "input_text_line input_text_multi input_text_rich input_file"); ElementDocument::add_type("form", $inline_elems . " input_text_line input_text_multi input_text_rich input_file input_submit", "action");
ElementDocument::add_type("input_text_line", "", "name value");
ElementDocument::add_type("input_text_rich", "", "name value");
ElementDocument::add_type("input_file", "name");
ElementDocument::add_type("input_submit", "", "label");
ElementDocument::add_type("a", $inline_elems, "href"); ElementDocument::add_type("a", $inline_elems, "href");
ElementDocument::add_type("span", $inline_elems, "", "class"); ElementDocument::add_type("span", $inline_elems, "", "class");
ElementDocument::add_type("img", "", "alt src"); ElementDocument::add_type("img", "", "alt src");
@ -187,99 +199,182 @@ ElementDocument::add_type("p", $inline_elems);
ElementDocument::add_type("text", "", "text"); ElementDocument::add_type("text", "", "text");
function fn_w_titre($d, $cell) {
// renvoie un <h2> ou un <input> selon les droits
$d->header()->title()->text(toString($cell));
// TODO : modification si on a les droits.
$d->article()->hX()->text(toString($cell));
}
ElementDocument::add_widget("titre", function($d, $cell){ function fn_w_en_tete($d, $cell_titre, $cell_description) {
// renvoie un <h2> ou un <input> selon les droits $d->w_titre($cell_titre);
$d->header()->title()->text("".$cell); $d->w_description($cell_description);
// TODO : modification si on a les droits. }
$d->article()->hX()->text("".$cell);
}); function fn_w_description($d, $cell) {
// TODO : modification si on a les droits.
return $d->article()->p()->text(toString($cell));
}
function fn_w_bouton($d, $texte, $page_callback, $ressource_callback, $action_callback) {
// afficher un input[type=button]
// lors du clic, appeller $action_callback sur $page_callback/?res=$ressource_callback ?
$a = $d->a($page_callback->url($ressource_callback,
"act_" . $page_callback->uid() . "_" . $action_callback));
$a->text($texte);
return $a;
}
function fn_w_liste($d, $liste_pages, $function_formattage_elements) {
$ul = $d->ul();
foreach ($liste_pages as $page) {
$li = $ul->li();
$function_formattage_elements($page, $li);
}
return $ul;
}
function fn_w_tableau($d, $select, $function_formattage_elements) {
$t = $d->table();
$tr = $t->tbody()->tr();
$tr->td()->text("Not Implemented Yet");
return $t;
}
function fn_w_img_file_desc($d, $cell_img, $cell_description) {
// TODO : modification si on a les droits.
$d->w_img_file($cell_img);
$d->w_description($cell_description);
return $img;
}
function fn_w_field($d, $cell) {
if ($cell->page()->if_perm("w", $cell->nom_attribut())) {
return call_user_func(array($d, "w_w_" . $cell->type()), $cell);
} else {
return call_user_func(array($d, "w_r_" . $cell->type()), $cell);
}
}
function fn_w_r_field($d, $cell) {
return call_user_func(array($d, "w_r_" . $cell->type()), $cell);
}
/* ==== Types ==== */
// text_line
function fn_w_r_text_line($d, $cell) {
return $d->text(toString($cell));
}
function fn_w_w_text_line($d, $cell) {
$f = $d->form($d->url());
$f->input_text_line($cell->name_for_set(), toString($cell));
$f->input_submit("Ok");
return $f;
}
function fn_serialize_text_line($input) {
return preg_replace("/\n/", " ", $input);
}
ElementDocument::add_widget("en_tete", function($d, $cell_titre, $cell_description){ // text_nix
$d->w_titre($cell_titre); function fn_w_r_text_nix($d, $cell) {
$d->w_description($cell_description); // Texte naze (sans espaces etc.) à la *nix.
}); return $d->text(toString($cell));
}
function fn_w_w_text_nix($d, $cell) {
return $d->form()->input_text($cell->name_for_set(), toString($cell)); // TODO !!!
}
function fn_serialize_text_nix($input) {
return str_to_nix($input);
}
ElementDocument::add_widget("description", function($d, $cell){ // text_rich
// TODO : modification si on a les droits. function fn_w_r_text_rich($d, $cell) {
return $d->article()->p()->text("".$cell); // TODO : rendu du texte riche.
}); return $d->p()->text(toString($cell));
}
function fn_w_w_text_rich($d, $cell) {
// TODO : modification du texte riche.
return $d->form()->input_text_rich($cell->name_for_set(), toString($cell));
}
function fn_serialize_text_rich($input) {
return $input;
}
ElementDocument::add_widget("field", function($d, $cell){ // bool
$f = $d->span("field"); function fn_w_r_bool($d, $cell) {
$f->text("NIY : " . $cell); return $d->text("w_bool(" . toString($cell) . ")");
return $f; }
});
function fn_w_w_bool($d, $cell) {
// TODo : checkbox
}
function fn_serialize_bool($input) {
return ($input == "true") ? "true" : "false";
}
ElementDocument::add_widget("text_line", function($d, $cell){ // img_file
// TODO : modification si on a les droits. function fn_w_r_img_file($d, $cell) {
return $d->text("".$cell); return $d->img(toString($cell));
}); }
function fn_w_w_img_file($d, $cell) {
$f = $d->form($d->url());
fn_w_r_img_file($f, $cell);
$f->input_file($cell->name_for_set());
return $f;
}
function fn_serialize_img_file($input) {
// Doit gérer le stockage de l'image dans un dossier,
// la création de la miniature et renvoyer le chemin vers l'image.
// TODO !!! comment faire ?
return $input;
}
ElementDocument::add_widget("text_nix", function($d, $cell){ // date
// Texte naze (sans espaces etc.) à la *nix. function fn_w_r_date($d, $cell) {
// TODO : modification si on a les droits. // affichage localisé.
// TODO : vérifier que ça match [a-zA-Z][-a-zA-Z0-9_]* return $d->text(strftime("%Y-%m-%d %H:%M:%S", toString($cell)));
return $d->text("".$cell); }
});
function fn_w_w_date($d, $cell) {
// affichage localisé.
return $d->form()->input_text_line($cell->name_for_set(), strftime("%Y-%m-%d %H:%M:%S", toString($cell)));
}
ElementDocument::add_widget("text_rich", function($d, $cell){ function fn_serialize_date($input) {
// TODO : modification si on a les droits. // TODO
// TODO : rendu du texte riche. return toString(strtotime($input));
return $d->p()->text("".$cell); }
});
ElementDocument::add_widget("titre", "fn_w_titre");
ElementDocument::add_widget("en_tete", "fn_w_en_tete");
ElementDocument::add_widget("description", "fn_w_description");
ElementDocument::add_widget("bouton", "fn_w_bouton");
ElementDocument::add_widget("liste", "fn_w_liste");
ElementDocument::add_widget("tableau", "fn_w_tableau");
ElementDocument::add_widget("img_file_desc", "fn_w_img_file_desc");
ElementDocument::add_widget("bool", function($d, $cell){ ElementDocument::add_widget("field");
// checkbox ElementDocument::add_widget("r_field");
return $d->text("Not Implemented Yet : w_bool($cell)"); Module::add_type("text_line");
}); Module::add_type("text_nix");
Module::add_type("text_rich");
Module::add_type("bool");
ElementDocument::add_widget("bouton", function($d, $texte, $page_callback, $ressource_callback, $action_callback){ Module::add_type("img_file");
// afficher un input[type=button] Module::add_type("date");
// lors du clic, appeller $action_callback sur $page_callback/?res=$ressource_callback ?
return $d->text("Not Implemented Yet : w_bouton($texte, $page_callback, $ressource_callback, $action_callback)");
});
// 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, $cell_description, $cell_img){
// TODO : modification si on a les droits.
// input[file] et <img>
$img = $d->img("".$cell_description, "".$cell_img);
$d->w_description($cell_description);
return $img;
});
ElementDocument::add_widget("date", function($d, $select){
// affichage localisé.
return $d->text("Not Implemented Yet : date($select)");
});
ElementDocument::add_widget("liste", function($d, $list_cells, $function_formattage_elements) {
$ul = $d->ul();
foreach ($list_cells as $cell) {
$li = $ul->li();
$function_formattage_elements($cell, $li);
}
return $ul;
});
ElementDocument::add_widget("tableau", function($d, $select, $function_formattage_elements) {
$t = $d->table();
$tr = $t->tbody()->tr();
$tr->td()->text("Not Implemented Yet");
return $t;
});
?> ?>

View File

@ -1,13 +1,13 @@
<?php <?php
require_once(dirname(__FILE__) . "/debug.php"); require_once(dirname(__FILE__) . "/debug.php5");
require_once(dirname(__FILE__) . "/util.php"); require_once(dirname(__FILE__) . "/util.php5");
require_once(dirname(__FILE__) . "/page.php"); require_once(dirname(__FILE__) . "/page.php5");
require_once(dirname(__FILE__) . "/bdd.php"); require_once(dirname(__FILE__) . "/bdd.php5");
require_once(dirname(__FILE__) . "/document.php"); require_once(dirname(__FILE__) . "/document.php5");
require_once(dirname(__FILE__) . "/main.php"); require_once(dirname(__FILE__) . "/main.php5");
require_once(dirname(__FILE__) . "/stockage_fichiers.php"); require_once(dirname(__FILE__) . "/stockage_fichiers.php5");
require_once(dirname(__FILE__) . "/../modules/include.php"); require_once(dirname(__FILE__) . "/../modules/include.php5");
?> ?>

View File

@ -5,8 +5,8 @@ error_reporting(E_ALL | E_STRICT);
// alors gardons-le aussi court que possible ! // alors gardons-le aussi court que possible !
ini_set("display_errors", 1); ini_set("display_errors", 1);
require_once(dirname(__FILE__) . "/configuration.php"); require_once(dirname(__FILE__) . "/configuration.php5");
require_once(dirname(__FILE__) . "/include.php"); require_once(dirname(__FILE__) . "/include.php5");
main(); main();

View File

@ -7,10 +7,49 @@ function verifications() {
verifications(); verifications();
function main() { function main() {
initModules(); Module::initModules();
// Attention ! ne pas garder BDD::reset() en production ! Debug("warn", "BDD::reset() est toujours activé, ne pas le garder en production !");
BDD::reset(); if (array_key_exists("reset_bdd", $_GET) && $_GET['reset_bdd'] == 'true') {
BDD::reset();
}
// TODO : should be $_POST .
foreach ($_GET as $k => $v) {
if (substr($k, 0, 4) == 'set_') {
$k = substr($k, 4);
$set_uid_page = substr($k, 0, strpos($k, '_'));
$set_nom_prop = substr($k, strpos($k, '_') + 1);
$set_page = mPage::page_uid($set_uid_page);
if ($set_page->has_prop($set_nom_prop)) {
$set_page->$set_nom_prop = $v;
} else {
Debug("warn", "Impossible d'effecturer la modification "
. "(uid_page = " . htmlspecialchars($set_uid_page)
. ", " . htmlspecialchars($set_nom_prop)
. " = " . htmlspecialchars($v) . ").");
}
}
}
// TODO : should be $_POST .
foreach ($_GET as $k => $v) {
if (substr($k, 0, 4) == 'act_') {
$k = substr($k, 4);
$act_uid_page = substr($k, 0, strpos($k, '_'));
$act_nom_action = "act_" . substr($k, strpos($k, '_') + 1);
$act_page = mPage::page_uid($act_uid_page);
if (method_exists($act_page, $act_nom_action)) {
call_user_func(array($act_page, $act_nom_action), $v);
} else {
Debug("warn", "Impossible d'exécuter l'action "
. htmlspecialchars($act_nom_action)
. " (uid_page = " . htmlspecialchars($act_uid_page) . ").");
}
}
}
$res = array_key_exists('res', $_GET) ? $_GET['res'] : null; $res = array_key_exists('res', $_GET) ? $_GET['res'] : null;
if (array_key_exists('uid_page', $_GET)) { if (array_key_exists('uid_page', $_GET)) {
@ -22,7 +61,7 @@ function main() {
$rendu = $page->rendu($res); $rendu = $page->rendu($res);
BDD::close(); BDD::close();
$rendu->erreurs()->litteral(Debug::afficher()); $rendu->erreurs()->litteral(_Debug::afficher());
$rendu = $rendu->to_XHTML_5(); $rendu = $rendu->to_XHTML_5();
echo $rendu; echo $rendu;

135
cms2/code/module.php5 Normal file
View File

@ -0,0 +1,135 @@
<?php
class Inherit {
public function __construct($module) {
$this->inherit = $module;
}
}
class Module {
public static $types = array();
public static $modules = array();
public static $attributs_globaux = array();
public static $module_en_cours = null;
public static $limitation_infos_module = true;
public static function is_inherit($i) {
return is_object($i) && get_class($i) == "Inherit";
}
public static function ressources_statiques($res) {
// TODO : factoriser d'ici...
$lim = self::$limitation_infos_module;
$m = self::$module_en_cours;
if ($lim !== true && $lim != "ressources_statiques")
return;
if (self::is_inherit($res)) {
$i = $res->inherit;
self::$limitation_infos_module = "ressources_statiques";
call_user_func(array($i, "info"), $i);
self::$limitation_infos_module = $lim;
} else {
// TODO : ... jusqu'ici (self::$modules[$m]['ressources_statiques'] peut être factorisé aussi. (pas pour attribut))
self::$modules[$m]['ressources_statiques'] = qw(self::$modules[$m]['ressources_statiques'], $res);
}
}
public static function ressources_dynamiques($res) {
// TODO : factoriser d'ici...
$lim = self::$limitation_infos_module;
$m = self::$module_en_cours;
if ($lim !== true && $lim != "ressources_dynamiques")
return;
if (self::is_inherit($res)) {
$i = $res->inherit;
self::$limitation_infos_module = "ressources_dynamiques";
call_user_func(array($i, "info"), $i);
self::$limitation_infos_module = $lim;
} else {
// TODO : ... jusqu'ici (self::$modules[$m]['ressources_dynamiques'] peut être factorisé aussi. (pas pour attribut))
self::$modules[$m]['ressources_dynamiques'] = qw(self::$modules[$m]['ressources_dynamiques'], $res);
}
}
public static function type_liens($groupe, $type = null) {
// TODO : factoriser d'ici...
$lim = self::$limitation_infos_module;
$m = self::$module_en_cours;
if ($lim !== true && $lim != "type_liens")
return;
if (self::is_inherit($groupe)) {
$i = $res->inherit;
self::$limitation_infos_module = "type_liens";
call_user_func(array($i, "info"), $i);
self::$limitation_infos_module = $lim;
} else {
if ($type === null) {
Debug("erreur", 'fonction type_liens() : le paramètres $type est obligatoire.');
}
// TODO : ... jusqu'ici (self::$modules[$m]['types_enfants'] peut être factorisé aussi (pas pour attribut)).
self::$modules[$m]['type_liens'][$groupe] = $type;
}
}
public static function attribut($nom, $type = null, $defaut = null) {
$lim = self::$limitation_infos_module;
$m = self::$module_en_cours;
if ($lim !== true && $lim != "attribut")
return;
if (self::is_inherit($nom)) {
$i = $nom->inherit;
self::$limitation_infos_module = "attribut";
call_user_func(array($i, "info"), $i);
self::$limitation_infos_module = $lim;
} else {
if ($type === null || $defaut === null) {
Debug("erreur", 'fonction attribut() : les paramètres $type et $defaut est obligatoire.');
}
if (!array_key_exists($type, self::$types)) {
Debug("erreur", "L'attribut $nom a le type $type, mais ce type n'existe pas.");
}
self::$modules[$m]['attributs'][$nom] = array("global" => false, "type" => $type, "defaut" => $defaut);
}
}
public static function attribut_global($nom, $type, $defaut) {
self::$attributs_globaux[$nom] = array('type' => $type, 'defaut' => $defaut);
}
public static function add_module($m) {
self::$modules[$m] = array(
'ressources_statiques' => qw(),
'ressources_dynamiques' => qw(),
'type_liens' => array('enfants' => false),
'attributs' => array()
);
}
public static function initModules() {
foreach (self::$modules as $nom_module => $m) {
self::$module_en_cours = $nom_module;
call_user_func(array($nom_module, "info"), $nom_module);
}
self::$module_en_cours = null;
foreach (self::$attributs_globaux as $nom_ag => $ag) {
foreach (self::$modules as &$m) {
if (array_key_exists($nom_ag, $m['attributs'])) {
$m['attributs'][$nom_ag]['global'] = true;
}
}
}
}
public static function add_type($nom) {
ElementDocument::add_widget("r_" . $nom);
ElementDocument::add_widget("w_" . $nom);
// fn_serialize_$nom
self::$types[$nom] = array();
}
}
?>

View File

@ -9,140 +9,20 @@
// Convention de nommage pour les attributs : // Convention de nommage pour les attributs :
// Pas de "_" au début (par ex. _publier est interdit). // Pas de "_" au début (par ex. _publier est interdit).
require_once(dirname(__FILE__) . "/util.php"); // qw require_once(dirname(__FILE__) . "/util.php5"); // qw
require_once(dirname(__FILE__) . "/document.php"); // widgets pour la vérification des types. require_once(dirname(__FILE__) . "/document.php5"); // widgets pour la vérification des types.
function inherit($m) {
return array("inherit" => $m);
}
function is_inherit($i) {
return (is_array($i) && array_key_exists("inherit", $i));
}
function ressources_statiques($res) {
// TODO : factoriser d'ici...
$lim = mPage::$limitation_infos_module;
$m = mPage::$module_en_cours;
if ($lim !== true && $lim != "ressources_statiques")
return;
if (is_inherit($res)) {
$i = $res["inherit"];
mPage::$limitation_infos_module = "ressources_statiques";
call_user_func(array($i, "info"), $i);
mPage::$limitation_infos_module = $lim;
} else {
// TODO : ... jusqu'ici (mPage::$modules[$m]['ressources_statiques'] peut être factorisé aussi. (pas pour attribut))
mPage::$modules[$m]['ressources_statiques'] = qw(mPage::$modules[$m]['ressources_statiques'], $res);
}
}
function ressources_dynamiques($res) {
// TODO : factoriser d'ici...
$lim = mPage::$limitation_infos_module;
$m = mPage::$module_en_cours;
if ($lim !== true && $lim != "ressources_dynamiques")
return;
if (is_inherit($res)) {
$i = $res["inherit"];
mPage::$limitation_infos_module = "ressources_dynamiques";
call_user_func(array($i, "info"), $i);
mPage::$limitation_infos_module = $lim;
} else {
// TODO : ... jusqu'ici (mPage::$modules[$m]['ressources_dynamiques'] peut être factorisé aussi. (pas pour attribut))
mPage::$modules[$m]['ressources_dynamiques'] = qw(mPage::$modules[$m]['ressources_dynamiques'], $res);
}
}
function type_liens($groupe, $type = null) {
// TODO : factoriser d'ici...
$lim = mPage::$limitation_infos_module;
$m = mPage::$module_en_cours;
if ($lim !== true && $lim != "type_liens")
return;
if (is_inherit($groupe)) {
$i = $res["inherit"];
mPage::$limitation_infos_module = "type_liens";
call_user_func(array($i, "info"), $i);
mPage::$limitation_infos_module = $lim;
} else {
if ($type === null) {
Debug::erreur('fonction type_liens() : le paramètres $type est obligatoire.');
}
// TODO : ... jusqu'ici (mPage::$modules[$m]['types_enfants'] peut être factorisé aussi (pas pour attribut)).
mPage::$modules[$m]['type_liens'][$groupe] = $type;
}
}
function attribut($nom, $type = null, $defaut = null) {
$lim = mPage::$limitation_infos_module;
$m = mPage::$module_en_cours;
if ($lim !== true && $lim != "attribut")
return;
if (is_inherit($nom)) {
$i = $nom["inherit"];
mPage::$limitation_infos_module = "attribut";
call_user_func(array($i, "info"), $i);
mPage::$limitation_infos_module = $lim;
} else {
if ($type === null || $defaut === null) {
Debug::erreur('fonction attribut() : les paramètres $type et $defaut est obligatoire.');
}
if (!Document::has_widget("w_" . $type)) {
Debug::erreur("L'attribut $nom a le type $type, mais aucun widget w_$type n'existe.");
}
mPage::$modules[$m]['attributs'][$nom] = array("global" => false, "type" => $type, "defaut" => $defaut);
}
}
function attribut_global($nom, $type, $defaut) {
mPage::$attributs_globaux[$nom] = array('type' => $type, 'defaut' => $defaut);
}
function module($m) {
mPage::$modules[$m] = array(
'ressources_statiques' => qw(),
'ressources_dynamiques' => qw(),
'type_liens' => array('enfants' => false),
'attributs' => array()
);
}
function initModules() {
foreach (mPage::$modules as $nom_module => $m) {
mPage::$module_en_cours = $nom_module;
call_user_func(array($nom_module, "info"), $nom_module);
}
mPage::$module_en_cours = null;
foreach (mPage::$attributs_globaux as $nom_ag => $ag) {
foreach (mPage::$modules as &$m) {
if (array_key_exists($nom_ag, $m['attributs'])) {
$m['attributs'][$nom_ag]['global'] = true;
}
}
}
}
class mPage { class mPage {
public static $modules = array();
public static $attributs_globaux = array();
public static $module_en_cours = null;
public static $limitation_infos_module = true;
public static function info($module) { public static function info($module) {
attribut_global("date_creation", "date", "0"); Module::attribut_global("date_creation", "date", "0");
attribut_global("date_modification", "date", "0"); Module::attribut_global("date_modification", "date", "0");
attribut_global("publier", "bool", "false"); Module::attribut_global("publier", "bool", "false");
attribut_global("nom_systeme", "text_nix", ""); Module::attribut_global("nom_systeme", "text_nix", "");
attribut_global("composant_url", "text_nix", "page"); Module::attribut_global("composant_url", "text_nix", "page");
} }
public static function est_propriete_globale($prop) { public static function est_attribut_global($prop) {
return array_key_exists($prop, self::$attributs_globaux); return array_key_exists($prop, Module::$attributs_globaux);
} }
public function nom_module() { public function nom_module() {
@ -150,7 +30,7 @@ class mPage {
} }
public function module() { public function module() {
return self::$modules[$this->nom_module()]; return Module::$modules[$this->nom_module()];
} }
public function type_liens($groupe) { public function type_liens($groupe) {
@ -165,7 +45,7 @@ class mPage {
$res = $this->module['ressources_dynamiques'][0]; $res = $this->module['ressources_dynamiques'][0];
} }
if ($d === null) { if ($d === null) {
$d = new Document(); $d = new Document($this);
} }
return call_user_func(array($this, "res_" . $res), $d); return call_user_func(array($this, "res_" . $res), $d);
} }
@ -206,10 +86,15 @@ class mPage {
return $this->uid; return $this->uid;
} }
public function has_prop($nom) {
return array_key_exists($nom, Module::$attributs_globaux)
|| array_key_exists($nom, $this->module['attributs']);
}
public function parent() { public function parent() {
return self::page_uid( return self::page_uid(
BDD::select_one( BDD::select_one(
"select uid_page_de from " . BDD::table("_liens") . " where uid_page_vers = " . $this->uid() "select uid_page_de from " . BDD::table("_liens") . " where uid_page_vers = " . BDD::escape_int($this->uid())
) )
); );
} }
@ -222,7 +107,7 @@ class mPage {
// limit = null || limit = 0 => pas de limite // limit = null || limit = 0 => pas de limite
// offset = null => offset = 0 // offset = null => offset = 0
// TODO : nettoyer la condition // TODO : nettoyer la condition (pbs de sécurité + bugs !!!).
if ($condition !== true) if ($condition !== true)
$condition = " and ($condition)"; $condition = " and ($condition)";
else else
@ -240,15 +125,15 @@ class mPage {
$select_order .= substr($o,1) . " "; $select_order .= substr($o,1) . " ";
$select_order .= (substr($o,0,1) == "+") ? "asc" : "desc"; $select_order .= (substr($o,0,1) == "+") ? "asc" : "desc";
} }
$select_limit = ($limit == 0) ? "" : " limit $limit"; $select_limit = ($limit == 0) ? "" : " limit " . BDD::escape_int($limit);
$select_offset = ($offset == 0) ? "" : " offset $offset"; $select_offset = ($offset == 0) ? "" : " offset " . BDD::escape_int($offset);
// TODO : "natural join" // TODO : "natural join"
$select = "select uid_page_vers from " $select = "select uid_page_vers from "
. BDD::table("_liens") . BDD::table("_liens")
. " join " . BDD::table("_pages") . " on _uid_page = uid_page_vers" . " join " . BDD::table("_pages") . " on _uid_page = uid_page_vers"
. " natural join " . BDD::table($this->type_liens("enfants")) . " natural join " . BDD::table($this->type_liens("enfants"))
. " where groupe = 'enfants' and uid_page_de = " . $this->uid() . " where groupe = 'enfants' and uid_page_de = " . BDD::escape_int($this->uid())
. $condition . $condition
. $select_order . $select_order
. $select_limit . $select_limit
@ -264,17 +149,17 @@ class mPage {
} }
public static function créer_page($nom_module) { public static function créer_page($nom_module) {
$module = self::$modules[$nom_module]; $module = Module::$modules[$nom_module];
// Insert dans la table _pages. // Insert dans la table _pages.
$insert = "insert into " . BDD::table("_pages") . " set "; $insert = "insert into " . BDD::table("_pages") . " set ";
$insert .= "_uid_page = null"; $insert .= "_uid_page = null";
$insert .= ", _type = '" . $nom_module . "'"; $insert .= ", _type = '" . $nom_module . "'";
foreach (self::$attributs_globaux as $nom => $attr) { foreach (Module::$attributs_globaux as $nom => $attr) {
if (array_key_exists($nom, $module['attributs'])) { if (array_key_exists($nom, $module['attributs'])) {
$insert .= ", $nom = '" . mysql_real_escape_string($module['attributs'][$nom]['defaut']) . "'"; $insert .= ", $nom = '" . BDD::escape($module['attributs'][$nom]['defaut']) . "'";
} else { } else {
$insert .= ", $nom = '" . mysql_real_escape_string($attr['defaut']) . "'"; $insert .= ", $nom = '" . BDD::escape($attr['defaut']) . "'";
} }
} }
@ -286,7 +171,7 @@ class mPage {
$insert .= "_uid_page = " . $uid_nouvelle_page; $insert .= "_uid_page = " . $uid_nouvelle_page;
foreach ($module['attributs'] as $nom => $attr) { foreach ($module['attributs'] as $nom => $attr) {
if (!$attr['global']) { if (!$attr['global']) {
$insert .= ", $nom = '" . mysql_real_escape_string($attr['defaut']) . "'"; $insert .= ", $nom = '" . BDD::escape($attr['defaut']) . "'";
} }
} }
@ -319,13 +204,13 @@ class mPage {
public static function page_systeme($nom) { public static function page_systeme($nom) {
return self::page_uid( return self::page_uid(
BDD::select_one( BDD::select_one(
"select _uid_page from " . BDD::table("_pages") . " where nom_systeme = '" . mysql_real_escape_string($nom) . "';" "select _uid_page from " . BDD::table("_pages") . " where nom_systeme = '" . BDD::escape($nom) . "';"
) )
); );
} }
public static function page_uid($uid) { public static function page_uid($uid) {
$select = "select _type from " . BDD::table("_pages") . " where _uid_page = " . $uid . ";"; $select = "select _type from " . BDD::table("_pages") . " where _uid_page = " . BDD::escape_int($uid) . ";";
$type = BDD::select_one($select); $type = BDD::select_one($select);
$ret = new $type(); $ret = new $type();
$ret->uid = $uid; $ret->uid = $uid;
@ -338,21 +223,21 @@ class mPage {
public function get_permissions_enfants($groupe) { public function get_permissions_enfants($groupe) {
niy("get_permissions_enfants"); niy("get_permissions_enfants");
} }
public function if_perm($action, $nom_propriété) { public function if_perm($action, $nom_attribut) {
niy("if_perm"); niy("if_perm");
return true; return false;
// @param $action = suite de lettre parmi les suivantes : // @param $action = suite de lettre parmi les suivantes :
// R = Read prop // R = Read attribut
// W = Write prop // W = Write attribut
// L = Lister les enfants ($nom_propriété désigne alors le groupe) // L = Lister les enfants ($nom_attribut désigne alors le groupe)
// C = Créer des enfants ($nom_propriété désigne alors le groupe) // C = Créer des enfants ($nom_attribut désigne alors le groupe)
// D = Delete la page ($nom_propriété est ignoré) // D = Delete la page ($nom_attribut est ignoré)
// @return true si on a l'autorisation pour TOUTES les actions demandées, false sinon. // @return true si on a l'autorisation pour TOUTES les actions demandées, false sinon.
// Squelette du code : // Squelette du code :
$action = strtolower($action); $action = strtolower($action);
$permissions_prop = strtolower($this->get_permissions_prop($nom_propriété)); $permissions_prop = strtolower($this->get_permissions_prop($nom_attribut));
$permissions_enfants = strtolower($this->get_permissions_enfants($nom_propriété)); $permissions_enfants = strtolower($this->get_permissions_enfants($nom_attribut));
if (str_contains($action, "r") && !str_contains($permissions_prop, "r")) { return false; } if (str_contains($action, "r") && !str_contains($permissions_prop, "r")) { return false; }
if (str_contains($action, "w") && !str_contains($permissions_prop, "w")) { return false; } if (str_contains($action, "w") && !str_contains($permissions_prop, "w")) { return false; }
if (str_contains($action, "l") && !str_contains($permissions_enfants, "l")) { return false; } if (str_contains($action, "l") && !str_contains($permissions_enfants, "l")) { return false; }
@ -374,9 +259,15 @@ class mPage {
private function get_prop_direct($nom) { private function get_prop_direct($nom) {
// Récupère l'attribut "$nom" depuis la BDD. // Récupère l'attribut "$nom" depuis la BDD.
$select_table = (self::est_propriete_globale($nom)) ? "_pages" : $this->nom_module(); if (self::est_attribut_global($nom)) {
$select = "select $nom from " . BDD::table($select_table) . " where _uid_page = " . $this->uid() . ";"; $select_table = "_pages";
return new BDDCell($this->uid(), $nom, BDD::select_one($select)); $type = Module::$attributs_globaux[$nom]['type'];
} else {
$select_table = $this->nom_module();
$type = $this->module['attributs'][$nom]['type'];
}
$select = "select $nom from " . BDD::table($select_table) . " where _uid_page = " . BDD::escape_int($this->uid()) . ";";
return new BDDCell($this, $nom, $type, BDD::select_one($select));
} }
public function __set($nom, $val) { public function __set($nom, $val) {
@ -391,8 +282,16 @@ class mPage {
public function set_prop_direct($nom, $val) { public function set_prop_direct($nom, $val) {
// Modifie l'attribut "$nom" dans la BDD. // Modifie l'attribut "$nom" dans la BDD.
$update_table = (self::est_propriete_globale($nom)) ? "_pages" : $this->nom_module(); if (self::est_attribut_global($nom)) {
$update = "update " . BDD::table($update_table) . " set $nom = '" . mysql_real_escape_string("".$val) . "' where _uid_page = " . $this->uid(); $update_table = "_pages";
$type = Module::$attributs_globaux[$nom]['type'];
} else {
$update_table = $this->nom_module();
$type = $this->module['attributs'][$nom]['type'];
}
$fn_serialize = "fn_serialize_" . $type;
$val = $fn_serialize($val);
$update = "update " . BDD::table($update_table) . " set $nom = '" . BDD::escape(toString($val)) . "' where _uid_page = " . $this->uid();
BDD::unbuf_query($update); BDD::unbuf_query($update);
if ($nom != "date_modification") { if ($nom != "date_modification") {
$this->date_modification = time(); $this->date_modification = time();
@ -406,6 +305,6 @@ class mPage {
} }
} }
module("mPage"); Module::add_module("mPage");
?> ?>

View File

@ -37,6 +37,52 @@ function applyXSLT($xml, $xslt_file) {
return $xslt->transformToXML($dom); return $xslt->transformToXML($dom);
} }
function toString($obj) {
if (is_object($obj) && method_exists($obj, "toString")) {
return $obj->toString();
} else {
return "".$obj;
}
}
function correspondance_accents(&$arr_ascii, &$arr_accents, $ascii, $accents) {
$_accents = explode(".", $accents);
foreach ($_accents as $k=>$v) {
array_push($arr_accents, $v);
array_push($arr_ascii, $ascii);
}
}
// Transforme en une chaîne qui match [a-zA-Z][-a-zA-Z0-9_]*
/* TODO : ajouter ceux de http://www.php.net/manual/fr/function.preg-replace.php#96586 . */
function str_to_nix($input) {
$ascii = array();
$accents = array();
correspondance_accents($ascii, $accents, "a", "à.á.â.ä.ã.ǎ.å");
correspondance_accents($ascii, $accents, "e", "è.é.ê.ë.ě.ẽ");
correspondance_accents($ascii, $accents, "i", "ì.í.î.ï.ĩ.ǐ");
correspondance_accents($ascii, $accents, "o", "ò.ó.ô.ö.õ.ǒ.ø");
correspondance_accents($ascii, $accents, "u", "ù.ú.û.ü.ũ.ǔ.ů");
correspondance_accents($ascii, $accents, "y", "ỳ.ý.ŷ.ÿ.ỹ.ẙ");
correspondance_accents($ascii, $accents, "c", "ç");
correspondance_accents($ascii, $accents, "A", "À.Á.Â.Ä.Ã.Ǎ.Å");
correspondance_accents($ascii, $accents, "E", "È.É.Ê.Ë.Ě.Ẽ");
correspondance_accents($ascii, $accents, "I", "Ì.Í.Î.Ï.Ĩ.Ǐ");
correspondance_accents($ascii, $accents, "O", "Ò.Ó.Ô.Ö.Õ.ǒ.Ø");
correspondance_accents($ascii, $accents, "U", "Ù.Ú.Û.Ü.Ũ.Ů.ǔ");
correspondance_accents($ascii, $accents, "Y", "Ŷ.Ý.Ŷ.Ÿ.Ỹ");
correspondance_accents($ascii, $accents, "C", "Ç");
correspondance_accents($ascii, $accents, "ae", "æ");
correspondance_accents($ascii, $accents, "oe", "œ");
correspondance_accents($ascii, $accents, "AE", "Æ");
correspondance_accents($ascii, $accents, "OE", "Œ");
correspondance_accents($ascii, $accents, "-", " ");
$input = str_replace($accents, $ascii, $input);
$first = preg_replace("/[^a-zA-Z]/", "a", substr($input, 0, 1));
$rest = preg_replace("/[^-a-zA-Z0-9_]/", "-", substr($input, 1));
return $first . $rest;
}
/**** Début PATH ****/ /**** Début PATH ****/
// http://www.liranuna.com/php-path-resolution-class-relative-paths-made-easy/ // http://www.liranuna.com/php-path-resolution-class-relative-paths-made-easy/

View File

@ -33,6 +33,24 @@
</a> </a>
</xsl:template> </xsl:template>
<xsl:template match="input_text_line">
<input type="text" value="{@value}"/>
</xsl:template>
<xsl:template match="input_text_rich">
<input type="text" value="{@value}"/>
</xsl:template>
<xsl:template match="input_submit">
<input type="submit" value="{@label}"/>
</xsl:template>
<xsl:template match="form">
<form action="{@action}">
<xsl:apply-templates select="*"/>
</form>
</xsl:template>
<xsl:template match="span"> <xsl:template match="span">
<!-- TODO : mettre le class="?" ssi c'est non vide. --> <!-- TODO : mettre le class="?" ssi c'est non vide. -->
<span class="{@class}"> <span class="{@class}">

View File

@ -31,12 +31,6 @@ Config::set('db_utilisateur', "root");
Config::set('db_mot_de_passe', " "); Config::set('db_mot_de_passe', " ");
// Base dans la base de données (non, ils pouvaient pas faire plus compliqué... m'éneeeeeervent). // Base dans la base de données (non, ils pouvaient pas faire plus compliqué... m'éneeeeeervent).
// Sous ubuntu :
// mysql -u root -p
// taper le mot de passe donné à l'installation
// create database mss;
// show databases;
// quit
Config::set('db_base', "mss"); Config::set('db_base', "mss");
// Préfixe pour les tables de la base de données. // Préfixe pour les tables de la base de données.
@ -44,4 +38,8 @@ Config::set('db_prefixe', "moteur_site_simple_2010_");
// ======== FIN CONFIGURATION ======= // ======== FIN CONFIGURATION =======
if (file_exists(dirname(__FILE__) . '/config_free.fr.php5') && preg_match('/.free\.fr$/', $_SERVER['SERVER_NAME'])) {
require_once(dirname(__FILE__) . '/config_free.fr.php5');
}
?> ?>

1
cms2/index.php Normal file
View File

@ -0,0 +1 @@
<?php require_once(dirname(__FILE__) . "/index.php5"); ?>

View File

@ -1,5 +1,5 @@
<?php <?php
require_once(dirname(__FILE__) . "/code/index.php"); require_once(dirname(__FILE__) . "/code/index.php5");
?> ?>

View File

@ -2,9 +2,9 @@
class mAdminListeUtilisateurs extends mPage { class mAdminListeUtilisateurs extends mPage {
public static function info($module) { public static function info($module) {
ressources_statiques("i_icône_nouvelle_page c_style"); Module::ressources_statiques("i_icône_nouvelle_page c_style");
ressources_dynamiques("h_page h_liste_mots_de_passe"); Module::ressources_dynamiques("h_page h_liste_mots_de_passe");
type_liens("enfants", "mAdminUtilisateur"); Module::type_liens("enfants", "mAdminUtilisateur");
} }
public function res_i_icône_nouvelle_page() { public function res_i_icône_nouvelle_page() {
@ -18,9 +18,9 @@ class mAdminListeUtilisateurs extends mPage {
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 +prenom"), function($e, $tr) { $l = $d->article()->w_tableau($this->enfants(true, "+nom +prenom"), create_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);
$nouveau->text("Nouvel utilisateur"); $nouveau->text("Nouvel utilisateur");
return $d; return $d;
@ -29,27 +29,27 @@ class mAdminListeUtilisateurs extends mPage {
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_permissions = 'utilisateurs'", "+nom +prenom"), function($e, $li) { $l = $d->article()->w_liste($this->enfants("groupe_permissions = 'utilisateurs'", "+nom +prenom"), create_function('$e, $li', '
$e->rendu("h_admin_mdp", $li); $e->rendu("h_admin_mdp", $li);
}); '));
return $d; return $d;
} }
} }
class mAdminUtilisateur extends mPage { class mAdminUtilisateur extends mPage {
public static function info($module) { public static function info($module) {
ressources_statiques("c_style"); Module::ressources_statiques("c_style");
// TODO : h_page = affichage "en grand" de l'utilisateur (~= page perso, par ex. destination d'un lien de la page contacts). // TODO : h_page = affichage "en grand" de l'utilisateur (~= page perso, par ex. destination d'un lien de la page contacts).
ressources_dynamiques("h_admin"); Module::ressources_dynamiques("h_admin");
// TODO : le couple (nom,prenom) doit être unique. // TODO : le couple (nom,prenom) doit être unique.
attribut("nom", "text_line", "Dupondt"); Module::attribut("nom", "text_line", "Dupondt");
attribut("prenom", "text_line", "Jean"); Module::attribut("prenom", "text_line", "Jean");
attribut("equipe", "uid", "null"); Module::attribut("equipe", "uid", "null");
attribut("mot_de_passe", "password", ""); Module::attribut("mot_de_passe", "password", "");
// TODO : permissions différentes pour les propriétés peut_se_connecter et groupe_permissions. // TODO : permissions différentes pour les propriétés peut_se_connecter et groupe_permissions.
// L'utilisateur ne doit pas pouvoir les modifier. // L'utilisateur ne doit pas pouvoir les modifier.
attribut("groupe_permissions", "groupe_permissions", "utilisateurs"); Module::attribut("groupe_permissions", "groupe_permissions", "utilisateurs");
attribut("peut_se_connecter", "bool", "false"); Module::attribut("peut_se_connecter", "bool", "false");
} }
public function res_c_style() { public function res_c_style() {
@ -84,6 +84,6 @@ class mAdminUtilisateur extends mPage {
} }
} }
module("mAdminListeUtilisateurs"); Module::add_module("mAdminListeUtilisateurs");
?> ?>

View File

@ -1,5 +1,5 @@
<?php <?php
require_once(dirname(__FILE__) . "/admin-utilisateurs.php"); require_once(dirname(__FILE__) . "/admin-utilisateurs.php5");
?> ?>

View File

@ -1,20 +1,21 @@
<?php <?php
abstract class mGalerieBase extends mPage { abstract class mGalerieBase extends mPage {
protected static $texte_titre = "Galerie"; public static $texte_titre = "Galerie";
protected static $texte_nouvelle_page = "Nouvel élément"; public static $texte_nouvelle_page = "Nouvel élément";
protected static $icone_nouvelle_page = "nouvelle_periode.png"; public static $icone_nouvelle_page = "nouvelle_periode.png";
protected static $type_enfants = "mGaleriePeriode"; public static $type_enfants = "mGaleriePeriode";
public static function info($module) { public static function info($module) {
ressources_statiques("i_icone_nouvelle_page c_style"); $cvars = get_class_vars($module);
ressources_dynamiques("h_page h_miniature h_mini_miniature"); Module::ressources_statiques("i_icone_nouvelle_page c_style");
type_liens("enfants", $module::$type_enfants); Module::ressources_dynamiques("h_page h_miniature h_mini_miniature");
type_liens("liens", "*"); Module::type_liens("enfants", $cvars['type_enfants']);
attribut("titre", "text_line", $module::$texte_titre); Module::type_liens("liens", "*");
attribut("description", "text_rich", ""); Module::attribut("titre", "text_line", $cvars['texte_titre']);
attribut("publier", "bool", "true"); Module::attribut("description", "text_rich", "");
attribut("apercu", "bool", "false"); // TODO ! Module::attribut("publier", "bool", "true");
Module::attribut("apercu", "bool", "false"); // TODO !
} }
public function res_i_icone_nouvelle_page() { public function res_i_icone_nouvelle_page() {
@ -27,10 +28,10 @@ abstract class mGalerieBase extends mPage {
public function res_h_page($d) { public function res_h_page($d) {
$d->w_en_tete($this->titre, $this->description); // 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"), function($e, $li) { $l = $d->article()->w_liste($this->enfants(true, "-date_creation"), create_function('$e, $li', '
$a = $li->a($e->url()); $a = $li->a($e->url());
$e->rendu("h_miniature", $a); $e->rendu("h_miniature", $a);
}); '));
$nouveau = $l->li(); $nouveau = $l->li();
// TODO : nouveau devrait être un lien, bouton, ... // TODO : nouveau devrait être un lien, bouton, ...
$nouveau->span("miniature")->img("", $this->url("i_icone_nouvelle_page")); $nouveau->span("miniature")->img("", $this->url("i_icone_nouvelle_page"));
@ -47,7 +48,7 @@ abstract class mGalerieBase extends mPage {
public function res_h_miniature($d) { public function res_h_miniature($d) {
$this->res_h_mini_miniature($d->span("miniature")); $this->res_h_mini_miniature($d->span("miniature"));
$d->span("titre")->w_field($this->titre); $d->span("titre")->w_r_field($this->titre);
return $d; return $d;
} }
@ -69,34 +70,34 @@ abstract class mGalerieBase extends mPage {
} }
class mGalerieIndex extends mGalerieBase { class mGalerieIndex extends mGalerieBase {
protected static $texte_titre = "Galerie"; public static $texte_titre = "Galerie";
protected static $texte_nouvelle_page = "Nouvelle période"; public static $texte_nouvelle_page = "Nouvelle période";
protected static $icone_nouvelle_page = "nouvelle_periode.png"; public static $icone_nouvelle_page = "nouvelle_periode.png";
protected static $type_enfants = "mGaleriePeriode"; public static $type_enfants = "mGaleriePeriode";
} }
class mGaleriePeriode extends mGalerieBase { class mGaleriePeriode extends mGalerieBase {
protected static $texte_titre = "Période"; public static $texte_titre = "Période";
protected static $texte_nouvelle_page = "Nouvel événement"; public static $texte_nouvelle_page = "Nouvel événement";
protected static $icone_nouvelle_page = "nouvel_evenement.png"; public static $icone_nouvelle_page = "nouvel_evenement.png";
protected static $type_enfants = "mGalerieEvenement"; public static $type_enfants = "mGalerieEvenement";
} }
class mGalerieEvenement extends mGalerieBase { class mGalerieEvenement extends mGalerieBase {
protected static $texte_titre = "Événement"; public static $texte_titre = "Événement";
protected static $texte_nouvelle_page = "Nouvelle photo"; public static $texte_nouvelle_page = "Nouvelle photo";
protected static $icone_nouvelle_page = "nouvelle_photo.png"; public static $icone_nouvelle_page = "nouvelle_photo.png";
protected static $type_enfants = "mGaleriePhoto"; public static $type_enfants = "mGaleriePhoto";
} }
class mGaleriePhoto extends mGalerieBase { class mGaleriePhoto extends mGalerieBase {
protected static $texte_titre = "Photo"; public static $texte_titre = "Photo";
public static function info($module) { public static function info($module) {
ressources_statiques("c_style"); Module::ressources_statiques("c_style");
ressources_dynamiques(inherit(get_parent_class()), "i_grande i_image i_miniature"); Module::ressources_dynamiques(new Inherit(get_parent_class()), "i_grande i_image i_miniature");
attribut(inherit(get_parent_class())); Module::attribut(new Inherit(get_parent_class()));
attribut("image", "img_file", ""); Module::attribut("image", "img_file", "");
} }
public function set_titre($titre) { public function set_titre($titre) {
@ -115,8 +116,8 @@ class mGaleriePhoto extends mGalerieBase {
} }
public function res_h_page($d) { public function res_h_page($d) {
$d->w_en_tete($this->titre, "".$this->description); // En-tête standard. $d->w_en_tete($this->titre, toString($this->description)); // En-tête standard.
$d->w_img_file($this->description, $this->i_image); $d->w_img_file_desc($this->image, $this->description);
return $d; return $d;
} }
@ -166,9 +167,9 @@ class mGaleriePhoto extends mGalerieBase {
} }
} }
module("mGalerieIndex"); Module::add_module("mGalerieIndex");
module("mGaleriePeriode"); Module::add_module("mGaleriePeriode");
module("mGalerieEvenement"); Module::add_module("mGalerieEvenement");
module("mGaleriePhoto"); Module::add_module("mGaleriePhoto");
?> ?>

View File

@ -1,5 +1,5 @@
<?php <?php
require_once(dirname(__FILE__) . "/galerie.php"); require_once(dirname(__FILE__) . "/galerie.php5");
?> ?>

View File

@ -1,11 +1,12 @@
<?php <?php
// Dépendance commune à tous les modules : // Dépendances communes à tous les modules :
require_once(dirname(__FILE__) . "/../code/page.php"); require_once(dirname(__FILE__) . "/../code/module.php5");
require_once(dirname(__FILE__) . "/../code/page.php5");
require_once(dirname(__FILE__) . "/galerie/include.php"); require_once(dirname(__FILE__) . "/galerie/include.php5");
require_once(dirname(__FILE__) . "/admin/include.php"); require_once(dirname(__FILE__) . "/admin/include.php5");
require_once(dirname(__FILE__) . "/squelette/include.php"); require_once(dirname(__FILE__) . "/squelette/include.php5");
require_once(dirname(__FILE__) . "/nouveautes/include.php"); require_once(dirname(__FILE__) . "/nouveautes/include.php5");
?> ?>

View File

@ -1,5 +1,5 @@
<?php <?php
require_once(dirname(__FILE__) . "/nouveautes.php"); require_once(dirname(__FILE__) . "/nouveautes.php5");
?> ?>

View File

@ -2,12 +2,12 @@
class mNouveautes extends mPage { class mNouveautes extends mPage {
public static function info($module) { public static function info($module) {
ressources_statiques("i_icône_nouvelle_page c_style"); Module::ressources_statiques("i_icône_nouvelle_page c_style");
ressources_dynamiques("h_page"); Module::ressources_dynamiques("h_page");
type_liens("sources", "*"); Module::type_liens("sources", "*");
attribut("titre", "text_line", "Nouveautés"); Module::attribut("titre", "text_line", "Nouveautés");
attribut("description", "text_rich", ""); Module::attribut("description", "text_rich", "");
attribut_global("dans_nouveautes", "bool", "true"); Module::attribut_global("dans_nouveautes", "bool", "true");
} }
public function res_i_icône_nouvelle_page() { public function res_i_icône_nouvelle_page() {
@ -21,12 +21,12 @@ class mNouveautes extends mPage {
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", 10), function($e, $li) { $l = $d->article()->w_liste($this->enfants(true, "-date_creation", 10), create_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.
$e->rendu("h_miniature", $a); $e->rendu("h_miniature", $a);
}); '));
$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("action")->text("Ajouter un article aux nouveautés."); $nouveau->span("action")->text("Ajouter un article aux nouveautés.");
@ -34,6 +34,6 @@ class mNouveautes extends mPage {
} }
} }
module("mNouveautes"); Module::add_module("mNouveautes");
?> ?>

View File

@ -1,5 +1,5 @@
<?php <?php
require_once(dirname(__FILE__) . "/squelette.php"); require_once(dirname(__FILE__) . "/squelette.php5");
?> ?>

View File

@ -4,7 +4,7 @@ class mSquelette extends mPage {
// Trouver un moyen pour que mSquelette soit appellé après avoir généré la page, pour qu'il puisse l'emballer. // Trouver un moyen pour que mSquelette soit appellé après avoir généré la page, pour qu'il puisse l'emballer.
public static function info($module) { public static function info($module) {
ressources_dynamiques("c_css_principal text/css"); Module::ressources_dynamiques("c_css_principal text/css");
} }
public function res_c_css_principal() { public function res_c_css_principal() {
@ -13,6 +13,6 @@ class mSquelette extends mPage {
} }
} }
module("mSquelette"); Module::add_module("mSquelette");
?> ?>