2010-06-30 6 views
3

Comment rendre le téléchargement de fichier optionnel avec validation? Le code ci-dessous valide même si je n'ai sélectionné aucun fichier. Je ne souhaite vérifier l'extension que si j'ai sélectionné le fichier. Si je ne sélectionne aucun fichier, il ne devrait pas renvoyer d'erreur de validation.cakePHP validation optionnelle pour le téléchargement de fichier

class Catalog extends AppModel{ 
    var $name = 'Catalog'; 
    var $validate = array(
     'name' => array(
      'rule' => '/^[a-z0-9 ]{0,}$/i', 
      'allowEmpty' => false, 
      'message' => 'Invalid Catalog name' 
     ), 
     'imageupload' => array(
      'rule' => array('extension',array('jpeg','jpg','png','gif')), 
      'required' => false, 
      'allowEmpty' => true, 
      'message' => 'Invalid file' 
     ), 
     ); 
} 

merci à l'avance

+0

Est-ce que vous pré-traitez le champ 'imageupload' dans le contrôleur de quelque façon que ce soit? – deceze

+0

@deceze: désolé, qu'est-ce que tu veux dire par pré-traitement ??? Je n'ai besoin de sauvegarder que le nom de l'image pour que j'assigne $ this-> data ['Catalogue'] ['image'] = $ this-> data ['Catalogue'] ['imageupload'] ['nom']; alors seulement je vais appeler la sauvegarde – RSK

+0

C'est ce que je veux dire par pré-traitement. – deceze

Répondre

2

«J'assignent $ this-> data [ 'catalogue'] [ 'image'] = $ this-> data [ 'catalogue'] [ 'ImageUpload'] ['prénom'];"

Donc au moment où vous enregistrez votre tableau de données, il ressemble à quelque chose comme ça, je suppose:

array(
    'image' => 'foobar', 
    'imageupload' => array(
     'name' => 'foobar', 
     'size' => 1234567, 
     'error' => 0, 
     ... 
    ) 
) 

Ce qui signifie, la règle de validation imageupload tente de travailler sur ces données:

array(
    'name' => 'foobar', 
    'size' => 1234567, 
    'error' => 0, 
    ... 
) 

Ie la valeur qu'il essaye de valider est un tableau de choses, pas seulement une chaîne. Et il est peu probable que la règle de validation spécifiée soit transmise. Ce n'est probablement jamais "vide". Soit vous créez une règle de validation personnalisée qui peut gérer ce tableau, soit vous devez effectuer un traitement supplémentaire dans le contrôleur avant de tenter de le valider.

+0

qui est la meilleure pratique? Validation personnalisée ou un peu plus de traitement dans le contrôleur – RSK

+0

Personnellement, je bricoler avec '$ this-> data' avant de l'enregistrer, bien que je pense qu'une règle personnalisée serait une meilleure pratique. –

+0

merci deceze et david ...... j'irai pour la validation personnalisée – RSK

1

Concept:

dans le contrôleur, avant de valider, ou de l'enregistrement (qui fait la validation automatiquement par défaut) vérifier si un fichier est téléchargé. S'il n'est pas téléchargé, désélectionnez le validateur pour le champ de fichier.

Exemple de code:

Contrôleur

// is any image uploaded? 
$isNoFileUploaded = ($this->request->data['Model']['field_name']['error'] == UPLOAD_ERR_NO_FILE) ? true : false ; 
if ($isNoFileUploaded) { 
    $this->Model->validator()->remove('field_name'); 
} 

Notes:

Cette solution vient en pré-traitement comme l'une des deux approches alternatives (pré-traitement dans le contrôleur, validation personnalisée dans le modèle) proposé par @deceze's answer