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"> </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"> </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"> </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"> </div>
</div>
<div class="form_row form_row_submit">
<div class="form_value">
{formsubmit 'validate'}
</div>
<div class="clearer"> </div>
</div>
</fieldset>
{/form}
Et c'est tout !
Pour résumer "la puissante simplicité" :

- appel du hook dans le template hfnusearch
- dans le listener, appel de la zone
- dans la zone, instanciation du formulaire de recherche et affichage du template
- retour du rendu au hook
Résultat avant / après :
en savoir plus sur jEvent qui a permit ce hook.