Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Pages: 1
PhPThumb & Zend Framework
Introduction : Après avoir lu pas mal de chose pour intégrer la bibliothèque PhPThumb au ZF je vous présente un petit tuto qui permet d'utiliser cette bibliothèque très simplement
Télécharger la bibliothèque : http://phpthumb.gxdlabs.com/
Idée reçu : Sur beaucoup de blog/tuto (pour ainsi dire tous) il est dit de renommer les classes afin qu'elles concordent avec les règles de nommage du ZF, déja c'est long et fastidieux car il faut retrouver dans le code les noms des classes, on peut en oublier, etc... Mais en plus il y à beaucoup plus simple, c'est ce que nous allons voir ici
Installer la bibliothèque : Après avoir téléchargé la bibliothèque PhPThumb (cf : lien ci-dessus), dézipper puis placer le tout dans le dossier 'library' de votre application de manière à obtenir quelque chose qui ressemble à ça :
Ensuite ne toucher à rien, voila la bibliothèque est installée, pas besoin de renommer quoique ce soit.
Aide de vue : Il s'agit maintenant de créer un helper pour nos vue afin de pouvoir générer des vignettes en un clin d’œil. Pour cela il suffit de créer un fichier .php dans le dossier 'views/helpers/' et de le nommer Thumb.php, vous devriez avoir quelque chose comme ça :
Et enfin insérez le code suivant :
<?php require_once APPLICATION_PATH . '/../library/PhpThumb/ThumbLib.inc.php'; class Zend_View_Helper_Thumb extends Zend_View_Helper_Abstract { /* * @param String $imagePath Le chemin vers l'image * @param int $width La largeur en pixel de la vignette * @param int $height La largeur en pixel de la vignette * @param String $destPath Le chemin de destination de la vignette * @param String $urlPath L'url pour l'affichage de la vignette */ public function thumb($imagePath, $width, $height, $destPath, $urlPath) { $thumb = PhpThumbFactory::create($imagePath); $thumb->resize($width, $height); $file = basename($thumb->getFileName(), '.'.strtolower($thumb->getFormat())).'_thumb.'.strtolower($thumb->getFormat()); $destPath = rtrim($destPath, '/') . '/' . $file; if (!file_exists($destPath)) { $thumb->save($destPath); } $urlPath = rtrim($urlPath) . '/' . $file; return $urlPath; } }
Ne supprimer évidement pas la ligne
require_once APPLICATION_PATH . '/../library/PhpThumb/ThumbLib.inc.php';
c'est elle qui permet d'éviter d'avoir à renommer toutes les classes .
Utilisation :
L'utilisation est ensuite assez simple, dans une vue la ou vous souhaitez afficher vos vignettes faite :
<img src="<?php echo $this->thumb(BASE_PATH.'/images/test.jpg', 100, 100, BASE_PATH.'/images', $this->baseUrl().'/images') ?>"
Et vous obtiendrez une vignette de 100px par 100px dans votre dossier de destination avec pour nom 'nomImageBase_thumb' qui ne sera généré que si elle n'existe pas déjà.
Vous pouvez bien sur modifier le helper en fonction de vos besoin.
ps : Si vous n'avez pas la constante 'BASE_PATH' dans votre appli il suffit d'ajouter ceci dans votre index.php
// Define path to root directory defined('BASE_PATH') || define('BASE_PATH', realpath(dirname(__FILE__)));
Dernière modification par shadypierre (17-06-2010 03:32:25)
Hors ligne
Merci pour ce tutoriel. J'ai tellement recherché un truc de ce genre.
je vais aussi essayé ton astuce avec la bibliothèque que j'aime aussi :
http://61924.nl/projects/imgbrowz0r.html
Hors ligne
Je n'avais pas vu et ne connaissais pas !
Il faudra que je jette un coup ! Ça gère le flash ? On envoyer des données par cookies ou post ?
Quelqu'un a déja tenté ca et des solutions du type CutyCapt http://cutycapt.sourceforge.net/ et aurait un feedback à faire coté sécurité performance, fonctionnalités ?
Hors ligne
petit question si je veut que toute mes miniature fasse 50*50 et pas qu'il me fasse une redimensionnement en 40*48 selon la taille par exemple . Est ce que en utilisant cette fonction "$thumb->cropFromCenter(200);
" sa marche. En somme si je met l'image en 100*100 et que derrière je demande d'afficher sa :
$thumb->crop(50, 50);
sa donne quoi ?
je vais tester se soir en rentrant chez moi mais si quelqu'un a déja tester . En somme je veux faire comme sur facebook ou les avatar font tous 50*50 mais du coup il fait une sorte de zoom sur l'image.
cdt
Cédric
Hors ligne
Je ne sais plus exactement, mais dans l’archive de la library tu as un exemple d'utilisation de chaque méthode avec le résultat obtenu.
Hors ligne
J'ai un Image file not found comme message d'erreur pourtant l'image existe bien . Quand j'utilise mon autre script d'affichage l'image s'affiche bien. J'ai parcouru le forum et je cherche sur google mais je voit pas de solution .
Hors ligne
bon autant pour moi sa marche et j'ai utilisé $thumb->adaptiveResize($width, $height); comme fonction.
Hors ligne
Ce tutoriel à été FAQifié. Merci de donner vos retours et commentaires.
Cordialement,
Hors ligne
J'utilise la même méthode pour redimensionner mes images proportionnellement et dynamiquement.
Je ne passe pas par une aide de vue mais par un contrôleur.
J'ai téléchargé la librairie PhpThumb et l'ai copié sous mon répertoire library puis j'ai crée l'action suivante dans mon contrôleur:
public function thumbAction() { require_once APPLICATION_PATH . '/../library/PhpThumb/ThumbLib.inc.php'; $imagePath=$_GET['imagePath']; $width=$_GET['width']; $height=$_GET['height']; $destPath=$imagePath; $urlPath=$imagePath; $thumb = PhpThumbFactory::create($imagePath); $thumb->resize($width, $height); $file = basename($thumb->getFileName(), '.'.strtolower($thumb->getFormat())).'_thumb.'.strtolower($thumb->getFormat()); $destPath = rtrim($destPath, '/') . '/' . $file; if (!file_exists($destPath)) { $thumb->save($destPath); } $urlPath = rtrim($urlPath) . '/' . $file; return $urlPath; }
Et dans mon script de vue, j'ai:
$img_logo ='<img src=" http://'.$_SERVER['HTTP_HOST'].$this->baseUrl().'/index/thumb?imagePath='. PUBLIC_PATH . 'images/logos/'. $clients['cli_id'] . '.' . $clients['cli_logo'].'&width=50&height=50" alt="'. $clients['client_rs'].'" />';
Seulement à l'exécution, j'ai ce message d'erreur:
Message: File not writeable: http://127.0.0.1/monSite.com/trunk/Sources/public/images/logos/9_thumb.jpg
Est-ce que vous savez d'où ça peut venir?
Hors ligne
En gros t'essaie d'enregistrer le thumb généré vers http://127.0.0.1/monSite.com/trunk/Sour … _thumb.jpg
c'est normal qu'il n'arrive pas à écrire là ^^
il faut que $destPath soit un chemin vers tes fichiers sur ton disque et non via le réseau.
Hors ligne
Merci 3euclide...ça marche!
Hors ligne
Bonjour,
Désolé de déterrer ce post, mais j'ai des pb de perf avec le PhpThumb.
Lorsqu'il y a un grand nombre d'images à traiter, ça ralentit toute mon application.
Auriez-vous des conseils pour accélérer le traitement ?
Merci d'avance pour vos réponses,
Charly
Hors ligne
Le script de phpThumb étant je pense bien optimisé , je dirais que tu devrais tester sur un serveur différent . Tu as quoi comme serveur ? Moi sur un mutualisé je redimensionne une image en 3 taille et la pousse sur le cloud et sa ralentis pas alors après montre nous ton code stp.
Hors ligne
phpThumb peut utiliser imagemagick, ça va un peu plus vite que la libgd, mais bon c'est de toute façon un traitement assez lourd de redimensionner des photos. Je pense comme lebilien que phpThumb est bien optimisé. Vérifie juste que les caches de phpThumb sont bien activés.
A+, Philippe
Hors ligne
Merci pour votre aide.
Je suis sur un serveur classique 1and1, il est prévu de passer dans 2 mois sur un serveur virtuel chez eux.
En local c'est pareil. Testé avec zend server installé sur un core i5 / 4go de ram.
Sinon le code de mon helper => dans /application/modules/default/views/helpers/Thumb.php
<?php require_once APPLICATION_PATH . '/../library/PhpThumb/ThumbLib.inc.php'; class Zend_View_Helper_Thumb extends Zend_View_Helper_Abstract { /* * @param String $imagePath image path * @param int $width the width in pixels of the thumbnail * @param int $height the height in pixels of the thumbnail * @param String $destPath destination folder path * @param String $urlPath the url to display the thumbnail * @param String $imageDefault the filename & the extension of the default image * */ public function thumb($imagePath, $width, $height, $destPath, $urlPath, $imageDefault) { $path_parts = pathinfo($imagePath); $originalFile = $path_parts['filename'].'.'.$path_parts['extension']; $destPathOriginal = rtrim($destPath, '/') . '/' . $originalFile; if (!file_exists($destPathOriginal)) { $urlPath = rtrim($urlPath) . '/' . $imageDefault; } else { $thumb = PhpThumbFactory::create($imagePath); $thumb->resize($width, $height); $file = basename(strtolower(preg_replace('/\s/', '-', $thumb->getFileName())), '.'.strtolower($thumb->getFormat())).'_'.$width.'x'.'.'.strtolower($thumb->getFormat()); $destPath = rtrim($destPath, '/') . '/' . $file; if (!file_exists($destPath)) { $thumb->save($destPath); } $urlPath = rtrim($urlPath) . '/' . $file; } return $urlPath; } }
Après je fais appel à mes images dans ma vue (affichées dans un caroussel qui se trouve dans le header) => dans application/modules/default/views/scripts/common/header.phtml
<ul> <?php foreach($this->programmes as $programme) : $image = $this->photo->getPhoto($programme->id_programme); $imageThumb=$this->adaptativeThumb(BASE_PATH.'/images/programmes/'.$image['photo'], 100, 80, BASE_PATH.'/images/programmes', $this->baseUrl().'/images/programmes', 'image_default_120x100.jpg'); $nomProgramme = $this->escape($programme->nom_programme); $ville = $this->escape($programme->ville); $moreUrl = $this->url(array('controller'=>'result', 'action'=>'index', 'id'=>$programme->id_programme)); ?> <li> <a href="<?php echo $moreUrl;?>"><img src="<?php echo $imageThumb;?>" alt="<?php echo $ville; ?>" title="<?php echo $nomProgramme;?>" class="captify" /></a> </li> <?php endforeach; ?> </ul>
Si je désactive :
//$imageThumb=$this->adaptativeThumb(BASE_PATH.'/images/programmes/'.$image['photo'], 100, 80, BASE_PATH.'/images/programmes', $this->baseUrl().'/images/programmes', 'image_default_120x100.jpg');
La page s'affiche beaucoup plus vite.
Chaque thumbnail de 100x80 sauvegardé fait environ 10ko. (pour l'instant il y a 19 thumbnails qui défilent dans le caroussel).
En écrivant, je me rends compte que ce n'est peut-être pas phpThumb qui rame, mais tout simplement l'affichage des thumbs...
Y a t'il un moyen de les mettre en cache ou de faire précharger les images avant l'heure ? Le souci c'est que même si la page avec le header a déjà été chargée, lorsque je navigue sur une autre page, j'ai le même ralentissement, comme s'il rechargeait le header à chaque fois...
Des idées ?
Charly
Hors ligne
Pour les images moi je les charge de manière indépendante du reste du code. En somme j'ai un script qui lors du chargement de la page affiche une image anime gif de chargement de l'image ce qui permet d'afficher le reste du code et les pages s'affiche au fur et a mesure sans ralentir le reste tu voit ?
Hors ligne
Merci de ton aide.
Le problème est résolu, en fait après nettoyage du code, la rapidité est revenue.
Ce n'était effectivement pas dû à PhpThumb.
Thanks a lot ;
Charly
Hors ligne
Bonjour à tous,
Désolé de réup ce message assez vieu, mais j'ai suivis le tuto sur un Zend 1.12 et cela ne fonctionne pas.
Quand je suis le tuto à la lettre, la page ou je mets mon img avec la fonction thumb, il ne se passe rien et mon css disparait, la page ne ressemble plus à rien.
Je suis désolé si la réponse est évidente mais perso je ne trouve pas. Je suis plutôt débutant sur zend.
Merci d'avance.
Hors ligne
Bonjour,
Je ne sais pas si le tuto marche toujours, mais je ne saurais que recommander l'utilisation de composer pour inclure la librairie (phpthumb sur packagist).
Hors ligne
Pages: 1