(dé)Pot de miel

2010

2009

2008

Accueil

Aller au contenu | Aller au menu | Aller à la recherche

HaveFnuBB! 1.3.2

23 janvier 2010

Bonjour,

Un gros travail de fond a été fait sur cette release.

Donc cette version de maintenance est focalisée sur l'aspect intégration du forum au sein d'une application Jelix existante.

Pour cela, voici ce qui a été entrepris et réalisé :

  • Nouveau point d'entrée forums.php (en plus du index.php) qui devient du même coup le point d'entrée par défaut
  • Refactorisation de la configuration
  • Amélioration de l'API de gestion du forum
  • Réagencement des scripts javascript et css dans le dossier hfnu propre à l'usage du forum et commun à tous modules
  • Précédemment, le mod rewrite apache était requis mais ce n'est plus une obligation grâce à l'option multiview=on, les URLs sont construites avec le point d'entrée par défaut créé à cet effet.

Autres menues corrections :

  • corrections de quelques templates pour les rendre conforme W3C
  • corrections de fautes de frappe sur des noms de variables

Télécharger HaveFnuBB! 1.3.3

Par contre si vous vous l'installer, merci de me faire un retour, que ce soit sur la forme, le contenu, histoire d'améliorer le tout et d'en faire un forum tout à fait au point !

HaveFnuBB 1.3.0

23 décembre 2009

Un cadeau de noël 2 jours avant :) Au menu de cette version 1.3.0 un nombre non négligeables de nouvelles fonctionnalités et corrections telles :

  • Améliorations :
  1. l'API de gestion des messages améliorée ;
  2. Le Moteur de recherche prend à présent en compte les mots de la langue française ;-) Dans l'administration, déplacement des Forums d'une catégorie à l'autre
  3. Ajout du nombre de messages créés par un utilisateur sur son profil
  • Nouveautés :
  1. Gestion de censure des messages ;
  2. Indicateur de 'nouveau message' + 'Marquer tous les sujets comme lus'
  3. Liste des sujets non lus par les modérateurs dans l'administration du forum
  4. Migration de Phorum à HaveFnuBB possible à présent

Télécharger HaveFnuBB 1.3.0

Petit PHP Noël quand tu descendras du ciel avec des phar par millier n'oublies pas mon petit PC

9 décembre 2009

PHP Noel

Bon,

