====== Tutoriel : réaliser une galerie de photos ======
Et cela exclusivement en assemblant des widgets Pxxo.
===== Structure de la galerie =====
Voici la liste des widgets qui seront utilisés :
* **Index** : widget spécifique la racine de la galerie
* **Albums** : widget spécifique présentant les différents albums de la galerie
* **Photos** : widget spécifique présentant les différents photos d'un album de la galerie
* **[[fr:doc:pxxo_widgets_gallery|Pxxo_Widgets_Gallery_Lightbox]]** : widget générique permettant d'afficher une liste de photos
* **[[fr:doc:pxxo_widgets_directory_browse|Pxxo_Widgets_Directory_Browse]]** : widget générique permettant d'afficher une liste d'album (un album étant un répertoire)
* **[[fr:doc:pxxo_widgets_form_generic|Pxxo_Widgets_Form_Generic]]** : widget générique permettant la création de formulaires destinés à ajouter un album ou une photo
* **[[:fr:doc:Pxxo_Widgets_Layout_LMenu|Pxxo_Widgets_Layout_LMenu]]** : widget générique permettant d'afficher une vue en 2 colonnes
* **[[:fr:doc:Pxxo_Widgets_Layout_VBox|Pxxo_Widgets_Layout_VBox]]** : widget générique permettant d'afficher N widget verticalement l'un au dessous de l'autre
* **[[fr:doc:pxxo_widgets_decorator_controller|Pxxo_Widgets_Decorator_Controller]]** : widget générique permettant d'associer l'url à un album
Voici comment devront être imbriqués les différents widgets :
{{fr:tutorials:exercises:foto-widgets.png|}}
===== Préambule : structure de stockage =====
Pour stocker les albums et photos ou utilisera une arborescence de fichiers. Dans le répertoire data, à chaque répertoire correpond un album et dans chaque répertoire on trouvera les fichiers images correspondant aux photos de l'album.
data/
album1/
photo1.jpg
photo2.jpg
album2/
photo1.jpg
photo2.jpg
===== Question 1 : créer le widget "Albums" =====
Réalisez un widget **Albums** permettant :
- d'afficher la liste des albums
- de créer un nouvel album
Ce widget devra prendre comme paramètre l'emplacement du répertoire de stockage **des albums**
__Aide__ : Paramètres pour Form_Generic :
$params = array();
$params['button'] = 'Add';
$params['fields'] = array('Label');
$params['types'] = array('text');
$params['required'] = array(true);
Paramètres pour Directory_Browse :
$params = array();
$params['Theme'] = 'green';
$params['path'] = $this->path;
$params['format'] = '#%2$s';
$params['print'] = '%name%';
$params['regex'] = '([a-z]+)';
$params['types'] = array('directory');
$params['title'] = 'Foto';
$params['description'] = 'Galerie de photos utlra light';
Voici la solution de cet exercice :
{{fr:tutorials:exercises:foto1.tar.gz|}}
===== Question 2 : créer le widget "Photos" =====
Réalisez un widget **Photos** permettant :
- d'afficher la liste des photos d'un albums
- d'ajouter une image à l'album (upload)
Ce widget devra prendre comme paramètre l'emplacement du répertoire de stockage de l'album à traiter.
__Aide__ : Le but ici n'est pas réussir à redimensionner une photo,
voici donc une fonction PHP permettant de retailler une image :
/**
* Creation d'une miniature au format PNG
*
* @param string fichier source
* @param string fichier destination
* @param integer hauteur maxi
* @param integer largeur maxi
* @return string fichier miniature
* @access public
*/
function resize_image($filename, $thumbname, $max_height, $max_width)
{
$extin = pathinfo($filename, PATHINFO_EXTENSION);
if ($extin == 'jpg') $extin = 'jpeg';
$extout = pathinfo($thumbname, PATHINFO_EXTENSION);
if ($extout == 'jpg') $extout = 'jpeg';
list($orig_width, $orig_height) = getimagesize($filename);
$width = $orig_width;
$height = $orig_height;
if ($height > $max_height) {
$width = ($max_height / $height) * $width;
$height = $max_height;
}
if ($width > $max_width) {
$height = ($max_width / $width) * $height;
$width = $max_width;
}
$funcin = 'imagecreatefrom'.$extin;
$funcout = 'image'.$extout;
if (!function_exists($funcin)) return false;
if (!function_exists($funcout)) return false;
$im = $funcin($filename);
$thumbnail = imagecreatetruecolor($width, $height);
imagecopyresized($thumbnail, $im, 0, 0, 0, 0, $width, $height, $orig_width, $orig_height);
$funcout($thumbnail, $thumbname, 80);
}
__Conseil :__ Le paramètrage de Form_Generic pour uploader une image peut s'écrire de cette manière
{
// ...
$params = array();
$params['button'] = 'Add';
$params['fields'] = array('Photo');
$params['types'] = array('file');
$params['required'] = array(true);
$form = new Pxxo_Widgets_Form_Generic($params);
$form->ClassID = $this->ClassID.'_Formulaire';
$this->connect('add', $form, 'defaut');
// ...
}
function add($values)
{
// ...
$filename = $this->path.DIRECTORY_SEPARATOR.strtolower($values[0]['name']);
$thumbname = preg_replace(',(\.\w+)$,', '_small\\1', $filename);
move_uploaded_file($values[0]['tmp_name'], $filename);
// On crée une miniature
resize_image($filename, $thumbname, 100, 100);
// On dimensionne l'image avec une taille acceptable pour le web.
resize_image($filename, $filename, 700, 700);
// ...
}
La doc de ce widget n'est pas encore écrite, voici les paramètres du widget Gallery_LightBox :
$params = array('Theme'=>'green','images'=>array(),'thumbs'=>array());
$d = dir($this->path);
while (false !== ($entry = $d->read())) {
$filename = $this->path.DIRECTORY_SEPARATOR.$entry;
if (is_file($filename)) {
if (strpos($filename,"_small")!==false)
$params['thumbs'][] = $this->putOnceImage($this->path.DIRECTORY_SEPARATOR.$entry);
else
$params['images'][] = $this->putOnceImage($this->path.DIRECTORY_SEPARATOR.$entry);
}
}
$d->close();
Voici la solution de cet exercice :
{{fr:tutorials:exercises:foto2.tar.gz|}}
===== Question 3 : créer le widget "Index" =====
Le widget Index va permettre :
- d'associer les deux widgets précédents
- de gérer l'album sélectionné
Pour sélectionner un dossier, on va réaliser une liaison entre ce qu'il y a dans l'URL et le nom d'un album.
Exemple :
/foto/truc/
sélectionnera automatiquement l'album **truc**.
Pour cela on va utiliser, Pxxo_Widget_Decorator_Controller
__Aide__: L'utilisation d'un controleur nécessite obligatoirement l'utilisation du mod_rewrite d'apache. Le but ici n'est pas d'apprendre à écrire des règles de réécriture, voici donc le fichier .htaccess qui va bien :
**IMPORTANT** : veuillez à adapter /url/vers/foto/
Options +Indexes FollowSymLinks SymLinksIfOwnerMatch
IndexOptions FancyIndexing IconsAreLinks
RewriteEngine on
RewriteBase /url/vers/foto/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . index.php
__Conseil__ : Le Décorateur contrôleur vient décorer l'objet racine de l'application, dans notre cas on pourra l'ajouter la classe Index comme ceci :
$this->addDecorator('Pxxo_Widgets_Decorator_Controller', array('prefix'=>''));
**ATTENTION** à l'ordre des décorateurs le décorateur Pxxo_Widgets_Decorator_Core doit être déclaré en dernier.
__Astuce__ : Pour obtenir l'url exacte de l'application, afin de bien paramétrer le format des urls dans Pxxo_widgets_Directory_Browse on peut utiliser Pxxo_Config :
$params['format'] = Pxxo_Config::get('url_root').'/%2$s/';
Voici la solution de cet exercice :
{{fr:tutorials:exercises:foto3.tar.gz|}}
===== Question 4 : Relooking =====
Jusqu'à présent nous avons utiliser plusieurs widgets génériques. Le but ici est de relooker localement ces widgets :
- Pxxo_Widgets_Form_Generic est utilisé 2 fois on pourra le relooker de manière globale le look du bouton submit.
- Pxxo_Widgets_Directory_Syndication est utilisé uniquement dans le widget Album, on le relookera donc uniquement pour ce widget, on pourra changer sa taille et les couleurs utilisées.
- Pxxo_Widgets_Layout_LMenu pourra lui être complètement redéfini au niveau HTML. On pourra ajouter une entête et une image dans cette entête
Au final on devra essayer d'obtenir une galerie ressemblant à ceci :
{{fr:tutorials:exercises:fotoq4.png|}}
__Aide__ : la bandeau est disponible a cette adresse [[http://sourcesup.cru.fr/cgi/viewvc.cgi/tags/apps/foto4/templates/Pxxo_Widgets_Layout_LMenu/baniere.jpg?root=pxxo&view=co|bandeau.jpg]]
Et la documentation concernant les Thèmes est à cette adresse :[[http://www.pxxo.net/fr/doc/pxxo#themes_hierarchiques]]
__Astuce__ :Relooker consiste à redéfinir les fichiers HTML/CSS. On pourra donc reprendre le contenu des fichiers d'origines pour les modifier :
* [[http://sourcesup.cru.fr/cgi/viewvc.cgi/trunk/widgets/Pxxo/Widgets/Directory/Browse/green/style-color.php.css?root=pxxo&view=markup|style-color.php.css de Directory_Browse]]
* [[http://sourcesup.cru.fr/cgi/viewvc.cgi/trunk/widgets/Pxxo/Widgets/Directory/Browse/green/style-layout.php.css?root=pxxo&view=markup|style-layout.php.css de Directory_Browse]]
* [[http://sourcesup.cru.fr/cgi/viewvc.cgi/trunk/widgets/Pxxo/Widgets/Form/Generic/defaut/style.php.css?root=pxxo&view=markup|style.php.css de Form_Generic]]
* [[http://sourcesup.cru.fr/cgi/viewvc.cgi/trunk/widgets/Pxxo/Widgets/Layout/LMenu/defaut/defaut.php.html?root=pxxo&sortdir=down&view=markup|defaut.php.html de Layout_LMenu]]
Voici la solution de cet exercice :
{{fr:tutorials:exercises:foto4.tar.gz|}}