Quick links: Content - sections - sub sections
EN FR
Quick Search Advanced search
 
Page

  [Opened] Zones et formulaires

Posted by samche65 on 01/27/2010 16:43

Ça y est, je viens de me lancer et j'ai un petit soucis avec une page qui me semble pourtant simple d'apparence.

  • 1 controleur
  • 1 template composé de 2 zones (un moteur de recherche, une liste de données)

Je passe sur la partie dao qui fonctionne à merveille.

A l'arrivée sur la page, la liste est entièrement affichée. Lorsque je renseigne le moteur de recherche, la liste est affinée en fonction des critères passés.

Ça, c'est dans mon monde idéal.

Oui mais je pense que je pars mal... Voilà ce que j'ai fait.

Un contrôleur default avec une méthode index qui appelle un template.

Le template qui appelle 2 zones (le moteur de recherche et la liste).

A l'arrivée sur la page, le moteur de recherche est vide, j'utilise $form = jForms::create( "interventions" ); dans la zone de mon moteur de recherche pour initialiser le formulaire.

Là, ça marche bien, par contre, lorsque je fais une recherche, les champs ne sont pas renseignés. Si j'initialise avec $form = jForms::fill( "interventions" );, au premier lancement j'ai une fatal error à propos d'un getBuilder() qui ne peut pas faire je ne sais quoi.

Qu'à cela ne tienne, je me dit que pour l'instant, renseigner les champs déjà renseignés dans une précédente recherche, c'est du luxe. Je passe à l'affichage de ma liste.

Dans la zone de la liste, j'utilise $form = jForms::get("interventions"); pour récupérer les données du formulaire. Oui mais voilà, au premier affichage, comme il n'y a rien à récupérer, il me dit que le "token n'est pas valide".

Alors mes questions...

  • Est-il judicieux de traiter les formulaires directement dans la zone où ils sont sollicités ?
  • Faut-il créer plusieurs actions dans mon contrôleur et si oui, lesquelles ?
  • Quelle est la meilleure méthode pour faire fonctionner ma page comme je le souhaite ?

En vous remerciant,

  [Opened] Re: Zones et formulaires

Reply #1 Posted by laurentj on 01/27/2010 22:55

j'utilise $form = jForms::create( "interventions" ); dans la zone de mon moteur de recherche pour initialiser le formulaire.

oui mais si tu ne fais que ça dans ta zone, ça veut dire qu'à chaque fois que tu affiches la zone, ça reinitialise tout, puisque ça recrée une instance du formulaire. Et bien entendu, si tu ne fais qu'un fill, ça ne va pas fonctionner la premirère fois, tout simplement parce que ton formulaire n'existe pas. Donc:

   $form = jForms::fill("interventions");
   if (!$form)
     $form = jForms::create("interventions");

mais là encore, c'est pas génial, parce qu'à chaque fois que tu affiches la zone, ça va tenter de récupérer les données du formulaire à partir de la requete HTTP, et effacer le contenu du formulaire puisque il y a de forte chance qu'il n'y ai pas les données.

Donc :

   $form = jForms::get("interventions");
   if (!$form)
     $form = jForms::create("interventions");

Et pour faire ta recherche proprement dit, il faut une action spécifique qui fera le fill, et qui effectuera la recherche proprement dite. La zone ne servant qu'à afficher.

Bon maintenant, si ton formulaire de recherche ne contient qu'un champs et un bouton, peut être faudrait-il éviter d'utiliser jForms. Ce serait un peu utiliser un bulldozer pour écraser une mouche. Une balise <input> est plus rapide à écrire :-)

Pour l'histoire du token, tu peux désactiver ça en mettant allowAnyOrigin="true" sur la balise form du fichier jforms. Après tout, sécuriser à ce point un simple formulaire de recherche, ce n'est pas très utile. Par contre, l'erreur n'apparait normalement que lorsque tu fais un fill (ou initFromRequest), pas en faisant un get.

  [Opened] Re: Zones et formulaires

Reply #2 Posted by laurentj on 01/28/2010 13:25

à mon avis tu te complexifie la vie avec tes deux zones, surtout que d'après ton schema, finalement, tes deux zones sont très liés.

et perso, je manipulerai le formulaire (get/create/fill) seulement dans mon controlleur. Et je passerai en paramètre de la zone de la liste, simplement les critère de recherche, ce qui rendra cette liste bien plus reutilisable. Après tout, on pourrait vouloir peut etre plus tard, afficher directement la liste avec des critère précis (je ne sais pas, imagine que l'on mette des liens vers l'action d'affichage de recherche, correspondant aux resultats pour le mot clé le plus recherché par ex, donc ici, pas de formulaires)

donc ton controleur aurait deux actions : un qui affiche le formulaire et la liste quand on arrive la première fois dessus, et une autre qui effectue la recherche proprement dite et affiche les resultats.

Et comme je disais plus haut, utiliser un jforms pour juste un champs de recherche, c'est certainement overkill. sans jforms, tu n'aurais qu'une action

   function search() {
     $rep = $this->getResponse('html');

     $critere = $this->param('q');
     $rep->body->assignZone('MAIN', 'listInterventions', array('critere',$critere));
     return $rep;
   }

Et ta zone listeInterventions, ne manipule pas de formulaire, récupère simplement son paramètre critère. en fonction de la nullité ou pas de sa valeur, effectue un findBy ou un findAll et voilà. Et le template associé à ta zone affiche directement un formulaire html classique et la liste des resultats.

Et si dans d'autres modules, tu veux afficher cette zone sans le formulaire, tu pourrais avoir un deuxième paramètre à cette zone indicant si oui ou non il faut afficher le formulaire. à moins de deleguer l'affichage du formulaire aux actions qui veulent l'afficher directement.

Si plus tard tu as plus de critère de recherche, le formulaire jforms se justifiera mieux, mais ce n'est pas dans la zone qui faut le gerer, mais directement dans les actions, ça sera bien plus pratique. tu donnes à ta zone de liste, simplement les valeurs des critères.

Note qu'il vaut mieux laisser le myHtmlResponse gérer un template principale, et les actions utiliser leur propre sous templates. http://jelix.org/articles/fr/manuel-1.1/reponse-generale-personnalisee

  [Opened] Re: Zones et formulaires

Reply #3 Posted by samche65 on 01/29/2010 09:18

Merci pour ces réponses.

Donc en gros je découpe un peu trop mon module ?

J'ai réécrit un peu ce bouzin en ramenant plus de choses dans le contrôleur. J'ai également écrit la deuxième action dans un autre contrôleur et en effet, c'est beaucoup plus propre maintenant.

J'ai remis à jour ma "doc" toujours téléchargeable à l'adresse ci-dessous

http://assoslc.nuxit.net/athos/jelix/

Concernant le jForms, il y aura à terme une dizaine de critères de recherche mais aujourd'hui j'ai la flemme de tous les mettre alors je me contente d'un seul.

Pour la petite histoire, les prochaines étapes seront:

  • l'ajout de l'ensemble des champs qui définissent une intervention
  • le formulaire de création d'une intervention
  • la page d'affichage et de modification d'une intervention
  • la page d'ajout/modification d'une action sur l'intervention
  • l'ajout d'un document rattaché à une intervention ou une action
  • encore plein de trucs
  • une authentification avant d'arriver sur ce module
  • une gestion des droits avec jAcl2

C'est dans cet objectif que je ne me contente pas d'un bête template avec un formulaire écrit à la main en html. Pareil pour la liste.

 
Page
  1. Re: Zones et formulaires