Compatibilité free.fr : suite et fin. Pas de clôtures (fonctions anonymes), pas de __callStatic, ... :( *haine profonde*

This commit is contained in:
Georges Dupéron 2010-10-15 12:30:26 +02:00
parent fc654bde1c
commit 91de3f81c9
13 changed files with 122 additions and 93 deletions

1
cms2/.htaccess Normal file
View File

@ -0,0 +1 @@
php 5

View File

@ -1,8 +1,11 @@
- Debug : grouper les erreurs, améliorer l'affichage.
- 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
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...
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).

View File

@ -15,7 +15,7 @@ class BDD {
Config::get('db_mot_de_passe')
);
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.
self::begin_transaction();
@ -42,10 +42,10 @@ class BDD {
public static function init() {
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) {
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;
}
@ -113,13 +113,13 @@ class BDD {
}
public static function unbuf_query($q) {
debug::sql($q . ";");
mysql_unbuffered_query($q . ";", self::get()) or Debug::erreur_sql();
Debug("sql", $q . ";");
mysql_unbuffered_query($q . ";", self::get()) or Debug("erreur_sql");
}
public static function select($q) {
debug::sql($q);
$qres = mysql_query($q, BDD::get()) or Debug::erreur_sql();
Debug("sql", $q);
$qres = mysql_query($q, BDD::get()) or Debug("erreur_sql");
$ret = array();
while ($row = mysql_fetch_array($qres)) {
$ret[] = $row;
@ -131,18 +131,18 @@ class BDD {
public static function select_one($q, $strict = true) {
$res = self::select($q);
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;
}
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];
}
public static function modify($q) {
debug::sql($q . ";");
mysql_unbuffered_query($q . ";", self::get()) or Debug::erreur_sql();
Debug("sql", $q . ";");
mysql_unbuffered_query($q . ";", self::get()) or Debug("erreur_sql");
// http://stackoverflow.com/questions/621369/sql-insert-and-catch-the-id-auto-increment-value
return mysql_insert_id(self::get());
}
@ -154,7 +154,7 @@ class BDD {
public static function close() {
if (is_resource(self::$handle)) {
self::commit();
mysql_close(self::get()) or Debug::erreur_sql();
mysql_close(self::get()) or Debug("erreur_sql");
self::$handle = null;
}
}
@ -178,8 +178,8 @@ class BDDCell {
public function valeur() {
return $this->valeur;
}
public function __toString() {
return "".$this->valeur;
public function toString() {
return toString($this->valeur);
}
}

View File

@ -10,7 +10,7 @@ class Config {
public static function get($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";
die();
}

View File

@ -1,6 +1,6 @@
<?php
class Debug {
class _Debug {
public static $types_erreur = array(
"erreur" => '<span style="color:red">Erreur</span>',
"niy" => '<span style="color:brown">Pas encore implémenté</span>',
@ -20,11 +20,11 @@ class Debug {
public static $toutes_erreurs = false; // true <=> ignorer le filtre.
public static $erreurs = array();
public static function __callStatic($nom, $args) {
public function __call($nom, $args) {
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) {
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 {
self::push($nom, $args[0]);
}
@ -67,8 +67,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) {
Debug::niy($name);
Debug("niy", $name);
}
?>

View File

@ -112,7 +112,7 @@ class ElementDocument {
$max = 0;
foreach (self::$types[$type]["attributs_oblig"] as $i => $nom) {
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]);
$max = $i;
@ -142,7 +142,7 @@ class ElementDocument {
} elseif (self::has_widget($fn)) {
return $this->créer_widget($fn, $args);
} 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;
}
}
@ -188,98 +188,98 @@ ElementDocument::add_type("text", "", "text");
ElementDocument::add_widget("titre", function($d, $cell){
ElementDocument::add_widget("titre", create_function('$d, $cell', '
// renvoie un <h2> ou un <input> selon les droits
$d->header()->title()->text("".$cell);
$d->header()->title()->text(toString($cell));
// TODO : modification si on a les droits.
$d->article()->hX()->text("".$cell);
});
$d->article()->hX()->text(toString($cell));
'));
ElementDocument::add_widget("en_tete", function($d, $cell_titre, $cell_description){
ElementDocument::add_widget("en_tete", create_function('$d, $cell_titre, $cell_description', '
$d->w_titre($cell_titre);
$d->w_description($cell_description);
});
'));
ElementDocument::add_widget("description", function($d, $cell){
ElementDocument::add_widget("description", create_function('$d, $cell', '
// TODO : modification si on a les droits.
return $d->article()->p()->text("".$cell);
});
return $d->article()->p()->text(toString($cell));
'));
ElementDocument::add_widget("field", function($d, $cell){
ElementDocument::add_widget("field", create_function('$d, $cell', '
$f = $d->span("field");
$f->text("NIY : " . $cell);
$f->text("NIY : " . toString($cell));
return $f;
});
'));
ElementDocument::add_widget("text_line", function($d, $cell){
ElementDocument::add_widget("text_line", create_function('$d, $cell', '
// TODO : modification si on a les droits.
return $d->text("".$cell);
});
return $d->text(toString($cell));
'));
ElementDocument::add_widget("text_nix", function($d, $cell){
ElementDocument::add_widget("text_nix", create_function('$d, $cell', '
// Texte naze (sans espaces etc.) à la *nix.
// TODO : modification si on a les droits.
// TODO : vérifier que ça match [a-zA-Z][-a-zA-Z0-9_]*
return $d->text("".$cell);
});
return $d->text(toString($cell));
'));
ElementDocument::add_widget("text_rich", function($d, $cell){
ElementDocument::add_widget("text_rich", create_function('$d, $cell', '
// TODO : modification si on a les droits.
// TODO : rendu du texte riche.
return $d->p()->text("".$cell);
});
return $d->p()->text(toString($cell));
'));
ElementDocument::add_widget("bool", function($d, $cell){
ElementDocument::add_widget("bool", create_function('$d, $cell', '
// checkbox
return $d->text("Not Implemented Yet : w_bool($cell)");
});
'));
ElementDocument::add_widget("bouton", function($d, $texte, $page_callback, $ressource_callback, $action_callback){
ElementDocument::add_widget("bouton", create_function('$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 ?
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){
ElementDocument::add_widget("img_file", create_function('$d, $cell_description, $cell_img', '
// TODO : modification si on a les droits.
// input[file] et <img>
$img = $d->img("".$cell_description, "".$cell_img);
$img = $d->img(toString($cell_description), toString($cell_img));
$d->w_description($cell_description);
return $img;
});
'));
ElementDocument::add_widget("date", function($d, $select){
ElementDocument::add_widget("date", create_function('$d, $select', '
// affichage localisé.
return $d->text("Not Implemented Yet : date($select)");
});
'));
ElementDocument::add_widget("liste", function($d, $list_cells, $function_formattage_elements) {
ElementDocument::add_widget("liste", create_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) {
ElementDocument::add_widget("tableau", create_function('$d, $select, $function_formattage_elements', '
$t = $d->table();
$tr = $t->tbody()->tr();
$tr->td()->text("Not Implemented Yet");
return $t;
});
'));
?>

View File

@ -22,7 +22,7 @@ function main() {
$rendu = $page->rendu($res);
BDD::close();
$rendu->erreurs()->litteral(Debug::afficher());
$rendu->erreurs()->litteral(_Debug::afficher());
$rendu = $rendu->to_XHTML_5();
echo $rendu;

View File

@ -70,7 +70,7 @@ function type_liens($groupe, $type = null) {
mPage::$limitation_infos_module = $lim;
} else {
if ($type === null) {
Debug::erreur('fonction type_liens() : le paramètres $type est obligatoire.');
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;
@ -90,10 +90,10 @@ function attribut($nom, $type = null, $defaut = null) {
mPage::$limitation_infos_module = $lim;
} else {
if ($type === null || $defaut === null) {
Debug::erreur('fonction attribut() : les paramètres $type et $defaut est obligatoire.');
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.");
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);
}
@ -392,7 +392,7 @@ class mPage {
public function set_prop_direct($nom, $val) {
// Modifie l'attribut "$nom" dans la BDD.
$update_table = (self::est_propriete_globale($nom)) ? "_pages" : $this->nom_module();
$update = "update " . BDD::table($update_table) . " set $nom = '" . mysql_real_escape_string("".$val) . "' where _uid_page = " . $this->uid();
$update = "update " . BDD::table($update_table) . " set $nom = '" . mysql_real_escape_string(toString($val)) . "' where _uid_page = " . $this->uid();
BDD::unbuf_query($update);
if ($nom != "date_modification") {
$this->date_modification = time();

View File

@ -37,6 +37,14 @@ function applyXSLT($xml, $xslt_file) {
return $xslt->transformToXML($dom);
}
function toString($obj) {
if (is_object($obj) && method_exists($obj, "toString")) {
return $obj->toString();
} else {
return "".$obj;
}
}
/**** Début PATH ****/
// http://www.liranuna.com/php-path-resolution-class-relative-paths-made-easy/

1
cms2/index.php Normal file
View File

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

View File

@ -18,9 +18,9 @@ class mAdminListeUtilisateurs extends mPage {
public function res_h_page($d) {
$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);
});
'));
$nouveau = $l->tbody(0)->tr()->td(6);
$nouveau->text("Nouvel utilisateur");
return $d;
@ -29,9 +29,9 @@ class mAdminListeUtilisateurs extends mPage {
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_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);
});
'));
return $d;
}
}

View File

@ -1,17 +1,26 @@
<?php
abstract class mGalerieBase extends mPage {
protected static $texte_titre = "Galerie";
protected static $texte_nouvelle_page = "Nouvel élément";
protected static $icone_nouvelle_page = "nouvelle_periode.png";
protected static $type_enfants = "mGaleriePeriode";
public static $texte_titre = "Galerie";
public static $texte_nouvelle_page = "Nouvel élément";
public static $icone_nouvelle_page = "nouvelle_periode.png";
public static $type_enfants = "mGaleriePeriode";
public static function info($module) {
$cvars = get_class_vars($module);
/* echo "<pre>";
var_dump($module);
var_dump($cvars);
echo "\n\n\n";
$cvars = get_class_vars("mGalerieBase");
var_dump($cvars);
echo "</pre>";
exit;*/
ressources_statiques("i_icone_nouvelle_page c_style");
ressources_dynamiques("h_page h_miniature h_mini_miniature");
type_liens("enfants", $module::$type_enfants);
type_liens("enfants", $cvars['type_enfants']);
type_liens("liens", "*");
attribut("titre", "text_line", $module::$texte_titre);
attribut("titre", "text_line", $cvars['texte_titre']);
attribut("description", "text_rich", "");
attribut("publier", "bool", "true");
attribut("apercu", "bool", "false"); // TODO !
@ -27,10 +36,10 @@ abstract class mGalerieBase extends mPage {
public function res_h_page($d) {
$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());
$e->rendu("h_miniature", $a);
});
'));
$nouveau = $l->li();
// TODO : nouveau devrait être un lien, bouton, ...
$nouveau->span("miniature")->img("", $this->url("i_icone_nouvelle_page"));
@ -69,28 +78,28 @@ abstract class mGalerieBase extends mPage {
}
class mGalerieIndex extends mGalerieBase {
protected static $texte_titre = "Galerie";
protected static $texte_nouvelle_page = "Nouvelle période";
protected static $icone_nouvelle_page = "nouvelle_periode.png";
protected static $type_enfants = "mGaleriePeriode";
public static $texte_titre = "Galerie";
public static $texte_nouvelle_page = "Nouvelle période";
public static $icone_nouvelle_page = "nouvelle_periode.png";
public static $type_enfants = "mGaleriePeriode";
}
class mGaleriePeriode extends mGalerieBase {
protected static $texte_titre = "Période";
protected static $texte_nouvelle_page = "Nouvel événement";
protected static $icone_nouvelle_page = "nouvel_evenement.png";
protected static $type_enfants = "mGalerieEvenement";
public static $texte_titre = "Période";
public static $texte_nouvelle_page = "Nouvel événement";
public static $icone_nouvelle_page = "nouvel_evenement.png";
public static $type_enfants = "mGalerieEvenement";
}
class mGalerieEvenement extends mGalerieBase {
protected static $texte_titre = "Événement";
protected static $texte_nouvelle_page = "Nouvelle photo";
protected static $icone_nouvelle_page = "nouvelle_photo.png";
protected static $type_enfants = "mGaleriePhoto";
public static $texte_titre = "Événement";
public static $texte_nouvelle_page = "Nouvelle photo";
public static $icone_nouvelle_page = "nouvelle_photo.png";
public static $type_enfants = "mGaleriePhoto";
}
class mGaleriePhoto extends mGalerieBase {
protected static $texte_titre = "Photo";
public static $texte_titre = "Photo";
public static function info($module) {
ressources_statiques("c_style");
@ -115,7 +124,7 @@ class mGaleriePhoto extends mGalerieBase {
}
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);
return $d;
}

View File

@ -21,12 +21,12 @@ class mNouveautes extends mPage {
public function res_h_page($d) {
$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());
// 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.
// 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.
$e->rendu("h_miniature", $a);
});
'));
$nouveau = $l->li();
$nouveau->span("miniature")->img("", $this->url("i_icône_nouvelle_page"));
$nouveau->span("action")->text("Ajouter un article aux nouveautés.");