comme je crois dur comme fer au PHP Noël, je vais me fendre d'une liste de choses que j'aimerai (faire) :

  • un site recensant les modules Jelix (n'étant pas hébergés sur la Forge) à la manière de DotAddict
  • un installeur web d'appli jelix (toujours à la manière plus ou moins éloignée de DotAddict)
  • voir comment se comporte PHAR histoire de tester si on peut le déposer dans un conteneur PHP et accéder à son appli les doigts dans le nez.
  • finir la prochaine version HaveFnuBB gérant moultes moultes grandes nouveautés.
  • un nouveau PC pour remplacer celui qui me serre de presse papier depuis 15j qu'il a rendu l'âme.

Voilà la petite liste.

Restera la liste des "Bonnes résolutions" 2010, qu'on se fait tous mais qu'on ne suit jamais :P comme arrêter de fumer (ha ba là c'est bon pour 2010, je n'ai jamais tiré sur la tige ;), plus mettre le doigt dans son nez au volant au feu rouge (parce qu'en roulant c'est pire que d'avoir portable à l'oreille :D ) et j'en passe et des plus salles ;)

Petit PHP Noël j'ai nété chage toute l'année, m'oublies pas hein :P

HaveFnuBB 1.2.0

15 novembre 2009

Bonjour, voici venue la version 1.2.0 contenant son lot de nouveautés et d'améliorations :

  • intégration du framework Jelix 1.1.4
  • système de 'Hook' permettant d'étendre les fonctionnalités du forum comme bon vous semble.
  • Gestionnaire de thèmes permettant de choisir son thème en un clique !
  • Amélioration du rendu de la liste des modules utilisés au sein de HaveFnuBB!
  • Administration des boutons des réseaux sociaux reliant discussions à ces derniers
  • Amélioration du "brouillage" de l'affichage des courriels à tous.
  • Amélioration de l'affichage des règles du forum

Ainsi donc pourvu, le forum est personnalisable à souhait et surtout, extensible comme jamais !

Télécharger HaveFnuBB 1.2.0

AFUP ForumPHP 2009 clap de fin

14 novembre 2009

Je n'aborderai ici que le sujet qui m'intéresse à savoir celui que j'aurai défendu depuis le début : les projets open sources et à travers eux tous les développeurs, contributeurs et auteurs des projets présents à ce volet 2009.

Je remercie Xavier Gorse président de l'Afup pour nous avoir offert un "espace" d'où chaque projet aura pu montrer ce qu'il offrait et échanger autant avec les visiteurs qu'avec ses voisins de table (pour refaire "bouillon de culture" comme je twittais hier ;)

Pour ma part je ne suis pas mécontent d'avoir pu à nouveau revoir les amis de Jelix, (les occasions sont tellement rares) ainsi que ceux de cakephp-fr mes ex co "animateurs-dev de la communauté" francophone, et toujours amis.

Et surtout, montrer mon "petit" (mais costaud) projet de forum, à PHPTV, illustrant toute la force que l'on puise en Jelix.

Un très grand merci au final à un homme de l'hombre : Marc Abiven, membre AFUP, qui m'aura contacté début septembre 2009, pour que tout cela puisse avoir, lieu rencontré courant mai 2009 au détour d'un apéroPHP

A l'année prochaine donc avec plus d'espace, plus de projets, plus de monde et plein de nouvelles choses sortant du chapeau de Jelix ! :-)

Souvenirs Souvenirs en images ;)

HaveFnuBB Hook System

10 novembre 2009

Parmi les forums bien pensés, existent des systèmes d'extension (ou hook)
laissant libre cours à la créativité des développeurs de ces hooks.

Dans HaveFnuBB (le forum que je réalise), il m'aura fallu un plugin de 10 lignes pour permettre à tout developpeur, d'enrichir ses templates avec une souplesse déconcertante.

L'idée derrière ce plugin est la suivante :

Je me créé un portail, blog, forum, et me "contente" d'une petite batteries de fonctionnalités rendant la page à mon goût.

Mais avec ce plugin, je permets à quiconque de rajouter ses propres fonctionnalités à l'endroit où le hook est appelé.

Concrètement comment cela marche ?

Dans mes templates, je pose :

{hook 'event',$params}

où :

  • event est le nom de l'évènement déclenchant la récupération de toutes fonctionnalités
  • $params est le tableau des paramètres passés au plugin hook, (puis au listener).

Pour illustrer ce principe, dans le forum HaveFnuBB, je dispose d'un moteur de recherche permettant de trouver tout mot dans toutes les discussions.

Comme c'est loin d'être satisfaisant pour tout à chacun (c'est volontaire, le module de recherche étant générique et extensible),

je pose le hook 'Search' pour que quiconque puisse rajouter tout ce qui lui convient.

le template de recheche est le suivant :

{hook 'BeforeSearch'}
<div class="box">
    <h2>{@hfnusearch~search.search.perform@}</h2>
    <div class="block">        
        <div id="post-message">{jmessage}</div>
        <form action="{formurl 'hfnusearch~default:query'}" method="post">  
        <fieldset>
        <legend>{@hfnusearch~search.in.all.forums@}</legend>
        <div class="form_row">
            {formurlparam 'hfnusearch~default:query'}
            <input type="hidden" name="perform_search_in" value="words"/>
            <div class="form_property">{@hfnusearch~search.hfnu_q.search@}</div>            
            <div class="form_value">
                <input type="text" id="hfnu_q" name="hfnu_q" size="31" />    
            </div>
            <div class="clearer">&nbsp;</div>  
        </div>
        <div class="form_row form_row_submit">    
            <div class="form_value">
                <input class="submit" type="submit" name="validate" 
                        value="{@hfnusearch~forum.search.okBt@}" />
            </div>
            <div class="clearer">&nbsp;</div>
        </div>
      </fieldset> 
    </form>
    {hook 'Search'}
    </div>     
</div>
{hook 'AfterSearch'}

A présent je veux pouvoir chercher des auteurs de discussions ou, chercher dans un forum particulier.
Donc je me rends dans mon listener et j'ajoute de quoi effectuer tout ceci :

class hookListener extends jEventListener{
   function onSearch ($event) {
	// appel des zones 
	$author =  jZone::get('hfnusearch~searchAuthor');
	$forum  =  jZone::get('hfnusearch~searchForum');
	$zone = $author . $forum;
	$event->add( $zone );
   } 
}

et la zone author :

class searchAuthorZone extends jZone {
    protected $_tplname='zone.searchAuthor';    
    protected function _prepareTpl(){
        $form = jForms::create('hfnusearch~author');
        $form->setData('perform_search_in','authors');
        $this->_tpl->assign('form',$form);         
    }    
}

et le template zone.searchAuthor :

{form $form , 'hfnusearch~default:query'}
<fieldset>
    <legend>Author</legend>
    <div class="form_row">
        <div class="form_value">
            <strong>Author</strong>
        </div>
        <div class="clearer">&nbsp;</div>
    </div>    
    <div class="form_row">
        <div class="form_property">
            {ctrl_label 'hfnu_q'}
        </div>
        <div class="form_value">
             {ctrl_control 'hfnu_q'}
        </div>
        <div class="clearer">&nbsp;</div>
    </div>
    <div class="form_row form_row_submit">
        <div class="form_value">
            {formsubmit 'validate'}
        </div>
        <div class="clearer">&nbsp;</div>        
    </div>    
</fieldset>
{/form}

Et c'est tout !

Pour résumer "la puissante simplicité" :

Hook Process

  1. appel du hook dans le template hfnusearch
  2. dans le listener, appel de la zone
  3. dans la zone, instanciation du formulaire de recherche et affichage du template
  4. retour du rendu au hook


Résultat avant / après :
Page before a hook process Page after a hook process

en savoir plus sur jEvent qui a permit ce hook.

ForumPHP 2009, avec Jelix et HaveFnuBB

20 octobre 2009

Dans ce précédant billet, j'évoquais une "carence" sur la présence des développeurs PHP contribuant à la communauté.
Et ô surprise, quelque jours plus tard, je me vois contacter par un membre de l'Afup pour participer à un "espace projets PHP opensource".

Je ne sais pas s'il y a une relation de cause à effet, mais en tout cas, l'esprit "du libre" m'animant depuis plus de 10ans, je n'ai pu m'empêcher de partager cela et contacter mes "ex" de CakePHP-Fr pour leur en toucher 2 mots, juste histoire que "cette porte entrouverte" profite au plus grand nombre afin que l'évènement soit une vraie réussite et perdure :) Et donc CakePHP-Fr y sera aussi :)

Ainsi donc je pourrai vous présenter HaveFnuBB, le forum OpenSource produit avec Jelix le framework PHP5. Et cerise sur le gâteau, en la présence de Laurent Jouanneau, mr Jelix lui-même. :-)

retrouver les projets OpenSource participants

Plugin Jelix Pagelinks

29 septembre 2009

Pagelinks fait parti des outils de template, permettant de gérer la pagination des données au sein de ses applications.

Pagelinks est pour cela un plugin de type template et s'utilise donc comme suit :

{pagelinks 'module~controleur:methode', 
   array(liste_des_param_à_passer_au_controleur), 
   nombre_total_de_records, 
   page_courante, 
   nombre_de_record_par_page, 
   "page", 
   proprietes_de_mise_en_forme_de_pagination}

La recette pour que ce plugin fasse son œuvre est :

  • Un template contenant {pagelinks} ;
  • Un contrôleur :

a) récupérant les paramètres
b) accédant à notre Dao pour extraire les données
c) retournant les données au même template.

Exemple concret : paginer les sujets d'un forum :

Le template contiendra ceci :

{pagelinks 'havefnubb~posts:lists', array('id_forum'=>$id_forum),  $nbPosts, $page, $nbPostPerPage, "page", $properties}

Maintenant le contrôleur :

function lists () {
 $rep = $this->getResponse('html');
  // les paramètres
 $page = (int) $this->param('page');
 $id_forum = (int) $this->param('id_forum');
 
 // personnalisation du titre de la page
 if ($page == 0)
     $rep->title = $forum->forum_name;
 else
     $rep->title = $forum->forum_name . ' -  Page ' .($page+1) ;
 
// personnalisation du paginateur
 $properties = array('start-label' => 'First Page ',
              'prev-label'  => 'Prev. Page',
              'next-label'  => 'Next Page',
              'end-label'   => 'Last page',
              'area-size'   => 5);
 $nbPostPerPage = 20;
 $daoPost = jDao::get('havefnubb~posts');
 // nombre total de sujets
 $nbPosts = $daoPost->countPostsByForumId($id_forum);
 // recuperation des sujets compris entre la page $page et la limite par page
 $posts = $daoPost->findByIdForum($id_forum,$page,$nbPostPerPage);
 // le template
 $tpl = new jTpl();      
 $tpl->assign('posts',$posts);
 $tpl->assign('page',$page);                
 $tpl->assign('nbPostPerPage',$nbPostPerPage);
 $tpl->assign('nbPosts',$nbPosts);
 $tpl->assign('id_forum',$id_forum);
 $tpl->assign('properties',$properties);
 $rep->body->assign('MAIN', $tpl->fetch('havefnubb~posts.list'));
 return $rep;

$properties permet de contrôler l'affichage des indicateurs de pagination exemple :

Premier page |< 1 | 2 | 3 >| Derniere Page

area-size contrôle le nombre de "numéro" de page affiché, par exemple 5 donnerait

Premier page |< 1 | 2 | 3 | 4 |5 >| Derniere Page

Donc à chaque clique, on rappelle systématiquement la même méthode, qui à son tour recalcule la page courante les enregistrements à afficher et raffiche le template et ainsi de suite...

Un plugin somme toute très simple de mise en oeuvre, et qui rend moultes services une fois la gymnastique (de récuperation des parms, recalcul des données à extraire) acquise.

Les Plugins Coordinateur Jelix

22 septembre 2009

Les plugins permettent, selon leur type, d'étendre les possibilités du framework / de votre application.

Ses plugins sont de 8 types :

  • Acl : plugin de gestion d'ACL
  • Acl2 : plugin de gestion d'ACL v2
  • Auth : driver d'authentification
  • Coord : plugin coordinateur
  • Db : driver de base de données
  • Tpl : plugin de template
  • Url : plugin permettant de generer des Urls
  • jForms: plugin de gestion de formulaires

Cet article arbordera les plugins de type "Coord".

Lire la suite...

Jelix et le module jCommunity

15 septembre 2009

En PHP, si une classe ou API existante vous plait mais que vous souhaitez y apporter votre touche personnelle vous inclurez cette dernière et la surchargerez pour éviter d'y toucher.

Exactement le même principe s'applique avec les modules Jelix. On parlera alors "d'overload".

Un module n'étant pas une simple classe (mais composé de contrôleurs, daos, forms, template, zones, classes, fichiers de traductions) tout ne peut-être surchargé.

Qu'est ce qui peut faire l'objet d'overload ?

  • Les templates : pour modifier le rendu
  • les Dao : pour ajouter des propriétés (des colonnes/ tables ) et des factories (méthodes d'accès aux tables)
  • les forms : pour ajouter des champs de formulaires et leurs règles de contrôle associées
  • les locales : fichiers de traductions


Avantages de l'"Overload" :

  • Extension des fonctionnalités du module original
  • Adaptabilité de tous les aspects du module (exception faite du contrôleur)
  • Facilité de mise à jour du module originel, puisqu'on ne change aucune ligne de code de ce dernier

Lire la suite...

HaveFnu BB 1.1.0

5 septembre 2009

HaveFnuBB! est le forum réalisé avec Jelix le framework PHP5.

Au menu de cette version 1.1.0, de nombreuses nouveautés :

  1. un Quick Search en ajax pour trouver des sujets du forum
  2. intégration du framework CSS nommé 960gs
  3. un plugin Gravatar pour afficher ou non le gravatar du membre s'il le désire
  4. un plugin Social Network, pour afficher des icônes des réseaux sociaux les plus connus, et relier les sujets du forum facilement.
  5. etc.. :)

Télécharger HaveFnuBB 1.1.0

HaveFnuBB! et son installeur automatique aka wizard

1 septembre 2009

Dans un précédent billet vous m'aviez demandé de vous présenter l'installeur de mon forum HaveFnuBB!

Voici donc le Système d'installation d'HaveFnuBB! :

Le système d'installation se compose des étapes suivantes :

  1. ) Vérifications des pré-requis système
  2. ) Configuration du Forum
  3. ) Configuration de la Base de données
  4. ) Installation de la Base de données
  5. ) Création du compte Administrateur
  6. ) Fin


