Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
bonjour à tous
je suis contrarié par la validation de mon formulaire permettant d'ajouter des données dans ma BDD. celui-ci est validé mais ma BDD n'est pas correctement remplie puisque les champs sont vides ou null.
Je m'explique.
Via mon formulaire, l'utilisateur renseigne les champs suivants :
formulaire PHP BDD
Operation du type string, la BDD attend un ENUM "debit" ou "credit" -> ok
IDPoste du type string à priori BDD attend un INT mais la valeur est à 0 -> ko
(renseigné à partir d'un select)
Date du type... Date au format d/m/Y BDD attend un format Y-m-d -> ko
Montant du type string à priori BDD attend un Float -> ko
...plus d'autres champs du type string qui sont renseignés à null
malgré mes recherches et la lecture de la doc, je ne comprends pas comment passer un INT et un FLOAT à ma BDD.
pour le format de Date, je vais uiliser un dateselect.
si quelqu'un a des idées à partager, je suis preneur !
à toutes fins utiles, voici le code de mon formulaire, du modèle et du controleur.
merci et à bientôt
Arnica
[lang=php] <?php //base pour les formulaires d'ajout et de supppression namespace Operation\Form; use Zend\Form\Element; use Zend\Form\Form; class OperationForm extends Form { protected $PosteSelect; /* ne sert plus suite à l'utilisation de la fonction init() * public function __construct($name = null) { //3 éléments NumOp caché (renseigné automatiquement), Operation et le bouton submit // we want to ignore the name passed parent::__construct('operation'); }*/ public function setParam($value) { $this->PosteSelect = $value; } public function init() { $this->setAttribute('method', 'post'); $this->add(array( 'name' => 'NumOp', 'type' => 'Hidden', )); $this->add(array( 'name' => 'Operation', 'type' => 'Select', 'options' => array( 'label' => 'Opération', 'value_options' => array('credit'=>'crédit','debit'=>'débit'), ), )); $this->add(array( 'name' => 'IDPoste', 'type' => 'Select', 'options' => array( 'label' => 'Poste', 'value_options' => $this->PosteSelect, ), )); $this->add(array( 'type' => 'Zend\Form\Element\Date', 'name' => 'Date', 'options' => array( 'label' => 'Date', 'format' => 'd/m/Y' ), 'attributes' => array( 'min' => '01/01/2012', 'max' => '31/12/2020', 'step' => 'any', // days; default step interval is 1 day ) )); $this->add(array( 'name' => 'Libelle', 'type' => 'Text', 'options' => array( 'label' => 'Libelle', ), )); $this->add(array( 'name' => 'Cheque', 'type' => 'Text', 'options' => array( 'label' => 'Cheque', ), )); $this->add(array( 'name' => 'Realise', 'type' => 'Text', 'options' => array( 'label' => 'Realise', ), )); $this->add(array( 'name' => 'Montant', /*'type' => 'Float',*/ 'options' => array( 'label' => 'Montant', ), )); $this->add(array( 'name' => 'submit', 'type' => 'Submit', 'attributes' => array( 'value' => 'Go', 'id' => 'submitbutton', ), )); } }
le model
[lang=php] class Operation implements InputFilterAwareInterface { public $NumOp; public $IDPoste; public $Operation; public $Date; public $Cheque; public $Libelle; public $Montant; public $Realise; public $Poste; //ajouter pour afficher le poste dans view attention doit être cohérent de IDPoste protected $inputFilter; public function exchangeArray($data) { $this->NumOp = (isset($data['NumOp'])) ? $data['NumOp'] : null; $this->IDPoste = (isset($data['IDPoste'])) ? $data['IDPoste'] : null; $this->Operation = (isset($data['Operation'])) ? $data['Operation'] : null; $this->Date = (isset($data['Date'])) ? $data['Date'] : null; $this->Cheque = (isset($data['Cheque'])) ? $data['Cheque'] : null; $this->Libelle = (isset($data['Libelle'])) ? $data['Libelle'] : null; $this->Montant = (isset($data['Montant'])) ? $data['Montant'] : null; $this->Realise = (isset($data['Realise'])) ? $data['Realise'] : null; $this->Poste = (isset($data['Poste'])) ? $data['Poste'] : null;// nécessaire pour afficher les valeurs } //méthode pour éditer un operation public function getArrayCopy() { return get_object_vars($this); } public function setInputFilter(InputFilterInterface $inputFilter) { throw new \Exception("Not used"); } //filtre pour formulaire public function getInputFilter() { if (!$this->inputFilter) { $inputFilter = new InputFilter(); $factory = new InputFactory(); $inputFilter->add($factory->createInput(array( 'name' => 'NumOp', 'required' => true, 'filters' => array( array('name' => 'Int'), ), ))); $inputFilter->add($factory->createInput(array( 'name' => 'Operation', 'required' => true, /* 'filters' => array( array('name' => 'Int'), ),*/ 'validators' => array( array( 'name' => 'InArray', 'options' => array( 'haystack' => array('credit','debit'), 'messages' => array( 'notInArray' => 'Sélectionner débit/crédit !' ), ), ), ), ))); $inputFilter->add($factory->createInput(array( 'name' => 'IDPoste', 'required' => true, /*'filters' => array( array('name' => 'Int'), ),*/ ))); $inputFilter->add($factory->createInput(array( 'name' => 'Date', 'required' => true, 'validators' => array( array( 'name' => 'Date', 'options' => array( 'format' => 'd/m/Y', ), ), ), ))); $inputFilter->add($factory->createInput(array( 'name' => 'Cheque', //'required' => true, /*'filters' => array( array('name' => 'Int'), ),*/ ))); $inputFilter->add($factory->createInput(array( 'name' => 'Libelle', 'required' => true, 'filters' => array( array('name' => 'StripTags'), array('name' => 'StringTrim'), ), 'validators' => array( array( 'name' => 'StringLength', 'options' => array( 'encoding' => 'UTF-8', 'min' => 1, 'max' => 50, ), ), ), ))); /* $inputFilter->add($factory->createInput(array( 'name' => 'Poste', 'required' => true, 'filters' => array( array('name' => 'StripTags'), array('name' => 'StringTrim'), ), 'validators' => array( array( 'name' => 'StringLength', 'options' => array( 'encoding' => 'UTF-8', 'min' => 1, 'max' => 50, ), ), ), ))); */ $inputFilter->add($factory->createInput(array( 'name' => 'Montant', 'required' => true, 'validators' => array( array('name' => 'Float'), ), ))); $inputFilter->add($factory->createInput(array( 'name' => 'Realise', 'required' => true, /*'filters' => array( array('name' => 'Int'), ),*/ ))); $this->inputFilter = $inputFilter; } return $this->inputFilter; } } ?>
le controleur, juste la fonction add
[lang=php] public function addAction() { //$form = new OperationForm(); //à remplacer par l'appel à la fabrique $form = $this->getServiceLocator()->get('MyOperationForm'); $form->get('submit')->setValue('Add'); //affiche "Add" au lieu de "submit" $request = $this->getRequest(); if ($request->isPost()) { $operation = new Operation(); $form->setInputFilter($operation->getInputFilter()); $form->setData($request->getPost()); if ($form->isValid()) { $operation->exchangeArray($form->getData()); echo "The form is valid\n"; var_dump($operation); $this->getOperationTable()->saveOperation($operation); // Redirect to list of operations return $this->redirect()->toRoute('operation'); } else { echo "The form is not valid\n"; foreach ($form->getInvalidInput() as $error) { echo ($error->getMessages()); } } } return array('form' => $form); }
Hors ligne
Hors ligne
ok, merci pour la réponse, j'avais complètement oublié cet aspect de PHP.
Si le formulaire est valide, alors je force le type des données puis je renseigne la BDD avec la fonction exchange array.
Joyeux Noël!
Hors ligne
bonjour à tous et bonne année !
je relance le sujet car je n'arrive toujours pas à renseigner ma table avec des FLOAT ou des DECIMAL depuis ma petite application.
J'ai repris le tutoriel de ZF sur la gestion des albums pour repartir d'une base saine. Je l'ai modifié afin de renseigner des entiers, ça ok. Mais quand il s'agit de renseigner des FLOAT(10,2) ou des DECIMAL(10,2), le champ de la table reste désespérement à 0.00.
j'ai testé tous les types numériques à virgule de mysql et aucun n'est renseigné.
à priori, mon formulaire est valide.
Je ne vois vraiment pas où est le problème.
Si quelqu'un avait une piste à explorer, je l'en remercie par avance
Arnica
Hors ligne
Bonjour bonne année a tous également
as tu essayer de caster tes variable dans ta fonction exchangeArray?
Hors ligne
affirmatif, j'ai tenté ça, mais je l'ai fait dans le controleur après la validation du formulaire, j'ai forcé le type de variables avant de faire appel à la fonction exchangearray.
ça ne marche pas mieux
peux-tu préciser ton idée dans le fait de le faire dans la fonction exchangearray ?
merci
Hors ligne
Bonjour,
par exemple tu pourrais essayer ceci :
[lang=php] public function exchangeArray($data) { $this->NumOp = (isset($data['NumOp'])) ? $data['NumOp'] : null; $this->IDPoste = (isset($data['IDPoste'])) ? $data['IDPoste'] : null; $this->Operation = (isset($data['Operation'])) ? $data['Operation'] : null; $this->Date = (isset($data['Date'])) ? $data['Date'] : null; $this->Cheque = (isset($data['Cheque'])) ? $data['Cheque'] : null; $this->Libelle = (isset($data['Libelle'])) ? $data['Libelle'] : null; $this->Montant = (isset($data['Montant'])) ? floatval($data['Montant']) : null; //<= ICI $this->Realise = (isset($data['Realise'])) ? $data['Realise'] : null; $this->Poste = (isset($data['Poste'])) ? $data['Poste'] : null;// nécessaire pour afficher les valeurs }
en espérant que ça fonctionera
Hors ligne
ok j'ai trouvé, le problème venait de la fonction saveOperation() qui insert ou update une operation dans la table.
[lang=php] public function saveOperation(Operation $operation) { //à tester, ne fonctionne pas, comprends que $data doit être //renseigné comme un tableau avec l'objet operation // $data = array('Operation' => $operation->Operation); $data = array( 'NumOp' => $operation->NumOp, 'IDPoste' => $operation->IDPoste, 'Operation' => $operation->Operation, 'Date' => $operation->Date, 'Cheque' => $operation->Cheque, 'Libelle' => $operation->Libelle, 'Montant' => $operation->Montant, 'Realise' => $operation->Realise, ); $id = (int)$operation->NumOp; if ($id == 0) { $this->tableGateway->insert($data); } else { if ($this->getOperation($id)) { $this->tableGateway->update($data, array('NumOp' => $id)); } else { throw new \Exception('Form id does not exist'); } } }
j'ai remplacé la ligne $data = array('Operation' => $operation->Operation); qui de ce que je comprends doit renseigner la variable $data avec un tableau dont chaque élément est un élément de l'objet operation.
Or en renseignant explicitement chaque élément du tableau $data, ma table est correctement renseignée quel que soit le type de colonne. (Sauf la date, il me reste un pb mineur de conversion fr <-> us).
C'est un peu "bourrin" comme code, mais au moins ça fonctionne.
Par contre, si quelqu'un peut m'expliquer pourquoi la ligne $data = array('Operation' => $operation->Operation); ne fonctionne pas, je suis preneur, je ne voudrais pas mourir idiot...
Arnica
PS : shishi, merci pour ta suggestion
Hors ligne
Re bonjour,
je pense que cela peut venir du fait que ton entité Opération possède un attribut opération donc en faisanr :
[lang=php] $data = array('Operation' => $operation->Operation);
tu ne récupère que la valeur de l'attribut opération a vérifier
peut être que écrivant :
[lang=php] $data = array('Operation' => $operation->getArrayCopy());
tu obtiendra bien le tableau entier.
Dernière modification par shishi (05-01-2014 19:47:18)
Hors ligne
super ça fonctionne avec getArrayCopy
merci shishi
Hors ligne
bonsoir
et de rien je découvre le framework et essaye de participer
Hors ligne