Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Pages: 1
Bonjour à tous,
D'après ce que j'ai compris, il est possible d'utiliser la méthode populate(array $values) pour remplir automatiquement tous les champs de notre formulaire. La seule condition : les clefs du tableau doivent avoir le même nom que les champs du formulaire. (j'espère ne pas me tromper sur cette partie)
Ensuite, j'ai géré ma couche model comme ceci :
Une table "news" => dbTables "news" => un mapper qui renvoie des objets métier => un service qui les utilises.
Ce qui m'intéresserais, c'est de "peupler" un formulaire directement à partir d'un objet métier.
En gros faire ça :
$id = $this->getRequest()->getParam('id',-1); if ($id > -1) { $news = $this->_newsService->getNews($id); $form = new Form_News(); $form->populate($news->toArray()); $this->view->form = $form; }
(J'avoue, je ne suis pas chez moi et je ne peux pas tester qu'il existe déjà une méthode toArray() pour un objet mais je ne pense pas)
J'ai besoin de votre avis sur la façon de créer la méthode toArray(). Celle-ci doit retourner un tableau contenant la valeur des propriétés voulues.
Est-ce que je peux faire simplement
public function toArray(){ $array = array(); $array['prop1'] = $this->getProp1(); $array['prop2'] = $this->getProp2(); $array['prop3'] = $this->getProp3(); //etc return $array; }
?
Est-ce que je suis sure la bonne voie ou est-ce que je me complique la vie ?
Merci d'avance.
Hors ligne
Bonjour,
il en existe dans le ZF notamment dans Zend_Db_Table_Row_Abstract par exemple.
Tu peux aussi tenter un cast si tu ne trouve pas te méthode du ZF qui te corresponde.
Je n'ai pas vraiment le temps de chercher plus ...
En espérant que ça puisse t'aider.
Hors ligne
... ou implémenter arrayIterator
Hors ligne
Oki.
Cette partie est réglée.
Maintenant j'aimerais de nouveau votre avis pour la procédure de modification des données.
Procédure simple :
- On clique sur modifier
- On arrive sur le formulaire
- On récupère les infos en bases
- On "peuple" le formulaire
- On modifie, on valide
- On check le formulaire
- On transforme les données du formulaire en un objet métier
- On envoie cet objet au service pour qu'il sauvegarde (update) les données.
Tout ça me parait logique. Cependant, lors de la création (insert) de l'enregistrement, j'utilise le même formulaire pour créer les données mais je rajoute également quelques données automatiquement (et invisible pour l'utilisateur) : L'id de l'utilisateur en cours par exemple.
Donc lors de l'update avec les informations du formulaire, l'id ne se trouve pas dans les champs et la donnée est mise à jour à 0. (j'espère être clair)
En gros, toutes les données que j'avais rajouté automatiquement lors de la création de l'enregistrement (et qui ne sont donc pas présent dans le formulaire) sont mises à 0 lors de l'update.
Au moment de la transformation des données du formulaire en objet métier, je suis obligé de refaire la manipulation pour compléter les données générées automatique alors que celle-ci sont déjà présentes et à jour en base.
N'y a-t-il pas un moyen de mettre simplement à jour les données renvoyer par le formulaire ?
Je ne suis pas sûre d'être clair donc vous pouvez me demander des précisions...
Hors ligne
Zend_Db_Table_Row::toArray() existe, j'utilise cette méthode régulièrement.
toArray() retourne la variable privé _data, qui contient un tableau nomChamp => valeur.
Cette méthode fonctionne très bien pour moi ( encore utilisé hier soir )
EDIT: réponse à la bourre.
Dernière modification par Mr.MoOx (18-09-2009 14:42:23)
Hors ligne
Pour tou soucis de l'update, moi j'ai une technique bidon.
$values = $form->getValues(); unset($values['valuequejeveuxpas'];
Après j'ai une méthode edit sur les row, qui prends un tableau de clé=>valeur en paramètre et qui modifie chaque champs.
Hors ligne
Bon, je viens légèrement de changer ma technique et je pense que ca va le faire.
- Je modifie les données
- Je valide le formulaire de modification (avec un champ "id" en hidden)
- Je demande à mon service de me créer l'objet métier à partir des données présentes en BDD avec une requete de selection par ID
- Je fais un $monObjetMetier->setOptions($form->getValues); qui me modifie seulement les propriétés de l'objet donc le champs est présent dans le formulaire (Peut etre une faille de sécu. J'en reparle à la fin)
- Je fais un $monService->save($monObjetMetier); qui fait l'update de la base
En gros ca donne ceci (version simplifiée) :
public function editAction() { $request = $this->getRequest(); $form = new Form_News(); if ($this->getRequest()->isPost()) { /* On vérifie qu'il y a bien des données Post */ if ($form->isValid($request->getPost())) { /* On vérifie que le formulaire est valide */ if ($form->getValue('id') > -1) { /* On vérifie qu'il existe la donnée "id" */ $id = $form->getValue('id'); $news = $this->newsService->getNews($id); /* On récupère les données actuellement en BDD pour créer un objet */ $news->setOptions($form->getValues()); /* On mets à jours l'objet */ $this->newsService->saveNews($news); /* On le sauvegarde en BDD */ } } } }
Pour la faille de sécurité : Que ce passe-t-il si un mec me fait un formulaire qui arrive sur cette page avec des champs non voulu ? Il arrive donc à modifier des propriétés de l'objet (et donc des champs de la BDD) qui n'ont rien à voir avec le formulaire.
Il peut également faire un formulaire avec un champs "id" dont il mets la valeur en dure pour modifier une autre news...
Hors ligne
Logiquement, si tu utilises $form->getValues(), il ne doit te retourner que les valeurs des champs qui existent dans l'instance du formulaire, les éventuelles données POST en trop n'y figurant pas, elle ne devrait pas être retourné. A vérifier.
Hors ligne
Bonjour,
J'ai un soucis avec la méthode getValue() qui ne me renvoie rien.
$recap = $form->getValue('username');
$form étant un objet formulaire Zend_Form().
Hors ligne
c'est qu'il n'y a rien dans le champs 'username';
Hors ligne
Je comprends bien cela mais comment faire pour y stocker la valeur de ma zone de texte qui a l'id "username" ?
Car lorsque je fais $_POST['username'] je récupère bien la valeur de la zone de texte.
Et quand je fais un debug:
Zend_Debug::dump($monFormulaire->getValue('username'));
il me retourne "NULL"
Dernière modification par Kishin (03-11-2009 09:22:13)
Hors ligne
Pages: 1