La gestion des images et de leurs versions redimensionnées est une tâche courante dans le développement web. Dans l'écosystème Yii Framework (v1), une approche efficace consiste à encapsuler la logique de traitement d'image au sein d'un composant d'application dédié. Cette méthode permet de centraliser la configuration des répertoires et de garantir que les miniatures sont générées à la volée uniquement si elles n'existent pas encore.
Prérequis
Pour mettre en œuvre cette solution, vous devez avoir installé l'extension phpthumb dans votre projet Yii. Cette extension sert de wrapper pour la bibliothèque PHPThumb, facilitant la manipulation d'images (redimensionenment, recadrage, conversion de format).
Création du composant MediaResizer
Créez un fichier nommé MediaResizer.php dans le répertoire protected/components/. Ce composant héritera de CApplicationComponent pour pouvoir être intégré facilement au cycle de vie de l'application.
<?php
/**
* Composant pour la gestion et la génération de miniatures
*/
class MediaResizer extends CApplicationComponent
{
// Chemins relatifs par rapport à la racine Web
public $basePath = "/uploads/products/";
public $cachePath = "/uploads/cache/";
public $fallbackImage = "default.jpg";
/**
* Génère ou récupère le chemin d'une miniature
*
* @param string $filename Nom du fichier source
* @param string $tag Suffixe pour différencier les formats (ex: 'small', 'large')
* @param int $w Largeur cible
* @param int $h Hauteur cible
* @return string Nom du fichier généré
*/
public function render($filename, $tag = "", $w = 120, $h = 120)
{
$webRoot = Yii::getPathOfAlias("webroot");
$sourceFile = $filename;
// Vérification de l'existence du fichier source
if (!file_exists($webRoot . $this->basePath . $sourceFile)) {
$sourceFile = $this->fallbackImage;
}
// Construction du nom de destination
$targetFile = $this->buildTargetName($sourceFile, $tag);
$fullSourcePath = $webRoot . $this->basePath . $sourceFile;
$fullCachePath = $webRoot . $this->cachePath . $targetFile;
// Initialisation du répertoire de cache pour phpthumb
Yii::app()->thumb->setThumbsDirectory($this->cachePath);
// Génération de l'image si elle n'existe pas encore dans le cache
if (!file_exists($fullCachePath)) {
Yii::app()->thumb
->load($fullSourcePath)
->resize($w, $h)
->save($targetFile, "JPG");
}
return $targetFile;
}
/**
* Formate le nom du fichier pour inclure un suffixe de dimension
*/
private function buildTargetName($name, $tag)
{
if (empty($tag)) {
return $name;
}
$parts = explode(".", $name);
if (count($parts) > 1) {
$extension = array_pop($parts);
return implode(".", $parts) . "_" . $tag . "." . $extension;
}
return $name . "_" . $tag;
}
}
Utilisation pratique
Une fois le composant créé, vous pouvez l'appeler depuis vos vues ou vos contrôleurs. Il est recommandé de l'importer dynamiquement ou de le déclarer dans la configuration de votre application (main.php) pour un accès global.
Exemple d'appel manuel dans une vue :
<?php
// Importation du composant
Yii::import("application.components.MediaResizer");
$resizer = new MediaResizer();
// Génération d'une image principale (500x300)
$heroImage = $resizer->render("produit_01.png", "hero", 500, 300);
// Génération d'une vignette (80x80) avec un tag 'thumb'
$thumbnail = $resizer->render("produit_01.png", "thumb", 80, 80);
echo '<img src="' . Yii::app()->baseUrl . '/uploads/cache/' . $heroImage . '" alt="Image principale" />';
?>
Cette approche présente l'avantage de ne traiter l'image qu'une seule fois. Lors des requêtes suivantes, le script détecte la présence du fichier dans le dossier cache et retourne directement le nom du fichier existant, optimisant ainsi les performances du serveur.