INSTALLATION :
Techniquement les étapes consistent en :

  • Un seul contrôleur, 4 forms (*.forms.xml), 3 fichiers de config (*.ini.php)

entre parenthèses, se trouve le nom de la méthode du contrôleur "default" du module "hfnuinstall"

Etape 1 (check) - Vérifications :

  • version_compare(phpversion(),'5.0','>=')
  • function_exists('mysql_connect')


Etape 2 (config) - Nom, description, langue et thème principaux, etc...

  • lecture/écriture du fichier de config defaultconfig.ini.php
  • lecture/écriture du fichier de config havefnu.ini.php


Etape 3 (dbconfig) - Info sur les noms: du serveur, de la base, de l'utilisateur de la base et son mot de passe

  • lecture/écriture du fichier de config dbprofils.ini.php


Etape 4 (installdb) - exécution du script install.mysql.sql

  • la structure de chaque module possède un dossier install/ , renfermant à son tour
    • sql/install.driver.sql
    • update/version/install.driver.sql


Etape 5 (adminaccount) - Infos admin :

  • lecture/ecriture du fichier de config havefnu.ini.php
  • appels des méthodes "core" de Jelix pour créer un utilisateur


Etape 6 (end) - Message de fin ;)


MISE A JOUR :
La système de mise à jour, se charge :

  • au minimum de mettre la version à jour dans havefnu.ini.php (le fichier de config principal du forum)
  • sinon s'occupe de mettre à jour d'autres fichiers de configuration, et exécuter les scripts SQL.

A chaque étape, l'installeur vérifie si la version actuelle est différente et enchaine les étapes sinon s'arrête.

  • puis fini par vider le cache


Bien évidement, on ne peut pas exécuter 2 fois de suite l'installation, puisque la vérification de la version est toujours faite.

EPILOGUE :
Si vous accédez à la racine de votre forum et qu'il n'est pas installé, Jelix routera l'utilisateur directement sur l'installeur. Ceci se fait grâce à l'intervention du plugin Coordinateur (qui pourra faire l'objet d'un autre article) vérifiant si le forum est installé.
Pour plus d'infos je vous invite à consulter le code ici ou bien venir en parler sur le forum lui même ;)

NOTA BENE : L'installeur n'a rien à voir avec la prochaine feature de Jelix, l'installeur touzazimut, de modules, plugins etc.. ;)

Mais pour en avoir pas mal discuté en Janvier et codé appmgr, réadapter l'installeur d'HaveFnuBB avec Jelix 1.2 ne me posera aucun problème :P

jUrl, le moteur d'URLs Automatiques de Jelix.

25 août 2009

Ce petit article aborde 2 points du moteur d'URLs,

  1. l'écriture d'URLs "Jelixiennes"
  2. les moteurs d'URLs de Jelix

1 - Introduction

Classiquement, pour ajouter un lien dans une page, on se contente de faire des URLs manuellement comme suit :

