Bonjour,
je suis entrain de créer une mini administration ou l'utilisateur peut gérer des albums photos ainsi que les images les composants. Tout marche très bien, de l'upload à l'affichage des images.
Mon souci est que les images dans ma galerie, je dois les redimensionner en 160x120 pour respecté le design de l'administration. Les images que j'upload sont de l'ordre de 1920x1080 et lorsque je les redimensionne en CSS (160x120), le navigateur en prend un coup (lenteur).
J'aurai voulu savoir comment créer des miniatures (thumbnail) dans CakePHP soit à la volé, soit à la création de mes images. Pour le moment voici ce que j'ai fait. J'ai créer un model Resize dont voici le code :
<?php
class Resize extends AppModel {
var $useTable = false;
var $image;
var $image_type;
public function load($filename) {
$image_info = getimagesize($filename);
$this->image_type = $image_info[2];
if( $this->image_type == IMAGETYPE_JPEG ) {
$this->image = imagecreatefromjpeg($filename);
} elseif( $this->image_type == IMAGETYPE_GIF ) {
$this->image = imagecreatefromgif($filename);
} elseif( $this->image_type == IMAGETYPE_PNG ) {
$this->image = imagecreatefrompng($filename);
}
}
public function getWidth() {
return imagesx($this->image);
}
public function getHeight() {
return imagesy($this->image);
}
public function save($filename, $image_type=IMAGETYPE_JPEG, $compression=75, $permissions=null) {
if( $image_type == IMAGETYPE_JPEG ) {
imagejpeg($this->image,$filename,$compression);
} elseif( $image_type == IMAGETYPE_GIF ) {
imagegif($this->image,$filename);
} elseif( $image_type == IMAGETYPE_PNG ) {
imagepng($this->image,$filename);
}
if( $permissions != null) {
chmod($filename,$permissions);
}
}
public function resize($width,$height) {
$new_image = imagecreatetruecolor($width, $height);
imagecopyresampled($new_image, $this->image, 0, 0, 0, 0, $width, $height, $this->getWidth(), $this->getHeight());
$this->image = $new_image;
}
}
?>
Puis dans mon controller, je l'appel comme ceci :
<?php
public function admin_uploadPicture($albumid){
if($this->request->is('post')){
$this->Album->Gallery->create();
$this->Album->Gallery->set($this->request->data);
$this->autoRender = false;
if($this->Album->Gallery->validates()){
$data = $this->request->data;
$original = $data'Gallery']'file'];
$path_info = pathinfo( $original );
$data'Gallery']'thumb'] = $path_info'dirname'] . DS . $path_info'filename'] . '-thumb.' . $path_info'extension'];
$this->loadModel('Resize');
$this->Resize->load( $original );
$this->Resize->resize(160,120);
$this->Resize->save( $data'Gallery']'thumb'] );
if($this->Album->Gallery->save($data)){
$data = array();
$data'success'] = true;
$return = json_encode($data);
return $return;
}
}else{
$return = json_encode($this->validateErrors($this->Album->Gallery));
return $return;
}
}
}
?>
L'insertion de mes données dans la base se fait correctement mais ma miniature ne se créer pas. CakePHP me retourne les erreurs suivantes :
Warning (2): Missing argument 2 for Resize::resize() [APP/Model/Resize.php, line 46]
Notice (8): Undefined variable: height [APP/Model/Resize.php, line 47]
Warning (2): imagecreatetruecolor() expects parameter 1 to be long, array given [APP/Model/Resize.php, line 47]
Notice (8): Undefined variable: height [APP/Model/Resize.php, line 48]
Warning (2): imagesx() expects parameter 1 to be resource, null given [APP/Model/Resize.php, line 22]
Warning (2): imagesy() expects parameter 1 to be resource, null given [APP/Model/Resize.php, line 27]
Warning (2): imagecopyresampled() expects parameter 1 to be resource, null given [APP/Model/Resize.php, line 48]
Warning (2): imagejpeg() [http://php.net/function.imagejpeg]: Unable to open 'http://localhost/fondations/files/images/wallpaper6-thumb.jpg' for writing: No such file or directory [APP/Model/Resize.php, line 33]
Je précise que je fais l'upload de mes fichiers à l'aide du plugin elfinder et que je récupère l'url de l'image grâce à un callback. La méthode admin_uploadPicture est appelé via Ajax mais je ne pense pas que le problème vienne de là.
Merci à tous pour votre aide
Salut, merci pour ta réponse. Ben en fait, je voulais séparer le traitement du controller. Concernant les erreurs je ne vois pas trop pourquoi ça ne marche pas. Avec le même code en dehors de Cake, tout fonctionne. Sur Cake il ne peut apparemment pas ouvrir le fichier en écriture. J'ai vérifier les droits et ils sont tous à 777.
As-tu déjà créer un tel système? Si oui, comment tu t'y es pris?
Merci encore :)
Moi j'ai fait un helper mais déjà
Warning (2): Missing argument 2 for Resize::resize() [APP/Model/Resize.php, line 46]
ça ça veut dire que tu n'a pas mis 2 arguments
Pourtant pour la méthode resize, je demande la hauteur et la largeur :
public function resize($width,$height) {
$new_image = imagecreatetruecolor($width, $height);
imagecopyresampled($new_image, $this->image, 0, 0, 0, 0, $width, $height, $this->getWidth(), $this->getHeight());
$this->image = $new_image;
}
Et je précise bien ces 2 arguments à l'appel de la fonction :
$this->Resize->resize(160,120);
Tu ne partagerai pas ton helper par hasard dans les freebies !? :) :)