Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Pages: 1
Bonjour,
J’importe des données en provenance d’un fichier excel, le but est de les mettre la base de donnée.
Sachant que je dispose d’un formulaire avec les validateurs par défaut de Zend_Form, je trouve intéressant de les utiliser au lieu d’écrire des fonctions de validation de date, de mail, de chaine de caractères, etc …
Savez-vous comment procéder ?
Hors ligne
Bonjour,
Il y a quelques blogs pas mal sur la validation de formulaire:
custom validators 2008
conditionnal validation
Et puis il y a la documentation officielle!
zend form
Par ailleurs, la possibilité de filtrer les données existe si tu es en PHP 5 (cf. filter_var() et quantité de filtres existants).
Dernière modification par thbenda (18-06-2010 13:45:27)
Hors ligne
attention Zend_Validate est indépendant de Zend_Form et peut fonctionné seul.
Hors ligne
Dans mon esprit Zend_Validate fesait partie de Zend_Form ....
J'ai une question par rapport à la façon dont je dois mettre ca en place.
J'ai une classe ImportExcel qui importe des données en lisant un fichier excel, tout est fait dans une méthode.
Une fois les données dans une variable, je l'envoie à une autre méthode de la classe qui va valider ou non les données une à une.
N'ai t il pas plus judicieux d'utiliser un helper ? (un action helper peut être ?)
En faite je ne sais pas si c’est bien de mettre l’extraction et la validation dans la même classe.
Hors ligne
j'ai un soucis, j'ai fais une classe de validation, et je veux accéder au message d'erreur :
<?php class model_Validation extends Zend_Validate_Abstract { public $_messages = array(); public function getMessages() { return $this->_messages; } public function isValid($value) { $valid = true; $price = $value['price']; if (empty($price)) { $_messages[] = "price is empty"; $valid = false; } // marche très bien // if (!empty($_messages))Zend_Debug::dump($_messages); return $valid; } }
la ligne commenté fonctionne,
mais de l'extérieur :
$val = new Model_Import(); $r = $val->isValid($row); Zend_Debug::dump($val->getMessages());
et ça donne :
array(0) {
}
Vous savez pourquoi le tableau $_messages ce vide ?
Hors ligne
Salut,
Il manque un "$this", $this->_message[] plutôt que $_message[].
Sinon c'est pas vraiment de cette manière qu'est pensé Zend_Validate pour les messages d'erreur. Si tu veux pouvoir utiliser des templates et des clés pour la traduction, il faudrait plutôt faire un truc du genre :
<?php class model_Validation extends Zend_Validate_Abstract { /** * Error constants */ const ERROR_PRICE_EMPTY = 'priceEmpty'; /** * @var array Message templates */ protected $_messageTemplates = array( self::ERROR_PRICE_EMPTY => 'Price can't be empty' ); public function isValid($value) { $valid = true; $price = $value['price']; if (empty($price)) { $this->_error(self::ERROR_PRICE_EMPTY); $valid = false; } // marche très bien // if (!empty($_messages))Zend_Debug::dump($_messages); return $valid; } }
A+ benjamin.
Dernière modification par Delprog (22-06-2010 09:09:52)
Hors ligne
merci beaucoup Delprog ! tu me sauve !!
Hors ligne
Me revoilà.
J'ai fais exactement comme ton exemple. Mais j'ai un souci.
Lorsque je fais un :
$val = new Model_Validation(); $val->isValid($row); print_r($val->getMessages()); //ici
j'ai systématiquement TOUS les messages d'erreurs, alors que le teste isValid() est passé avec succès!
EDIT : précision : c'est utilisé dans une boucle je teste pleins de valeurs, si je fais un seul teste c'est ok,
sinon les erreur restent dans l'attributs de l'objet
class Model_ExcelImportValidationItem extends Zend_Validate_Abstract { /** * Error constants */ const ERROR_PRICE_EMPTY = 'priceEmpty'; const ERROR_RECEIPT_EMPTY = 'receiptEmpty'; const ERROR_SERIAL_EMPTY = 'serialEmpty'; /** * @var array Message templates */ protected $_messageTemplates = array( self::ERROR_PRICE_EMPTY => "Price can't be empty", self::ERROR_RECEIPT_EMPTY => "Receipt can't be empty", self::ERROR_SERIAL_EMPTY => "Serial can't be empty", ); /** * @param unknown_type $value * @return boolean */ public function isValid($value, &$validLine = array()) { // Ce que j'ai rajouté $this->_error = ""; //----------------------- $valid = true; $price = $value['item_price']; $receipt = $value['item_receipt']; $serial = $value['item_serialNumber']; if (empty($price)) { $this->_error(self::ERROR_PRICE_EMPTY); $valid = false; } if (empty($receipt)) { $this->_error(self::ERROR_RECEIPT_EMPTY); $valid = false; } if (empty($serial)) { $this->_error(self::ERROR_SERIAL_EMPTY); $valid = false; } etc .............. return $valid; } }
J’ai donc rajouté ce $this->_error = "";
Mais sans résultat.
Edit2: je construit et détruit l'objet à chaque itération de la boucle. C'est pas terrible mais je vois pas quoi faire d'autre pour l'instant
Dernière modification par maryooman (22-06-2010 14:47:57)
Hors ligne
J'ai trouvé !
Il fallait rajouter ça (c'est dans la doc officiel)
$this->_setValue($value);
Hors ligne
Pages: 1