Et cela exclusivement en assemblant des widgets Pxxo.
Voici la liste des widgets qui seront utilisés :
Voici comment devront être imbriqués les différents widgets :
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
Réalisez un widget Albums permettant :
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 :
Réalisez un widget Photos permettant :
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 :
Le widget Index va permettre :
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 :
Jusqu'à présent nous avons utiliser plusieurs widgets génériques. Le but ici est de relooker localement ces widgets :
Au final on devra essayer d'obtenir une galerie ressemblant à ceci :
Aide : la bandeau est disponible a cette adresse 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 :
Voici la solution de cet exercice :