Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 21-12-2013 15:59:32

arnica33
Membre
Date d'inscription: 23-11-2013
Messages: 25

validation d'entiers et de flottants

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

Code:

[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

Code:

[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

Code:

[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

 

#2 24-12-2013 12:14:38

Bouks
Membre
Lieu: Paris
Date d'inscription: 31-08-2012
Messages: 241

Re: validation d'entiers et de flottants


22914720

Hors ligne

 

#3 24-12-2013 14:59:19

arnica33
Membre
Date d'inscription: 23-11-2013
Messages: 25

Re: validation d'entiers et de flottants

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

 

#4 04-01-2014 15:22:45

arnica33
Membre
Date d'inscription: 23-11-2013
Messages: 25

Re: validation d'entiers et de flottants

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

 

#5 04-01-2014 16:13:19

shishi
Membre
Date d'inscription: 17-03-2013
Messages: 67

Re: validation d'entiers et de flottants

Bonjour bonne année a tous également

as tu essayer de caster tes variable dans ta fonction exchangeArray?

Hors ligne

 

#6 04-01-2014 17:44:36

arnica33
Membre
Date d'inscription: 23-11-2013
Messages: 25

Re: validation d'entiers et de flottants

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

 

#7 05-01-2014 08:34:58

shishi
Membre
Date d'inscription: 17-03-2013
Messages: 67

Re: validation d'entiers et de flottants

Bonjour,
par exemple tu pourrais essayer ceci :

Code:

[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

 

#8 05-01-2014 16:33:25

arnica33
Membre
Date d'inscription: 23-11-2013
Messages: 25

Re: validation d'entiers et de flottants

ok j'ai trouvé, le problème venait de la fonction saveOperation() qui insert ou update une operation dans la table.

Code:

[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

 

#9 05-01-2014 19:44:53

shishi
Membre
Date d'inscription: 17-03-2013
Messages: 67

Re: validation d'entiers et de flottants

Re bonjour,

je pense que cela peut venir du fait que ton entité Opération possède un attribut opération donc en faisanr :

Code:

[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 :

Code:

[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

 

#10 06-01-2014 21:36:02

arnica33
Membre
Date d'inscription: 23-11-2013
Messages: 25

Re: validation d'entiers et de flottants

super ça fonctionne avec getArrayCopy
merci shishi

Hors ligne

 

#11 07-01-2014 00:13:40

shishi
Membre
Date d'inscription: 17-03-2013
Messages: 67

Re: validation d'entiers et de flottants

bonsoir

et de rien je découvre le framework et essaye de participer

Hors ligne

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr

Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages