que si que si tu peut très facilement récupérer tes tableaux
il arrive souvent dans un formulaire de véhiculer des informations qui concerne directement l'objet que l'on manipule et d'autre qui sont plutôt du contexte
par exemple un formulaire pour éditer un objet client et un champ hidden qui dit si c'est un nouveau client ou une mise à jour
dans ce cas il est pratique d'utiliser les nom comme
method
et pour les info client
client[name]
client[phone]
quant au check box pas de problème
client[checkgroup][valeur1]
client[checkgroup][valeur2]
etc.
du coup tu peux très bien récupérer ton client d'une seule opération
$client = $this->_getParam('client');
personellement je n'aime pas utiliser les tableau pour mes objets je fais donc
$client = (object)$this->_getParam('client');
ainsi $client est un objet que je peux manipuler sans difficulté
1 2 3 4 5
| $client->name;
$client->phone;
foreach ($client->checkgroup as ckeckname => $value) {
do();
} |
je n'hésite pas nom plus à mettre plusieurs objets dans un formulaire
par exemple j'ai des clients qui on une adresse
mais j'ai aussi des partenaires qui ont une adresse et des fournisseur
un adresse est donc quelque chose d'indépendant d'un client donc dans mon formulaire client je mes les champs
client[name] client[firstname] etc et address[street] address[city]
ça facilite grandement la lecture du formulaire. et son traitement.
j'ai des collègues qui ont pris un convention
oClient sera un objet client alors que aClient sera un tableau
ainsi il ont écrit une methode qui récupère un élément du formulaire en fonction de sont type
$client = $this->_getParam('Client');
retournera un objet si oClient est dans les variables du formulaire
et retournera un tableau si aClient est présent
pour cela il suffit de surcharger _getParam()
mais on peut aller encore plus loin en fournissant un constructeur adapté pour ses objet métier
$client = $this->_getParam('Client', 'Myapp_Model_Client');
qui me retourne un objet de la classe Myapp_Model_Client
il ne me reste qu'à faire
1 2 3 4 5
| $method= $this->_getParam('method');
$client = $this->_getParam('Client', 'Myapp_Model_Client');
if ($client->isValid()) {
$client->save($method);
} |
Alors oui moi je dis fonce sur cette approche elle à pleins d'avantage.
par contre le code html du formulaire n'est pas exploitable avec d'autre langage que php par exemple c'est plus difficile de prendre le formulaire tel quel pour porter l'appli en java
il faut aussi penser à utiliser des id sur les input de ton formulaire. quand tu veux les manipuler en javascript. en effet sans id le name de l'input est suffisant pour le manipuler. mais en javascript client[name] est un tableau
par habitude je fai sainsi
<input id='client_name' type='text' name='client[name]' value='' />
ça permet d'avoir un ensemble cohérent et de ne pas mélanger les noms de variable de formulaire qui sont à destination du serveur des objets d'édition qui sont à destination du navigateur
A+JYT
<input name="client[checkgroup][box1]" value="toto" type="checkbox"/>
ou
<input name="client[checkgroup][]" value="toto" type="checkbox"/>
dans le premier cas tu obtiends une hashtable les valeurs peuvent donc être identiques client[options][emailInfo]=1 et client[options][newsletter] = 1
dans le second un tableau indicé les valeur son nécessairement différentes
client[options][]=emailInfo et client[options][]=newsletter
il est possible d'imbriquer autant de niveau que l'on veut
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| <input name="client[person][name]" value="Sekaijin" type="text" />
<input name="client[person][firstname]" value="Jean-Yves" type="text" />
<input name="client[person][bird]" value="08/12/1948" type="text" />
<input name="client[address][street][number]" value="6" type="text" />
<select name="client[address][street][type]">
<option value="rue" selected="selected">rue</option>
<option value="bd">boulevard</option>
<option value="imp">impasse</option>
</select>
<input name="client[address][street][name]" value="Beethoven" type="text" />
<input name="client[address][postnnumber]" value="12130" type="text" />
<input name="client[address][city]" value="Sainte Afrique" type="text" />
<input name="client[options][emailInfo]" value="1" type="checkbox" checked="checked" />
<input name="client[options][newsletter]" value="1" type="checkbox" /> |
mais je n'aime pas trop multiplier ainsi les niveaux ça de rends que très rarement les choses plus simples
A+JYT
Partager