Petit guide pratique pour sfFormExtraPlugin

De e-glop
Révision datée du 14 avril 2009 à 21:43 par BeTa (discussion | contributions) (Intro)

sfWidgetFormDoctrineJQueryAutocompleter

Intro

Avoir un input "text" qui aille chercher des enregistrements en base est extrêmement utile lorsqu'on veut trouver une parade à un select bien trop volumineux. Pour se faire, la solution se trouve, au moins partiellement dans le plugin dont il est question ici : sfFormExtraPlugin. Elle se nomme "sfWidgetFormJQueryAutocompleter".

Trouver le bon widget

Si vous fonctionnez avec Propel, rien à redire de plus, allez voir le tutoriel dédié, et tout sera réglé. Pour ceux qui sont sous Doctrine, la chose se complique à l'heure où j'écris ces lignes : il n'existe pas officiellement de widget spécialisé pour Doctrine, ce qui nous simplifierai quand même beaucoup la tâche. Allons donc fouiller dans le "trac" de Symfony : http://trac.symfony-project.org/ticket/6012

Récupérez le fichier attaché et ajoutez-le dans "lib/widget/". Videz le cache avec un "php symfony cc". Vous avez votre widget pour Doctrine. Mais ce n'est que le début.

Les mains dans le code

Le formulaire

Dans votre classe formulaire correspondante, effectuez les ajouts suivants (à adaptés à votre schéma, ici le module courant étant "individu" et les objets recherchés sont de la classe "Entreprise") à sa méthode "configure()" :

 public function configure()
 {
   $this->widgetSchema['entreprise_id']->setOption('renderer_class', 'sfWidgetFormDoctrineJQueryAutocompleter');
   $this->widgetSchema['entreprise_id']->setOption('renderer_options', array(
     "model" => "Entreprise",
     "url"   => "individu/ajax",
   ));
 }

L'action

Nous voyons ici que l'action appelée pour le module "individu" est "ajax". Il nous faut donc gérer cette action, en allant dans le fichier "apps/backend/modules/individu/actions/actions.class.php" et en créant la fonction "executeAjax()" de la manière suivante :

 public function executeAjax($request)
 {
   $this->getResponse()->setContentType('application/json');
   $request = Doctrine::getTable("Entreprise")->createQuery()
                ->where("nom_courant ILIKE ?","%".$request->getParameter('q')."%")
                ->limit($request->getParameter('limit'))
                ->execute()
                ->getData();
 
   $entreprises = array();
   foreach ( $request as $entreprise )
     $entreprises[$entreprise->id] = (string) $entreprise;
   
   return $this->renderText(json_encode($entreprises));
 }

Voilà, votre widget est chaud et prêt à servir !