Ainsi paré, à présent mon module discussion dispose d'un textarea "tags" en plus du titre et du contenu.
**TIPS** Le contenu de la propriété "locale" permet d'internationaliser les libellés du formulaire.
==== LE TEMPLATE edit ====
Voyons maintenant comment est présenté le template **edit** à l'utilisateur :
{form $form, 'havefnubb~posts:save', array('id_post'=>$id_post)}
{formsubmit 'validate'} {formreset 'cancel'}
{/form}
  * $form est l'instance de mon formulaire Jelix, suivent, l'action à effectuer (havefnubb~posts:save) et les paramètres à passer quand les données sont soumises. 
  * les {ctrl_control xxx} affichent les champs définis dans posts.form.xml
==== LE CONTROLEUR ====
A présent le contrôleur ci-dessous nous montre comment est instancié le formulaire @@F@$form@@ dans la méthode **edit**, 
et ce qui se produit quand le formulaire est enregistré (methode **save**)
class postsCtrl extends jController {
    //let's init the form 
   function edit() {    
        $id_post  = $this->intParam('id_post');
        $srvTags = jClasses::getService("jtags~tags");
	$tags = implode(',',$srvTags->getTagsBySubject('forumscope', $id_post));
        // new instance of jForms
	$form = jForms::create('havefnubb~posts',$id_post);
        // initiate the data from the dao "posts"
	$form->initFromDao("havefnubb~posts");
        // set the tags data to the form
	$form->setData('tags', $tags);	
        $rep = $this->getResponse('html');	
        $tpl = new jTpl();
        $tpl->assign('id_post', $id_post);
        $tpl->assign('form', $form);        
        [...]
        // let's display the form
	return $rep;
	}
    //let's save the datas
    function save() {
        $id_post  = $this->intParam('id_post');
        //get the instance of a previous jForms::create()
        $form = jForms::fill('havefnubb~posts',$id_post);
        // get the posted data
        $tags = explode(",", $form->getData("tags"));
        //call the class jTags and give the data to store
        jClasses::getService("jtags~tags")->saveTagsBySubject($tags, 'forumscope', $id_post);        
        // destroy the instance
        jForms::destroy('havefnubb~posts', $id_post);
        $rep = $this->getResponse('html');
        [...]
        $rep->action ='havefnubb~posts:view';
        // let's go to the view page
        return $rep;
	}	
    function view () {
        [...]
    }
}
==== LA CLASSE ====
la classe métier de jTags s'occupe de gérer les données soumises via les 2 méthodes edit/save du contrôleur ci dessus.
class tags {    
    function getTagsBySubject($scope, $id) {
        //read the table and retreive the datas
        [...]
    }
    function saveTagsBySubject($tags, $scope, $id) {
        //save the datas submitted 
        [...]
    }    
}
Pour que la "magie" opère nous stockons donc dans la table du module "générique", 
les variables @@P@$scope@@ et @@P@$id@@ qui permettent de relier les "Tags" à la "Discussion".
==== ZONE ====
Pour parachever le tout nous disposons d'une zone listant la totalité du nuage de tags, utilisable depuis le template de son choix comme suit :
{zone "jtags~tagscloud",array('destination'=>'havefnubb~default:cloud')}
ici ''destination'' permet lors du clique sur un tag, d'indiquer à jelix, vers quelle action envoyer l'utilisateur
===== Conclusion =====
Grâce à la souplesse du module jTags, il suffit de 2 points d'attache entre le module Forum et le module jTags pour permettre au premier d'exploiter le second
ici les points d'attache entre le module "utilisateur" et le module "générique" sont : 
  * le textarea qui fait apparaitre le champ tags dans le formulaire
  * la classe tags appelée depuis les méthodes du contrôleur
Suite : [[fr:tutoriels:modules:generic2|Création de module génériques (2/2)]]