Implémentation quasi-complète du module Galerie.

This commit is contained in:
Georges Dupéron 2010-10-05 16:27:29 +02:00
parent bae7ebbf9e
commit a75254c8ca
6 changed files with 219 additions and 85 deletions

View File

@ -48,6 +48,7 @@ class ElementDocument {
} }
public function __call($fn, $args) { public function __call($fn, $args) {
// TODO (peut-être ?): si on ne peut pas ajouter directement un élément, chercher un chemin qui permette de l'ajouter (p.ex. un strong directement à la racine d'un document, on ajoutera un p).
if (array_key_exists($this->type, self::$enfantsÉléments) if (array_key_exists($this->type, self::$enfantsÉléments)
&& in_array($fn, self::$enfantsÉléments[$this->type])) { && in_array($fn, self::$enfantsÉléments[$this->type])) {
$elem = new self($fn); $elem = new self($fn);

View File

@ -5,16 +5,26 @@
class Page { class Page {
// Convention de nommage : // Convention de nommage :
// res_h_xxx = html, res_i_xxx = image, res_c_xxx = css, res_j_xxx = javascript // res_h_xxx = html, res_i_xxx = image, res_c_xxx = css, res_j_xxx = javascript
protected static $ressources_statiques = array(); public static function ressources_statiques() {
protected static $ressources_dynamiques = array(); return array();
protected static $attributs = array( }
public static function ressources_dynamiques() {
return array();
}
public static function types_enfants() {
// true => n'importe quel type est accepté
// null ou false => aucun type.
return true;
}
public static function attributs() {
return array(
"date_creation" => 0, "date_creation" => 0,
"date_modification" => 0, "date_modification" => 0,
"publier" => false, "publier" => false,
"nom_systeme" => "", "nom_systeme" => "",
"composant_url" => "page", "composant_url" => "page",
); );
protected static $enfants = true; // Type des enfants. True pour tout autoriser. }
public static function ajouter_type($type) { public static function ajouter_type($type) {
niy("Page::ajouter_type($type);"); niy("Page::ajouter_type($type);");
@ -47,9 +57,19 @@ class Page {
niy("uid"); niy("uid");
} }
public function select($requête) { /* public function select($requête) {
// Renvoie un objet de la classe CollectionPages. // Renvoie un objet de la classe CollectionPages.
niy("select"); niy("select");
}*/
public function enfants($condition = true, $ordre = "date desc", $limit = 0, $offset = 0) {
// Renvoie un objet de la classe CollectionPages.
// Si $condition === true, il n'y a pas de condition
// ex: $condition = "@apercu = true"
// ordre = null => ordre = "date desc"
// limit = null || limit = 0 => pas de limite
// offset = null => offset = 0
niy("enfants");
} }
public function __get($nom) { public function __get($nom) {

View File

@ -1,8 +1,15 @@
<?php <?php
function qw($arg, $sep = " ") { function qw($arg, $arg2 = null, $sep = " ") {
if (is_array($arg)) return $arg;
$ret = array(); $ret = array();
if (is_array($arg)) {
if ($arg2 === null) {
return $arg;
} else {
$ret = $arg;
$arg = $arg2;
}
}
foreach(explode($sep, $arg) as $v) { foreach(explode($sep, $arg) as $v) {
if ($v !== "") array_push($ret, $v); if ($v !== "") array_push($ret, $v);
} }

View File

@ -1,68 +0,0 @@
<?php
abstract class GalerieBase extends Page {
protected static $ressources_statiques = array("i_icône_nouvelle_page image/jpeg", "c_style text/css");
protected static $ressources_dynamiques = array("h_page Document", "h_miniature Document", "h_mini_miniature Document");
protected static $attributs = array(
"titre" => "Galerie",
"description" => ""
);
protected static $enfants = "GalerieÉvènement";
protected static $texte_nouvelle_page = "Nouvel élément";
protected static $fichier_nouvelle_page = "nouvelle_periode.png";
public function res_i_icône_nouvelle_page() {
return StockageFichiers::envoyer_fichier_statique(Path::combine(dirname(__FILE__), self::$fichier_nouvelle_page));
}
public function res_c_style() {
niy("res_c_style");
}
public function res_h_page() {
$d = new Document();
$d->w_en_tete(); // En-tête standard.
$l = $d->article()->w_liste($this->select("./*", "date desc"), function($e, $li) {
$li->a($e->uid())->append(
$e->rendu("h_miniature")
);
});
$nouveau = $l->li();
$nouveau->span("miniature")->img("", $this->url("i_icône_nouvelle_page"));
$nouveau->span("titre")->texte(self::$texte_nouvelle_page);
return $d;
}
public function res_h_miniature() {
$e = new ElementDocument();
$e->span("miniature")->append($this->res_h_miniature_image());
$e->span("titre")->_field($this->titre);
return $e;
}
public function res_h_miniature_image() {
// Prendre le 1er par ordre décroissant sur la date, ou bien :
// TODO : prendre l'élément ayant la propriété "aperçu" à true (s'il y en a un, sinon date).
return $this->select("./*", "date desc", 1)->rendu("h_miniature_image");
}
}
class GalerieIndex extends GalerieBase {
protected static $texte_nouvelle_page = "Nouvelle période";
protected static $fichier_nouvelle_page = "nouvelle_periode.png";
}
class GaleriePériode extends GalerieBase {
protected static $texte_nouvelle_page = "Nouvel événement";
protected static $fichier_nouvelle_page = "nouvel_evenement.png";
}
class GalerieÉvénement extends GalerieBase {
protected static $texte_nouvelle_page = "Nouvelle photo";
protected static $fichier_nouvelle_page = "nouvelle_photo.png";
}
Page::ajouter_type("GalerieIndex");
?>

View File

@ -0,0 +1,174 @@
<?php
abstract class GalerieBase extends Page {
protected static $texte_titre = "Galerie";
protected static $texte_nouvelle_page = "Nouvel élément";
protected static $icône_nouvelle_page = "nouvelle_periode.png";
public static function ressources_statiques() {
return qw("i_icône_nouvelle_page c_style"); }
public static function ressources_dynamiques() {
return qw("h_page h_miniature h_mini_miniature");
}
public static function types_enfants() {
return qw("GalerieÉvènement");
}
public static function attributs() {
return array(
"titre" => self::$texte_titre,
"description" => ""
);
}
public function res_i_icône_nouvelle_page() {
return StockageFichiers::envoyer_fichier_statique(Path::combine(dirname(__FILE__), self::$icône_nouvelle_page));
}
public function res_c_style() {
niy("res_c_style");
}
public function res_h_page() {
$d = new Document();
$d->w_en_tete(); // En-tête standard.
$l = $d->article()->w_liste($this->enfants(true, "date desc"), function($e, $li) {
$li->a($e->uid())->append(
$e->rendu("h_miniature")
);
});
$nouveau = $l->li();
$nouveau->span("miniature")->img("", $this->url("i_icône_nouvelle_page"));
$nouveau->span("titre")->texte(self::$texte_nouvelle_page);
return $d;
}
public function res_h_miniature() {
$e = new ElementDocument();
$e->span("miniature")->append($this->res_h_mini_miniature());
$e->span("titre")->_field($this->titre);
return $e;
}
public function res_h_mini_miniature() {
// Prendre le 1er par ordre décroissant sur la date, ou bien :
// TODO : prendre l'élément ayant la propriété "aperçu" à true (s'il y en a un, sinon date).
$a = $this->enfants("@apercu = true", "date desc", 1);
if ($a->size() != 1)
$a = $this->enfants(true, "date desc", 1);
return $a->get(0)->rendu("h_mini_miniature");
}
}
class GalerieIndex extends GalerieBase {
protected static $texte_titre = "Galerie";
protected static $texte_nouvelle_page = "Nouvelle période";
protected static $icône_nouvelle_page = "nouvelle_periode.png";
}
class GaleriePériode extends GalerieBase {
protected static $texte_titre = "Période";
protected static $texte_nouvelle_page = "Nouvel événement";
protected static $icône_nouvelle_page = "nouvel_evenement.png";
}
class GalerieÉvénement extends GalerieBase {
protected static $texte_titre = "Événement";
protected static $texte_nouvelle_page = "Nouvelle photo";
protected static $icône_nouvelle_page = "nouvelle_photo.png";
}
class GaleriePhoto {
protected static $texte_titre = "Photo";
public static function ressources_statiques() {
return qw("c_style");
}
public static function ressources_dynamiques() {
return qw(parent::ressources_dynamiques(), "i_grande i_image i_miniature");
}
public static function types_enfants() {
return null;
}
public static function attributs() {
$a = parent::attributs();
$a["image"] = null; // TODO !! TODO !! TODO
return $a;
}
public function set_titre($titre) {
// TODO : set url quand on set titre !
// TODO : valeur initiale pour l'url !
niy("GaleriePhoto::set_titre($titre)");
}
public function set_image($fichier_image) {
// Faire la miniature et l'image de taille "normale".
niy("GaleriePhoto::set_image");
}
public function res_c_style() {
niy("GaleriePhoto::res_c_style");
}
public function res_h_page() {
$d = new Document();
$d->w_en_tete(); // En-tête standard.
// TODO : la description devrait être soit dans w_en_tete, soit dans w_img !
$d->w_img($this->description, $this->i_image);
return $d;
}
public function res_h_mini_miniature() {
$d = new Document();
$d->img($this->description, $this->i_image);
return $d;
}
// ===============================
public static function creer_miniature($chemin_fs, $largeur_max, $hauteur_max) {
$chemin_fs_dest = tempnam(dirname($chemin_fs), "img");
if ($chemin_fs_dest === false) return false; // TODO : return Erreur::...(...);
/* TODO : utiliser imagealphablending si nécessaire... http://www.php.net/manual/fr/function.imagecreatefrompng.php#85754 */
$image = imagecreatefromjpeg($chemin_fs); // ... formpng()
$largeur = imageSX($image);
$hauteur = imageSY($image);
if ($largeur < $largeur_max && $hauteur < $hauteur_max) {
$largeur_miniature = $largeur;
$hauteur_miniature = $hauteur;
} else if ($largeur / $hauteur < $largeur_max / $hauteur_max) { // limité par la hauteur.
$largeur_miniature = $largeur_max;
$hauteur_miniature = $hauteur * $largeur_miniature/$largeur;
} else { // limité par la largeur
$hauteur_miniature = $hauteur_max;
$largeur_miniature = $largeur * $hauteur_miniature/$hauteur;
}
$miniature = ImageCreateTrueColor($largeur_miniature, $hauteur_miniature); // miniatures de tailles différentes
var_dump($largeur_miniature, $hauteur_miniature, $largeur, $hauteur);
imagecopyresampled(
$miniature, // image destination
$image, // image source
0, // x destination
0, // y destination
0, // x source
0, // y source
$largeur_miniature, // largeur destination
$hauteur_miniature, // hauteur destination
$largeur, // largeur source
$hauteur // hauteur source
);
imagedestroy($image); // On libère la mémoire le plus tôt possible.
imagejpeg($miniature, $chemin_fs_dest);
imagedestroy($miniature);
return $chemin_fs_dest;
}
}
Page::ajouter_type("GalerieIndex");
Page::ajouter_type("GaleriePériode");
Page::ajouter_type("GalerieÉvénement");
Page::ajouter_type("GaleriePhoto");
?>

View File

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