Bonjour ,
je veut valider un champ image seulement si il est rempli ( si l'utilisateur envoi une image il doit vérifier sinon il laisse passer ) :

j'ai mis ça dans le modèle mais ca ne marche pas :

'image_produit' => array(
'rule' => array('extension', array('gif', 'jpeg', 'jpg', 'png')),
'required' => true,
'message' => 'Format image non valide',
'allowEmpty' => true
)

9 réponses


Mikachu
Réponse acceptée

J'ai eu un cas similaire mais moi c'etait à cause de la taille du jpg. tente si tu peux et si c est le cas, un jpg de quelques Ko seulement.
__________________________________________________________________________
Par contre:

$filename=$this->Stock->id.'-'.substr(md5(uniqid()),0,5).substr($this->data'Stock']'image_produit']'name'],-4);

Pas bon, car si tu mets un JPEG ton substr coupera les 4 dernieres lettres mais pas au point :).
Fais plutot un explode de 'image_produit']'name'] pour séparer l extension du nom.
du style:

$file= explode(".", $this->data'Stock']'image_produit']'name']);
//ce qui retourne normalement:
//$file[0] = le nom;
//$file[1] = l'extension;
// Et donc:
$filename=$this->Stock->id.'-'.substr(md5(uniqid()),0,5).$file[0];
// Seule contrainte: Les images ne doivent posséder de point dans le nom

Tu peux être plus explicite sur "ça ne marche pas" ?

il n'affiche pas le message d'erreur : Format image non valide

Si tu met required à false ?

Retire required et allowEmpty. Dans ta base le champ doit être à NULL. Et normalement il fera la validation que si une donnée est saisie.

le champ dans la table s'appelle : image_produit et il est à NULL par Default .

-j'ai mis required a false et allowEmpty a true et il laisse toujours passer un fichier qui n'est pas autorisé.
-j'ai retiré required et allowEmpty alors la il ajoute required au champ input qui devient obligatoire par contre il ne vérifie pas toujours l’extension.

dans la vue ajouter_produit.ctp : le champ de type file :
<?PHP echo $this->Form->file('image_produit',array(
'class'=>'span6 m-wrap popovers',
'data-trigger'=>'hover',
'data-content'=>'Image Produit',
'data-original-title'=>'Image : jpg ou png'));
?>
dans le controller l'action ajouter_produit et la suivante :

public function ajouter_produit() {

$this->Stock->create();

if ($this->request->is('post')) {

if ($this->Stock->save($this->request->data,true,array('code_produit','nom_produit','stock_min','unite_produit','categorie_produit'))) {

//****
if(!empty($this->data'Stock']'image_produit']'tmp_name'])) {

if (in_array(strtolower(pathinfo($this->data'Stock']'image_produit']'name'],PATHINFO_EXTENSION)),array('jpg','jpeg','png','gif'))){

$filename=$this->Stock->id.'-'.substr(md5(uniqid()),0,5).substr($this->data'Stock']'image_produit']'name'],-4);
move_uploaded_file($this->data'Stock']'image_produit']'tmp_name'],IMAGES.'img_upload'.DS.$filename);
$this->Stock->saveField('image_produit',true,$filename);
}
}
//***

$this->Session->setFlash('Votre Produit a été ajouté','ok');
return $this->redirect(array('action' => 'index'));
} else {
$this->Session->setFlash('Echec : Corrigez les erreurs :','error');
}
}

}

if ($this->Stock->save($this->request->data,true,array('code_produit','nom_produit','stock_min','unite_produit','categorie_produit'))) {

Je vois que ton champ : 'image_produit' n'est pas dedans, pourquoi ? Si tu ne l'enregistres pas, c'est normal qu'il ne cherche pas à faire de validation dessus.

il l'enregistre après avoir verifier quil il n'est pas vide :

$this->Stock->saveField('image_produit',true,$filename);

si je valide avec le champ image vide il m'affiche : Format d'image non valide

le debug ($this->request->data) donne ça :

array(
'Stock' => array(
'id' => '',
'code_produit' => '2254254',
'stock_min' => '55',
'nom_produit' => 'test',
'unite_produit' => 'Kilogramme',
'categorie_produit' => 'Mp',
'img_produit' => array(
'name' => '',
'type' => '',
'tmp_name' => '',
'error' => (int) 4,
'size' => (int) 0
)
)
)

dans le model j'ai ca :
'img_produit' => array(
'rule' => array('extension', array('gif', 'jpeg', 'png', 'jpg')),
'message' => 'Merci de soumettre une image valide',
'allowEmpty' => true

)