Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 10-01-2013 12:27:32

allensan
Nouveau membre
Date d'inscription: 10-01-2013
Messages: 5

Form affichage + validation des dates

Bonjour, je me suis mis récemment à zend framework 2.
Mais j'ai un problème assez génant.
J'aimerais bind mon bean d'objet rattaché à la DB sur mon formulaire.
Mais au niveau de la date locale j'ai un problème , je ne sais pas comment m'y prendre.
Même problème pour la validation des dates locales.

Je n'ai rien trouvé pouvant m'aider pour la meilleure solution, car j'ai bien des idées mais j'ai l'impression que c'est plus dans l'ordre de la bidouille.
Bizzarement il y a quelques tuto expliquant la gestion des formulaires avec plein de type d'element différent mais aucun avec les dates qui sont pourtant des champs très commun.

J'ai un objet rattaché au champs de ma db, avec des datetime stockés sur le format original de mysql au niveau des date, qui n'est de tout de façon pas exploitable au niveau de l'affichage d'un formulaire avec des date locale en dd/mm/yyyy.
Et j'aimerais donc pouvoir faire la conversion en aval et bien sur sur le retour de validation.

Merci d'avance a celui qui sera m'aider.

Hors ligne

 

#2 10-01-2013 13:48:43

Orkin
Administrateur
Lieu: Paris
Date d'inscription: 09-12-2011
Messages: 1261

Re: Form affichage + validation des dates

Salut, tu as un filtre pour ça il me semble et tu peux utiliser le composant dateselect qui fonctionne très bien avec les dates.

Hors ligne

 

#3 10-01-2013 16:15:12

allensan
Nouveau membre
Date d'inscription: 10-01-2013
Messages: 5

Re: Form affichage + validation des dates

J'ai du mal a voir comment faire, je débute seulement en zend framwork .
Je suis plus habitué a des framework à la fois plus compliqué a mettre en place mais bien mieux documenté comme spring ou ibatis en j2ee.
Mais ici , j'ai du mal a comprendre comment ils gèrent le formulaire.
bind des données et leur affichage , il y a pas de conversion possible entre les 2 et inversement en sortie ?
ou sinon je bind ma date en mm-dd-YY sur le formulaire, et je le retouche sur la vue ?

j'avoue que je suis un peu perdu.

Hors ligne

 

#4 10-01-2013 16:50:47

Orkin
Administrateur
Lieu: Paris
Date d'inscription: 09-12-2011
Messages: 1261

Re: Form affichage + validation des dates

Déjà c'est pas simple de te comprendre :p. Je viens du monde j2ee et de java et c'est clair que c'est bien plus chiant à mettre en place même si la documentation existe et est plus complète il faut remettre les choses dans leurs contexte.

Java est beaucoup plus utilisé en entreprise que le PHP donc forcément niveau contribution tu as des professionnels (entreprises) qui contribuent donc forcément tout arrive plus vite aussi. Faut savoir que spring par exemple ou ibatis sont quand même plus vieux que le ZF2 donc forcément la documentation est aussi plus complète car elle a vécue plus longtemps.

Pour en revenir aux formulaire, je n'utilise pas encore le système de bind (qui est très pratique, on attend un webinar de Bakura mais ça traine un peu à arrive en ligne, c'est le contributeur principal sur les formulaires). Mais ce que je sais c'est que tu as un système de filtre.
Un filtre sur un formulaire c'est quoi ? C'est une fonction qui sera effectuée sur le champ saisie après la soumission du formulaire mais avant de récupérer les données depuis l'objet formulaire. Donc admettons que tu as une chaine de caractères qui ressemble à celle ci ' TOTOditidj ' et que tu déclares le filtre StringTrim et ToLower (me rappel plus du nom mais vu que tu viens du java ça va te dire quelque chose ^^). Les espaces de ta chaine vont disparaitre et tout sera mis en minuscule.

Tu as la même chose pour les dates sauf que pour le composant DateSelect la date est déjà formaté (la doc doit en parler normalement). Voici un exemple :

Code:

[lang=php]$this->add(
            array(
                'name' => 'naissance',
                'type' => 'Zend\Form\Element\DateSelect',
                'options' => array(
                    'label' => 'Date de naissance :',
                    'create_empty_option' => true,
                    'min_year' => date('Y') - 70,
                    'max_year' => date('Y') - 13,
                    'day_attributes' => array(
                        'class' => 'input-small',
                        'style' => 'width: 22%',
                    ),
                    'month_attributes' => array(
                        'class' => 'input-medium',
                        'style' => 'width: 35%',
                    ),
                    'year_attributes' => array(
                        'class' => 'input-small',
                        'style' => 'width: 25%',
                    )
                ),
            )
        );

