Utiliser le plugin sfThumbnail pour retailler vos images
Il faut au préalable que vous ayez défini dans votre table un champ image (par exemple), de type Varchar (50). Nous allons considérer que ce champ se trouve dans la table message.
L’idée est la suivante : depuis le backend une image peut être choisie, et elle sera automatiquement retaillée en 2 images : une de 600 x 600 pixels maximum, une de 250 x 280 maximum. Il faut noter que cette transformation gardera les proportions de l’image d’origine. La grande image sera générée dans le répertoire uploads/images, et la plus petite dans uploads/images/thumbnails. Elles auront toutes les deux le même nom (c’est pour cela qu’il n’y a qu’un champ image dans la table). Par contre en fonction du besoin on ira la récupérer dans l’un ou l’autre répertoire.
Installation du plugin :
symfony plugin:install sfThumbnailPlugin
Il faut commencer par modifier le comportement d’un objet Message quand il est crée ou modifié. Dans lib/model/doctrine/Message.class.php :
public function save(Doctrine_Connection $conn = null)
{
// On regarde si le fichier a été modifié
if ($this->isModified())
{
// Si oui on génère les images
$this->generateThumbnail();
}
return parent::save($conn);
}
public function generateThumbnail()
{
$uploadDir = sfConfig::get('sf_upload_dir').'/images';
if ($this->getImage()!="")
{
// On crée 2 nouvelles images
$image = new sfThumbnail(600, 600);
$thumbnail = new sfThumbnail(250, 280);
// La même image est chargée
$image->loadFile($uploadDir.'/'.$this->getImage());
$thumbnail->loadFile($uploadDir.'/'.$this->getImage());
// On crée les 2 nouvelles images
$image->save($uploadDir.'/'.$this->getImage());
$thumbnail->save($uploadDir.'/thumbnails/'.$this->getImage());
}
}
Il faut ensuite modifier le formulaire d’affichage par défaut de l’objet Message, donc le fichier lib/form/doctrine/MessageForm.class.php :
public function configure()
{
parent::configure();
$this->widgetSchema['image'] = new sfWidgetFormInputFileEditable(array(
'label' => 'Image du message',
'file_src' => '/uploads/images/'.$this->getObject()->getImage(),
'is_image' => true,
'edit_mode' => !$this->isNew(),
'template' => '<div>%file%<br>%input%<br></div>',
));
$this->validatorSchema['image'] = new sfValidatorFile(array(
'required' => false,
'path' => sfConfig::get('sf_upload_dir').'/images',
'mime_types' => 'web_images'
));
}