Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 17-09-2009 16:57:33

slaughter
Membre
Date d'inscription: 01-04-2008
Messages: 217

[Zend_Form] populate et méthode toArray()

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 :

Code:

$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 

Code:

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

 

#2 18-09-2009 09:57:23

tylerdurd
Membre
Date d'inscription: 22-07-2009
Messages: 75

Re: [Zend_Form] populate et méthode toArray()

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

 

#3 18-09-2009 10:07:24

nORKy
Membre
Date d'inscription: 06-03-2008
Messages: 1098

Re: [Zend_Form] populate et méthode toArray()

... ou implémenter arrayIterator


----
Gruiiik !

Hors ligne

 

#4 18-09-2009 14:20:06

slaughter
Membre
Date d'inscription: 01-04-2008
Messages: 217

Re: [Zend_Form] populate et méthode toArray()

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

 

#5 18-09-2009 14:41:29

Mr.MoOx
Administrateur
Lieu: Toulouse
Date d'inscription: 27-03-2007
Messages: 1444
Site web

Re: [Zend_Form] populate et méthode toArray()

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 smile )

EDIT: réponse à la bourre.

Dernière modification par Mr.MoOx (18-09-2009 14:42:23)

Hors ligne

 

#6 18-09-2009 14:45:23

Mr.MoOx
Administrateur
Lieu: Toulouse
Date d'inscription: 27-03-2007
Messages: 1444
Site web

Re: [Zend_Form] populate et méthode toArray()

Pour tou soucis de l'update, moi j'ai une technique bidon.

Code:

$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

 

#7 18-09-2009 15:30:01

slaughter
Membre
Date d'inscription: 01-04-2008
Messages: 217

Re: [Zend_Form] populate et méthode toArray()

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

Code:

    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

 

#8 18-09-2009 15:33:23

Mr.MoOx
Administrateur
Lieu: Toulouse
Date d'inscription: 27-03-2007
Messages: 1444
Site web

Re: [Zend_Form] populate et méthode toArray()

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

 

#9 02-11-2009 15:11:54

Kishin
Nouveau membre
Date d'inscription: 02-11-2009
Messages: 2

Re: [Zend_Form] populate et méthode toArray()

Bonjour,

J'ai un soucis avec la méthode getValue() qui ne me renvoie rien.

Code:

$recap = $form->getValue('username');

$form étant un objet formulaire Zend_Form().

Hors ligne

 

#10 03-11-2009 08:13:57

nORKy
Membre
Date d'inscription: 06-03-2008
Messages: 1098

Re: [Zend_Form] populate et méthode toArray()

c'est qu'il n'y a rien dans le champs 'username';


----
Gruiiik !

Hors ligne

 

#11 03-11-2009 09:16:37

Kishin
Nouveau membre
Date d'inscription: 02-11-2009
Messages: 2

Re: [Zend_Form] populate et méthode toArray()

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:

Code:

Zend_Debug::dump($monFormulaire->getValue('username'));

il me retourne "NULL"

Dernière modification par Kishin (03-11-2009 09:22:13)

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