Ce composant te permet d'avoir ta date formaté comme tu veux : L'année, le mois et/ou le jour. Dans mon cas j'ai les trois, ça me génère 3 input select et lorsque je vais soumettre mon formulaire il va contrôler automatiquement si la date est valide. Par exemple que je puisse pas valide le 31 février, ou encore que l'année est bien compris dans la fourchette que j'ai définie.

Hors ligne

 

#5 10-01-2013 17:43:48

allensan
Nouveau membre
Date d'inscription: 10-01-2013
Messages: 5

Re: Form affichage + validation des dates

Ok je vais essayer une autre approche , car je suis assez confus.

Avant tout je te remercie pour les explications, c'est toujours agréable d'avoir quelqu'un qui s'y connait pour
répondre à des questions sans doute trivial pour elle.

Donc si j'ai bien compris ce que tu donne comme code est le filtre qui est utilisé lors la soumission du formulaire (par exemple )
            $form->setInputFilter($form->getInputFilterForm());
            $form->setData($request->getPost());
Sa m'aide deja pas mal .

Mon problème lui se situe en amont.
je veut afficher mon formulaire pour une edition avec les champs pré-remplis (exemple tout les champs d'un client) , quand je remplis mon PDO , ma date est stocké sous un format que si je l'affiche tel quel dans le formulaire me donnera pas une date utilisable ou identifiable pour un utilisateur lambda.

En spring on a pas ce probleme, car c'est un java.util.Date qui se promène et mon formulaire d'affichage je lui dit d'utiliser un fn:formadate.

Pour voir ce que donne a peu pres mon controller d'edition , c'est quasiement un copié/collé du learn sur le site officiel http://framework.zend.com/manual/2.0/en … g-an-album

La je vois pas trop comment faire.

J'ai choisie ZF2 car je voulais mettre un framework PHP récent à mon actif, j'ai peut être pris trop récent.

Dernière modification par allensan (10-01-2013 17:58:27)

Hors ligne

 

#6 11-01-2013 09:39:09

Orkin
Administrateur
Lieu: Paris
Date d'inscription: 09-12-2011
Messages: 1261

Re: Form affichage + validation des dates

Non c'est pas forcément trop récent mais ça reste un framework jeune et pas trop obscure si tu compares au java où tu as accès difficilement au code source des jar des framework. Le PHP est un avantage pour ça tu peux facilement décortiquer le code du framework en lui même, chose qu'on a pas l'habitude de faire avec le java donc il ne faut vraiment que tu hésites à mettre le nez dedans pour vraiment bien comprendre comment c'est fait. En plus de cette compréhension ça t'apporte des exemples de "rigueur" de développement qui ne peuvent qu'être bénéfiques à ton code.

Ensuite pour en revenir au formulaire déjà un point négatif dans ton code et dans le mien aussi d'ailleurs. Dans un premier temps tu peux le déclarer dans le Module.php pour récupérer ton formulaire depuis le service manager, dans le code du Module.php tu vas directement pouvoir créer un formulaire et lui associer le inputfilter qui va bien. Ceci va factoriser un peu ton code et t'évitera d'avoir à l'écrire dans chaque contrôleur qui utilisent ton formulaire. Cette méthode a un avantage c'est si tu as plusieurs inputfilter pour le même formulaire (ça serait un peu absurde mais bon on sait jamais). L'idée c'est d'utiliser l'interface qui va bien dans tes formulaires (InputFilterAwareInterface) et d'implémenter la méthode getInputFilter() en suivant le même exemple que ce que je t'ai montré. Comme ça ton formulaire a son inputfilter déjà intégré de base et lorsqu'il sera instancié l'inputfilter sera automatiquement présent. Cette solution oblige par contre d'avoir une inputfilter par formulaire.
Après tu peux aussi utiliser les fieldset etc ... mais je ne maitrise pas à fond, il faudrait que je l'utilise mais la flemme de refactorer une bonne partie de mon code ^^, ca apporte plus de souplesse encore aux formulaires smile.

Concernant ton problème, je n'arrive pas à voir d'où vient le problème quand tu vas binder tes données normalement sur un composant date elle devrait être formaté comme il faut. Tu peux éventuellement modifier ton getter pour qu'il formate la date si ça ne fonctionne pas tout seul. Et en dernier recours binder manuellement ta date dans le formulaire.

Hors ligne

 

#7 11-01-2013 14:05:33

bakura
Administrateur
Date d'inscription: 30-01-2010
Messages: 353

Re: Form affichage + validation des dates

Désolé pour le webinar, j'ai relancé plusieurs fois Zend France et j'ai pas eu de réponse, donc je sais vraiment pas quand il va arriver hmm...

Hors ligne

 

#8 11-01-2013 15:56:21

allensan
Nouveau membre
Date d'inscription: 10-01-2013
Messages: 5

Re: Form affichage + validation des dates

Merci pour les différentes info, mais je croit que je vais laisser tombé pour le momment et prendre un framework qui n'est pas encore en cours de conception.
Peut etre faire du ZF1 ou symphony 2.

Hors ligne

 

#9 11-01-2013 16:14:29

Orkin
Administrateur
Lieu: Paris
Date d'inscription: 09-12-2011
Messages: 1261

Re: Form affichage + validation des dates

Le ZF2 n'est plus en phase de conception il est en release faut pas confondre framework jeune et en cours de conception. Le ZF2 dans sa version actuelle est tout a fait stable pour aller en production.

ZF2 est bien plus performant que ZF1 donc passer sur ZF1 sachant que ça va finir par mourir c'est un peu dommage.
Symfony 2 personnellement je n'aime pas mais ça peut être une solution cependant tu seras confrontés aux même problèmes.

Hors ligne

 

#10 17-01-2013 11:33:53

allensan
Nouveau membre
Date d'inscription: 10-01-2013
Messages: 5

Re: Form affichage + validation des dates

Ok je suis de retour.
J'ai tenté d'autre framework comme codeIgniter.
Car sa aurait arrangé les techs de ma société que j'utilise un framework php 5.2 et non 5.3 mais j'ai reussi a refaire sauté cette contrainte.
Et après plusieurs test, j'ai l'impression quand même que ZF2 est pas mal codé.

Je profite de mon post initial pour pauser une autre question, tu est sur Orkin que Zend ne retouchera pas les fonction et methode utiliser actuellement dans leur écriture ?
Car j'ai suivi un tuto l'autre jour , ecrit en juillet dont pas mal de chose ne fonctionnait plus du tout.
Car autant je comprend que c est impossible de passer d'un ZF1 a un ZF2, mais j'espère au moin que passer d'un ZF2.1 a un ZF2.2 sera possible sans soucis.

Pour en revenir au post initial j'ai compris ma grosse ERREURE.
En faite je stockait ma date sous un format texte dans mon bean ( je connait pas le nom utilisé en php ), ce qui explique pourquoi cela déconnait et que j'arrivait a rien.
Donc problème résolue en partie maintenant faut que j'arrive a voir comment eviter cette erreur lors de l'enregistrement dans la DB (j'ai pas chercher plus de 2 min encore ).

Object of class DateTime could not be converted to string

Merci pour les divers conseils.

Dernière modification par allensan (17-01-2013 11:38:16)

Hors ligne

 

#11 17-01-2013 12:12:08

Orkin
Administrateur
Lieu: Paris
Date d'inscription: 09-12-2011
Messages: 1261

Re: Form affichage + validation des dates

Salut Allensan normalement non il n'y a pas de retouche de code et normalement la compatibilité entre les versions est maintenue. Après parfois c'est pas toujours possible parce que la modification implique de changer trop de chose (code mal pensé etc ...). Donc ça peut arriver d'avoir des problèmes de compatibilité mais ça reste très mineur. Après je peux comprendre que lorsque la qualification est faite changer de version n'est pas simple.

Donc tu peux pour empêcher ce genre de choses figer la version que tu utilises de cette façon plus de problème mais pas d'évolution au niveau des fonctionnalités du framework. C'est le coût à payer.

Le bean en php s’appelle généralement Entity ou modèle.

Pour ton erreur, vu le message ça semble assez simple à corriger je pense smile

Hors ligne

 

#12 17-01-2013 12:38:06

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

Re: Form affichage + validation des dates

allensan a écrit:

Car j'ai suivi un tuto l'autre jour , ecrit en juillet dont pas mal de chose ne fonctionnait plus du tout.

La version définitive de zf2 est sortie début septembre. La RC1 le 25 juillet. Il est donc possible que ce tuto ait été écrit pour une version non finalisée des éléments concernés.


Orkin a écrit:

Donc tu peux pour empêcher ce genre de choses figer la version que tu utilises de cette façon plus de problème mais pas d'évolution au niveau des fonctionnalités du framework. C'est le coût à payer.

Il y a aussi un coût au niveau du risque. Ne pas faire une mise à jour corrigeant des failles de sécurité, c'est s'exposer à de graves problèmes en cas d'exploit.

Dernière modification par Bouks (17-01-2013 12:42:34)


22914720

Hors ligne

 

#13 17-01-2013 14:26:41

Orkin
Administrateur
Lieu: Paris
Date d'inscription: 09-12-2011
Messages: 1261

Re: Form affichage + validation des dates

C'est certain mais c'est le prix à payer pour ne pas avoir à réinvestir dans du temps de dev, de la qualification etc ...

Hors ligne

 

#14 04-12-2013 20:10:05

yannux
Membre
Lieu: Rennes
Date d'inscription: 07-04-2007
Messages: 284
Site web

Re: Form affichage + validation des dates

Je remonte un peu le sujet grâce auquel j'ai trouvé DateSelect.

Du coup avec cet élément de formulaire pour stocker la date en DB, format DATE Mysql, je me demande où mettre "proprement" la transformation... ?

Actuellement je l'ai mis dans mon Model :

Code:

[lang=php]
// Form/CandidatForm.php
...
$this->add(array(
            'name' => 'datenaissance',
            'type' => 'DateSelect',
            'options' => array(
                'label' => 'Née le',
            ),
        ));
....
// Controller/CandidatController.php
.....
 $request = $this->getRequest();
          if ($request->isPost()) {
               $candidat = new Candidat();
               $form->setInputFilter($candidat->getInputFilter());
               $form->setData($request->getPost());

               if ($form->isValid()) {
                    $candidat->formToDb($form->getData()); // JE TRANSFORME ICI LE DATESELECT en DATE Mysql
                    
                    $this->getCandidatTable()->save($candidat);

                    return $this->redirect()->toRoute('candidat');
               }
               else {
                    $messages = $form->getMessages();
               }
          }
....

// Model/Candidat.php
....

public function formToDb($data)
    {
        if (!empty($data['datenaissance'])) {
            $this->datenaissance = $data['datenaissance']['year']
                . $data['datenaissance']['month']
                . $data['datenaissance']['day'];
        }
    }
...

** Edit 1
Et y a t'il un filter/validator pour ce type de champ ?

Si j'ai bien tout compris en faite c'est les options à la création du champ qui servent à ça  ?

Code:

[lang=php]
'min_year' => date('Y') - 70,
                    'max_year' => date('Y') - 13,
                    'day_attributes' => array(
                        'class' => 'input-small',
                        'style' => 'width: 22%',
                    ),
                    'month_attributes' => array(
                        'class' => 'input-medium',
                        'style' => 'width: 35%',
                    ),
                    'year_attributes' => array(
                        'class' => 'input-small',
                        'style' => 'width: 25%',
                    )

** Fin Edit 1

Dernière modification par yannux (04-12-2013 20:12:52)


Société : Direct Info Service

Hors ligne

 

#15 05-12-2013 19:25:47

Orkin
Administrateur
Lieu: Paris
Date d'inscription: 09-12-2011
Messages: 1261

Re: Form affichage + validation des dates

Salut, normalement le composant dateSelect retourne déjà un DateTime donc tu n'as rien à faire.

Hors ligne

 

#16 05-12-2013 19:30:29

yannux
Membre
Lieu: Rennes
Date d'inscription: 07-04-2007
Messages: 284
Site web

Re: Form affichage + validation des dates

En fait il me renvois un tableau (year => , month => , day => ).  (ou alors j'ai loupé un paramètre)
(et je ne trouve aucune info dans la doc sur le DateSelect)

D'où mon traitement après coup, en me demandant si c'est la bonne place pour le faire ..
Exemple de code (ZF 2.2.5) :

Code:

[lang=php]
// Controller
if ($form->isValid()) {
 var_dump($form->get('datenaissance')->getValue());
 var_dump($form->get('prenom')->getValue());
 var_dump($form->getData());
 etC..
}


// var_dump
null

string 'sdfqsdfqsdf' (length=11)

array (size=12)
  'id' => int 0
  'nom' => string 'sf s sdsdf' (length=10)
  'prenom' => string 'sdfqsdfqsdf' (length=11)
  'datenaissance' => 
    array (size=3)
      'day' => string '01' (length=2)
      'month' => string '01' (length=2)
      'year' => string '2013' (length=4)

....

En tout cas ça marche bien. Mais peut être y a t il un endroit plus adapter pour faire cette conversion ?

Dernière modification par yannux (05-12-2013 19:39:24)


Société : Direct Info Service

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