Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 26-09-2014 15:55:48

MichaelB
Membre
Date d'inscription: 27-06-2010
Messages: 21

Problème Bind / Form / Model dans les formulaires [HELP]

Hello,

Je vous explique mon gros problème avec un exemple "simplifié"..


- Une table MySQL "artist" avec les champs suivants: artist_id, name, active

- Un model "Artist" avec des setter et getter qui est hydraté (ClassMethods(true)) via TableGatway

- Un formulaire avec certain champs du model "Artist" MAIS PAS TOUS (par exemple le champ "active" n'est pas dans le formulaire)



Exemple dans le controller Artist action edit:

...

$artist = $this->artistTable->get(1); // Me renvoi mon object de type Artist -> OK

$form = new ArtistForm(); // Charge mon formulaire -> OK

$form->bind($artist); // Bind l'object avec les champs du formulaire, visuellement mon formulaire est correctement complété.

// Dans le cas de la soumission de mon formulaire:
if($request->isPost()) {
   if($form->isValid()){ 

       $validateData = $form->getData();

       // LE PROBLEME EST ICI: $form->getData() renvoi bien mon objet "Artist" avec les nouvelles valeurs du formulaire
       // MAIS la propriété "active" de mon objet "Artist "qui n'était pas dans le formulaires EST VIDE!
       // Je ne peux donc pas directement updater mon modèle dans ma db car certain champs seront effacés!

   }
}

...


Merci de votre aide précieuse!

Dernière modification par MichaelB (26-09-2014 15:56:24)

Hors ligne

 

#2 26-09-2014 15:58:52

romsVLM
Membre
Date d'inscription: 23-01-2014
Messages: 89

Re: Problème Bind / Form / Model dans les formulaires [HELP]

Dans :

Code:

   if($form->isValid()){ 

   }

t'as essayé de rajouter :

Code:

 $artist->active = "une valeur";

Hors ligne

 

#3 26-09-2014 16:15:24

MichaelB
Membre
Date d'inscription: 27-06-2010
Messages: 21

Re: Problème Bind / Form / Model dans les formulaires [HELP]

Merci pour ta réponse mais malheureusement cela n'est pas mon problème.
Si je modifie ma valeur à cet endroit, oui mon objet sera modifié.. mais avec quelle valeur? ;-)

Au début de mon action je récupère déjà l’objet de ma db avec toutes ses valeurs actuelles.. mais après la validation du formulaire, sa propriété "active" qui était à 1 à la base (en haut dans mon objet), devient vide... Le bind efface les valeurs dans mon objet qui n'étaient pas dans le formulaire... 

Est-ce un comportement normal ?

Hors ligne

 

#4 26-09-2014 16:25:01

romsVLM
Membre
Date d'inscription: 23-01-2014
Messages: 89

Re: Problème Bind / Form / Model dans les formulaires [HELP]

rajoute le champs active en champs caché dans ton formulaire (input type="hidden")

Hors ligne

 

#5 26-09-2014 16:38:06

MichaelB
Membre
Date d'inscription: 27-06-2010
Messages: 21

Re: Problème Bind / Form / Model dans les formulaires [HELP]

Non ce n'est malheureusement pas une solution car j'ai d'autres champs dans ce model (et autres models en général) qui n'ont rien à faire dans un formulaire.. Les mettre en Hidden veux donc dire de les exposer et cela ne va pas en terme de maintenance, d'écriture du code et de sécurité. La solution serait de refaire un "get" dans ma db après la validation, récupérer donc mon model (ancien), mettre à jour uniquement les champs à modifier et de le renvoyer au mapper..  Mais je trouve juste stupide d'y accéder 2 fois et je suis presque sûre qu'il existe une solution à cela... mais laquelle... ?

Hors ligne

 

#6 26-09-2014 17:04:46

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

Re: Problème Bind / Form / Model dans les formulaires [HELP]

Salut, je n'utilise pas Zend\Db donc je ne pourrais te dire et avec doctrine on a pas ce problème. Donc au pire du pire comme tu l'as récupéré avant tu peux très bien remettre les valeurs vides par les anciennes. C'est pas le mieux mais bon ...
Autre piste, l'hydrateur que tu utilises fou la merde :p.

Hors ligne

 

#7 27-09-2014 17:02:12

MichaelB
Membre
Date d'inscription: 27-06-2010
Messages: 21

Re: Problème Bind / Form / Model dans les formulaires [HELP]

Merci pour votre aide! Me revoilà avec une solution.. J'utilise dans mes modèles l'hydrator "ClassMethods" qui me convertit les champs avec des underscore (_) en camelCase.. Ex: is_active devient isActive, et j'y accède avec des getters et setters. Ex: $this->getIsActive() ou $this->setIsActive(1).

Apparemment dans les Form, l'hydrator par défaut est "ArraySerializable". Si dans la Form je set l'hydrator avec le même que j'utilise dans mes modèles.. alors les valeurs de me object bindé qui n'étaient pas présentent dans le formulaire ne sont pas effacées de l'objet!  J'ai donc plus qu'a passer mon objet au mapper pour une mise à jour par exemple..

Cela pose t'il un problème de sécurité ?


Exemple:

class MyForm extends Form
{
    public function __construct($name = null)
    {
        parent::__construct($name);
        $this->setAttribute('method', 'post');
       
        // Set form hydrator
        $hydrator = new ClassMethods(false);
        $hydrator->removeFilter('is'); 
        $this->setHydrator($hydrator);
    }

...

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