|
Publicité ' | ||||||||||||||||||||||||
|
|
#1 | ||
|
Membre habitué
![]() Inscription : juin 2006 Messages : 488 ![]() |
Voila j'ai un module admin avec un form embarqué.
Hors je ne désire pas que l'utilisateur puisse modifier tout les champs mais seulement certains d'entre eux dans le sous formulaire. La methode read-only dans le configure du form embarqué ne me plait pas trop, mais la solution $form->getObject()->getValue() ne fonctionne pas dans un embed form. Y a t il une autre solution ? Code :
|
||
|
|
00
|
|
|
#2 | ||||
|
Membre confirmé
![]() ![]() Vivian PennelDeveloppeur Symfony | JSF/Seam Inscription : août 2004 Messages : 173 ![]() |
Si on suppose que ton embedForm est imbriqué dans le form principal via le nom "listAsset"
Si relation 1-1 : Code :
Code :
__________________
Mon blog : http://blog.developpez.com/vivian-pennel/ |
||||
|
00
|
|
|
#3 |
![]() ![]() Michel RottaResponsable d'exploitation informatique Inscription : septembre 2005 Messages : 4 913 ![]() |
ATTENTION !
Le readonly en HTML utilisé de cette manière n'empêche pas que les données soient modifiée par un utilisateur un tant soit peux averti. En effet, elles partent chez l'utilisateur et revienne et son validée par un validateur (essaye de le retirer pour voir !). Donc, si une personne intercepte le paquet POST avant qu'il ne quitte le poste et le modifie, ta valeur en readonly, est est en writeaussi Il faut faire le formulaire à la main et afficher les valeurs plutôt qu'un champ. Ensuite, il faut retirer le validateur du form pour éviter toute entrée d'information. (et si non, il va crier vu que la donnée, elle ne revient plus). Voir ici un petit article.
__________________
Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).
|
|
00
|
|
|
#4 |
|
Membre habitué
![]() Inscription : juin 2006 Messages : 488 ![]() |
tout a fait Michel, j'ai lu ton article.
Sauf que la c'est un embed Form dans un admin form, donc un poil plus complexe et je trouvais intelligent d'afficher juste les valeurs, et de unset les champs ciblés puisque de toute façon ce sont des champs qui ne seront jamais à mettre a jour via l'interface. Si vivian ne s'est pas trompé j'appelai l'object un niveau hiérarchique un poil en dessous. Je teste et je reviens |
|
|
00
|
|
|
#5 | ||||
|
Membre habitué
![]() Inscription : juin 2006 Messages : 488 ![]() |
bon j'ai un comportement bizarre, quand j'ai plusieurs "sous enregistrement" ici 2;
Il m'affiche les valeurs de la ligne 2 mais les champs de la ligne 1 et à la ligne 2 je n'ai pas de valeur affiché mais bien les champs du deuxième enregistrement . Code :
mon configure: Code :
|
||||
|
|
00
|
|
|
#6 |
![]() ![]() Michel RottaResponsable d'exploitation informatique Inscription : septembre 2005 Messages : 4 913 ![]() |
Je passe vite et j'espère ne pas répondre à côté.
Dans un form, il faut utiliser les nom des sous objets déclarés dans le form (le embed) et non les objets du modèle. Je ne sais pas pourquoi j'ai l'impression d'y être, à côté. Tu peux aussi faire un nouveau widget qui hérite de sfWidget et pour lequel tu redéfini la méthode render. Méthode qui retournera de quoi afficher et non pas un champ. Un peu plus lourd (quoique) mais très réutilisable.
__________________
Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).
|
|
00
|
|
|
#7 |
|
Membre habitué
![]() Inscription : juin 2006 Messages : 488 ![]() |
pour ton premier cela ressemble a la proposition de vivien sauf que apparemment je n'ai qu'un tableau et plus de référence à l'objet.
pour le deuxième.. en y réfléchissant plus, c'est loin d'être idiot et pas si lourd que ça puisque, au lieu de devoir réécrire tout les _form où je fait référence a cette table, les valeurs seront automatiquement affichées... Sauf que construire un widget à partir de rien, j'en suis encore très loin |
|
|
00
|
|
|
#8 |
![]() ![]() Michel RottaResponsable d'exploitation informatique Inscription : septembre 2005 Messages : 4 913 ![]() |
Tu n'as pas à réécrire à partir de rien.
Fait un widget que tu dérives à partir de sfWidgetForm. Je pense que tu n'as que le render à modifier. Jette un oeil à sfWidgetFormInput, tu verras, il y a très peu de chose. Tu as plusieurs méthode renderTag qui ne conviendra pas et renderContentTag pour rendre un tag html. A partir de celui-là, le reste devrait être simple. Utilise le site de sensio, page documentation, tu as un truc api où tu peux retrouver pour chaque objet les méthodes, les parents et les enfants. Tu peux aussi rechercher pour une méthode où elle est définie. Et n'hésite pas à aller sur browse code où tu as souvent de l'aide en en tête de chaque fonction pour les paramètres et options. Et suivant l'IDE que tu utilises, il peut être assez simple de remonter le code des objets parents directement et donc de faire de l'introspection du framework.
__________________
Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).
|
|
00
|
|
|
#9 |
|
Membre habitué
![]() Inscription : juin 2006 Messages : 488 ![]() |
erf mes connaissances en POO et de symfony ne vont pas jusque la malheureusement.
j'ai créé un fichier dans lib/widget sfWidgetFormDisplayText.class.php par copy sur sfWidgetFormInput.class.php. cette classe n'a que 2 methodes configure et render. dans la methodes render, j'ai juste fait un return $value qui effectivement me retourne que la valeur.... Sauf que bien sur quand je valide le formulaire je me retrouve avec un champ null. il n'y aurait pas a créer aussi un validator ? PS: j'ai pas vraiment d'IDE, j'utilise juste geany pour modifier mes fichiers. |
|
|
00
|
|
|
#10 |
![]() ![]() Michel RottaResponsable d'exploitation informatique Inscription : septembre 2005 Messages : 4 913 ![]() |
Tu y es presque, il suffit de rajouter un "spam" ou un "p" pour rendre la donnée, j'utiliserais un "spam" qui est une balise en ligne comme l'imput. Il y a alors peu de modifications à porter dans le CSS de la page et rien dans le template.
C'est la que la méthode renderContentTag peut aider. Il faut se méfier des objets, la subtilité est dans le extand, en effet, un objet est souvent enfant d'un autre, il hérite de toutes les propriétés et méthodes de son parent. Ce n'est pas parce qu'un enfant n'a que deux méthodes modifiées par rapport au parent qu'il n'a que deux méthodes... ton objet sfWidgetFormDisplayText dispose de toutes les méthodes et propriété de son parent... Si tu utilises cet objet dans un form, il ne faut pas avoir de validator puisqu'il n'y a aucun retour de valeurs. Tu peux utiliser un éditeur avancé, mais un bon IDE, quant tu travailles toute la journée sur de code, c'est un confort inimaginable. Tu as dans EDI sur le site tout une série d'informations sur différents éditeurs. Personnellement j'utilise NetBeans qui va te permettre, entre autre chose, l'autocomplétion des fonctions, des variables, des propriétés et des méthodes des objets, l'accès directe au code d'une méthode ou d'un objet parent, la vérification de la syntaxe, la vérification d'erreurs courantes (genre variable non renseignée par erreur de nom), la mise en forme du code, la gestion des projets et de l'historique des versions, la gestion de la base de données, l'accès directe à une méthode dans ton fichier, le test directement dans l'ide, le débug,... Et NetBeans est interfacé avec symfony ce qui fait disparaître la ligne de commande. Je pense que le gains à moyen terme mérite qu'on y perde quelques heures.
__________________
Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).
|
|
00
|
|
|
#11 |
|
Membre habitué
![]() Inscription : juin 2006 Messages : 488 ![]() |
hu !! mais comment lui dire alors de garder la valeur puisque apparemment quand il sauvegarde il me vide le champ !!!
Pour l'EDI, il fut un temps où j'avais essayé eclipse, mais j'avais perdu plus de temps a le debugger qu'a l'utiliser, ça m'avait refroidi. Je vais tester netBeans, des fois qu'il s'installe sans problème sur mon PC. |
|
|
00
|
|
|
#12 |
![]() ![]() Michel RottaResponsable d'exploitation informatique Inscription : septembre 2005 Messages : 4 913 ![]() |
Eclipse est bien, mais pas simple à installer et configurer.
NetBeans est un peu (très peu) moins complet, mais plus simple à mettre en œuvre. Pour ton code, tu dois, au retour de l'objet, commencer par le lier à l'objet du modèle correspondant avant de le binder aux données revenues. Si non, effectivement, il ne peut retrouver les données qui ne sont pas revenue. Mais, dans le fonctionnement normal d'un doctrine form, tu commences par le lier à l'enregistrement déjà sauvegardé avant de le binder au données retournées. Donc, rien ne change.
__________________
Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).
|
|
00
|
|
|
#13 | |
|
Membre habitué
![]() Inscription : juin 2006 Messages : 488 ![]() |
Citation:
Je doit au retour du formulaire, donc surcharger la méthode save ?. Bein non puisque tu dis que le fonctionnement d'un form doctrine le fait par défaut. Donc je n'ai rien à faire.... sauf que ça marche pas
|
|
|
|
00
|
|
|
#14 |
![]() ![]() Michel RottaResponsable d'exploitation informatique Inscription : septembre 2005 Messages : 4 913 ![]() |
On a des différences de vocabulaire...
Au retour du post, dans le contrôleur de l'action (executeTrucMachinChose où TrucMachinChose et le nom de ton action La manière de récupérer les données doit être : 1) retrouver l'enregistrement d'origine (soit par un doctrine_query, toi par la route doctrine. 2) initialiser l'objet form et le lier a l'objet de données récupéré au 1 3) liée (mathode bind du form) les données récupérée du post. 4) vérifier si l'objet est valide 4.1) objet valide, save et afficher ce que tu veux 4.2) objet non valide, renvoyer le form pour modifications Quant tu fais l'étape 2, tous les champs de ton form sont liés, donc pas de problèmes de champs vide si tu dois faire l'étape 4.2. Suis-ja moins obscure ?
__________________
Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).
|
|
00
|
|
|
#15 |
|
Membre habitué
![]() Inscription : juin 2006 Messages : 488 ![]() |
erf, c'est bien ce que je craignait.
ça reste assez simple tant que tu fonctionne avec un module normal, mais déjà ça se complique si tu travailles avec un module admin, puisque tes actions sont générées automatiquement. Et avec des formulaires embarqués dans un module admin, ça devient très coton. Je ne vois pas plus d'avantage à juste modifier le template pour afficher les données que j'aurai désactiver dans le formulaire. |
|
|
00
|
|
|
#16 |
![]() ![]() Michel RottaResponsable d'exploitation informatique Inscription : septembre 2005 Messages : 4 913 ![]() |
Le module admin fonctionne suivant le même principe, mais tu as moins d'accès au code.
Tu peux ne travailler que sur une partie de contrôleur. Mais il est sur que quant un module admin devient trop compliquer, il est parfois plus simple de faire un module dédié entièrement, même si, au départ, cela peut sembler plus compliqué !
__________________
Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).
|
|
00
|
|
|
#17 |
|
Membre habitué
![]() Inscription : juin 2006 Messages : 488 ![]() |
je travaille sur un intranet avec peu de chance d'attaque de hacker.
Je pense que je me contenterai d'un champ text disabled. un autre voie ne serait pas de créer un widget qui emporterai a la fois un champ hidden pour conserver la valeur et un label pour afficher la donnée ? |
|
|
00
|
|
|
#18 | |
![]() ![]() Michel RottaResponsable d'exploitation informatique Inscription : septembre 2005 Messages : 4 913 ![]() |
Citation:
Je ne vois pas l'intérêt de passer la moindre information par un champ caché dans le formulaire, hors éventuellement un numéro d'enregistrement qui est bien mieux dans l'url de retour et le jeton CSRF. Hors cela, les données affichée sont présente dans la base, donc récupérable dans la même requête que celle qui a permis de récupérer les données initiales d'affichage et qui sera donc nécessaire pour retrouver les objets à mettre à jour. Mais je n'ai pas rencontré tous les cas de figure, loin de là...
__________________
Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).
|
|
|
00
|
|
|
#19 |
|
Membre habitué
![]() Inscription : juin 2006 Messages : 488 ![]() |
en faites 80% des données sont chargées a partir de systéme disparate et donc non modifiable via l'interface.
Seul l'état (validé, pas validés) ou bien le propriétaire de la données est a modifier. pour cela que je cherche un moyen pratique et rapide pour décider de n'afficher en "modification" que les 2 ou trois champs. Le reste seulement en affichage. La fonction configure du form du modèle étant repris dans dans tout les cas de figure, je trouvai pratique d'indiquer à son niveau quels sont les champs modifiables et quels sont les champs en affichage. Plutôt que d'avoir a chaque fois que j'appelle un form de cette table à avoir a modifier le template. template qui est différent a chaque fois que tu fait appel a cette table, via un embed dans un admin module |
|
|
00
|
|
|
#20 |
![]() ![]() Michel RottaResponsable d'exploitation informatique Inscription : septembre 2005 Messages : 4 913 ![]() |
Là je n'ai pas de réponse magique
Si tu as réellement beaucoup de table a générer, tu peux modifier le générateur d'admin, pour qu'il génère un autre schéma et indiquer dans la config de cette admin qu'il doit générer autre chose. Avec les champs envoyé dans un widget particulier d'affichage, ça devrait fonctionner en admin généré même au retour, vu qu'il suit le schéma normal. As-tu testé ? Si tu as des problème là, je jetterais un œil plus approfondi cette semaine.
__________________
Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).
|
|
00
|
Copyright © 2000-2012 - www.developpez.com