<a href="/mon/chemin/vers/mon/lien/interne" title="mon lien tout pas beau">MonBeauSite</a>

Ce pendant si vous installez cette application dans un environnement dont le chemin est différent,
le petit click sur le lien aboutira sur une page 404.

2 - Ecriture d'URLs "Jelixiennes"

Pour éviter l'avatar précédant, jUrl fait son oeuvre de façon tout à fait simple, comme suit :

<a href="{jurl 'news~default:index',array('parm1'=>'value1')}">MonBeauSite</a>

news est mon module, default est mon contrôleur, et index ma méthode.

ce qui génèrera l'url http://localhost/index.php?module=news&action=default:index&parm1=value1

Mais il y a bien évidement moyen d'avoir des URLs beaucoup plus "propres" (voir ci-dessous)

Une autre façon de procéder, est d'utiliser jUrl dans son contrôleur et d'assigner le résultat au template :

le contrôleur

function index() {
    $rep = $this->getResponse('html');
    $monUrl = jurl::get('module~controlleur:action',array('parm1'=>'value1'));
    $tpl = new jTpl();
    $tpl->assign('monurl',$monurl);
    $rep->body->assign('MAIN', $tpl->fetch('mon_template');
    return $rep;
}

le template

<a href="{$monurl}">MonBeauSite</a>

Cas concret de cette utilisation au travers du controleur :
l'utilisation de script AJAX ayant bien évidemment besoin d'une url pour envoyer les données au serveur.

Dans le template quand nous codons le javascript nous mettons entre {literal}...{/literal} le code javascript que jelix ne doit pas interpreter.
Par conséquent l'URL ne peut être dynamiquement allouée à notre template,
il faut donc générer le code javascript dans sa méthode avec l'URL qui elle sera bien issue de jUrl().

voici ce que cela donne par exemple pour un champ de recherche dynamique : le controleur

$url = jUrl::get('hfnusearch~default:queryajax');
 
$javascript =
	"<script type=\"text/javascript\">"."\n".
	"//<![CDATA["."\n".
	"$().ready(function() {"."\n".
	"\t"."$(\"#hfnu_q\").autocomplete('".$url."', {"."\n".
	"\t\t"."width: 300,"."\n".
	"\t\t"."multiple: true,"."\n".
	"\t\t"."matchContains: true,"."\n".
	"\t"."});"."\n".
	"});"."\n".
	"//]]>"."\n".
	"</script>"."\n";
$tpl->assign('javascript',$javascript);

le template

{$javascript}
...

ce qui donnera dans la page html :

<script type="text/javascript">
//<![CDATA[
$().ready(function() {
    $("#hfnu_q").autocomplete('http://localhost/index.php?module=hfnusearch&action=default:queryajax', {
        width: 300,
        multiple: true,
        matchContains: true,
    });
});
//]]>
</script>

3 - Les moteurs d'URLs de Jelix

A présent un autre aspect du moteur d'URLs de Jelix est son type.
Le type de moteur simple produit des URLS de la forme (pour reprendre l'exemple précédant)

http://localhost/index.php?module=news&action=default:index&parm1=value1

Le type de moteur basic_significant produit des URLs à la Cake exemple :

http://localhost/index.php/news/default/index?parm1=value1

c'est à dire :

http://localhost/index.php/module/contrôleur/methode?parm1=value1

Le dernier type de moteur existant est le type significant produisant l'url suivante :

http://localhost/news/value1

résultat beaucoup plus concis et clair pour trouver la news "value1" ;)

Le dernier (significant) utilise, de plus, un fichier ursl.xml permettant d'indiquer à Jelix, la concordance
entre une URLs et les modules.

Ainsi pour l'url : http://localhost/news/value1, le fichier urls.xml ressemblerait à :

<?xml version="1.0" encoding="UTF-8"?>
<urls xmlns="http://jelix.org/ns/urls/1.0">  
    <classicentrypoint name="index" default="true" noentrypoint="true">
        <url pathinfo="/news/:parm1" module="news" action="default:index">
           <param name="parm1" type="string"/>
        </url>
    </classicentrypoint>
</urls>

4 - Conclusion

  • le générateur d'URLs permet justement de ne jamais rien avoir en dur dans le code et de ne rien figer concernant le choix et la gestion des URLs.
  • le moteur basic_significant représente un très bon ratio temps passé / qualité des URLs générées
  • le moteur significant est un peu plus délicat à gérer car il faut écrire TOUTES les urls, au risque de voir certaines complétement inopérantes

jUrl est donc l'outil indispensable pour la portabilité de ses applications dans des environnements hétérogènes et d'une très grande souplesse de mis en oeuvre.

en savoir plus sur jURL

Le mardi c'est jelix

24 août 2009

Bonjour, chaque mardi je tenterai de vous faire découvrir de nouveaux aspects (ou pas ) de Jelix.

Ainsi donc si vous avez un besoin/une envie d'un article, faites le moi savoir ;)

à demain si vous le voulez bien .

Jelix et la Communication inter modules

18 août 2009

Une pépite parmi tant d'autres que renferme Jelix, est la communication inter module.

Mais qu'est-ce que cela ?

Il arrive que des modules aient besoin de communiquer entre eux
ou qu'ils aient besoin d'informations des uns et des autres.

Imaginons un cas simple, une interface d'administration listant les modules (articles,wiki,news), présents sur son site favori.

La solution "Jelixienne" consiste à faire communiquer le module d'administration avec tous les autres.

Le module d'administration va émettre un message et récupérera les réponses des modules.

Mise en place :
je ferai apparaitre ces infos sur une pages dédiées "Liste des modules".
Cette page sera constituée d'un template et les réponses des modules se feront à l'aide de zones
(rappel : les zones sont des portions de page)

Donc pour cela je défini un contrôleur "modules" avec une action "index" par défaut :

le contrôleur

class modulesCtrl extends jController {
 
    function index() {
	$rep = $this->getResponse('html');
        $tpl = new jTpl();
        $tpl->assign('modules',jEvent::notify('HfnuAboutModule')->getResponse()); 
        $rep->body->assign('MAIN',$tpl->fetch('modules'));
	return $rep;
	}
}

la ligne intéressante ici est :

$tpl->assign('modules',jEvent::notify('HfnuAboutModule')->getResponse());

cette ligne fait 3 choses en même temps :

  1. elle émet un message nommé HfnuAboutModule
  2. elle récupère les données du message émis
  3. elle assigne ses données à la variable "modules" du template.

la ligne suivante indique à Jelix, le nom du template "module", qui affichera les données

$rep->body->assign('MAIN',$tpl->fetch('modules'));

le template

<h1>Liste des modules </h1>
{if count($modules)}
{assign $count = count($modules)}
{for $i=0; $i<$count;$i++}
<div class="two-cols">
    <div class="col">
        {$modules[$i]}            
    </div>
</div>
{/for}
{/if}

Bon ok on visualise un peu ce qui va se passer "à la fin" mais comment nos modules "news","wiki","articles" vont ils répondre à l'evenement HfnuAboutModule ?

A tout jEvent::notify, un listener peut répondre, donc nous allons définir un listener comme suite en 2 temps :

  1. définition d'un fichier events.xml décrivant le nom de l'évènement et la classe y répondant, events.xml est donc le "liant"
  2. définition du listener lui-même.

fichier events.xml

<?xml version="1.0" encoding="iso-8859-1"?>
<events xmlns="http://jelix.org/ns/events/1.0">
   <listener name="hfnuadmin">
		 <event name="HfnuAboutModule" />
   </listener>   
</events>

On retrouve bien ici le nom de l'évènement HfnuAboutModule auquel le listener hfnuadmin va se charger de répondre

le listener

class hfnuadminListener extends jEventListener{
 
   function onHfnuAboutModule ($event) {
        $event->add( jZone::get('hfnuadmin~about',array('modulename'=>'hfnuadmin')) );
   }   
}

lorsque HfnuAboutModule est déclenché, alors onHfnuAboutModule entre en oeuvre et répond à l'event (via $event->add())

$event->add() peut recevoir tout type de données. Ici nous lui retournons une zone (que nous avons précédemment abordés dans mes 2 précédants articles) nommée "about"

la zone

class aboutZone extends jZone {
    protected $_tplname='zone.about';
 
    protected function _prepareTpl(){
        $moduleName = $this->param('modulename');
 
        if ($moduleName == '') return;
        jClasses::inc('havefnubb~modulexml');
        $moduleInfo = modulexml::parse($moduleName);         
        $this->_tpl->assign('moduleInfo',$moduleInfo);  		
    }
}

notre zone ici récupère le paramètre du nom du module, puis parse le fichier module.xml et affecte le résultat au template zone.about

le template

<h1>{$moduleInfo['name']}</h1>
<dl>
<dt>{@hfnuadmin~hfnuabout.about.version@} :</dt><dd> {$moduleInfo['version']} ({@hfnuadmin~hfnuabout.about.date.create@} {$moduleInfo['dateCreate']})</dd>
<dt>{@hfnuadmin~hfnuabout.about.label@} :</dt><dd> {$moduleInfo['label']|escxml}</dd>
<dt>{@hfnuadmin~hfnuabout.about.desc@} :</dt><dd> {$moduleInfo['desc']}</dd>
<dt>{@hfnuadmin~hfnuabout.about.notes@} :</dt><dd> {$moduleInfo['notes']}</dd>
<dt>{@hfnuadmin~hfnuabout.about.licence@} :</dt><dd> {if $moduleInfo['licenceURL'] != ''}<a href="{$moduleInfo['licenceURL']}">{$moduleInfo['licence']}</a>{else}{$moduleInfo['licence']}{/if}</dd>
<dt>{@hfnuadmin~hfnuabout.about.copyright@} :</dt><dd> {$moduleInfo['copyright']}</dd>
{foreach $moduleInfo['creators'] as $author}
<dt>{@hfnuadmin~hfnuabout.about.authors@} :</dt><dd> {if $author['email'] != ''}<a href="mailto:{$author['email']}">{$author['name']|escxml}{else}{$author['name']|escxml}{/if}</a></dd>
{/foreach}
<dt>{@hfnuadmin~hfnuabout.about.links@}</dt><dd><a href="{$moduleInfo['homepageURL']}">{@hfnuadmin~hfnuabout.about.homepageURL@}</a> - <a href="{$moduleInfo['updateURL']}">{@hfnuadmin~hfnuabout.about.updateURL@}</a></dd>
</dl>

Résultat :

Liste des modules

News!

Version :

   stable 1.1.2 (du 2008-12-16)

Libellé :

   Module de gestion de nouvelles

Description :

   Ce module permet de gerer les nouvelles de son site web

Notes :

   N/A

License :

   GNU General Public Licence

Copyright :

   2008 FoxMaSk

Auteurs :

   FoxMaSk

Liens :

   Page d'accueil du module - Lien mise à jour

Wiki

Version :

   stable 1.0.2 (du 2009-01-25)

Libellé :

   Wiki

Description :

   Wiki maison pour la documentation du site web

Notes :

   N/A

License :

   GNU General Public Licence

Copyright :

   2008 FoxMaSk

Auteurs :

   FoxMaSk

Liens

   Page d'accueil du module - Lien mise à jour

PS : ici je n'ai pas détaillé tous les events.xml des 3 modules ni les 3 listeners mais le code est le même ;)

Conclusion :

Voici donc la perle ; qui en quelques petites lignes ; a permis à tous les modules de se "trouver" et réunir des infos au même endroit.

La même mécanique des jEvent::notify() permet par exemple d'enchainer des actions après l'inscription d'un membre (tels que lui envoyer un mail) jEvent::notify() permet également d'enrichir les fonctionnalités d'un module A via d'autres modules B,C,D sans avoir à modifier le module A, etc...

en savoir plus sur la communication inter module

- page 1 de 3