Ressources Spip-Agora Clever Age

Des moteurs de rendu pour les ressources métier, le 6 janvier 2005

Il est désormais possible d’implémenter des moteurs capable de générer la représentation (xhtml, open-office, vcard, etc) d’une ressource (un objet métier).
- Comment les utiliser ?
- Quels sont les avantages des moteurs de rendu ?
- Comment en implémenter de nouveaux ?

Utilisation des moteurs de rendu

Le code utilisé lors de l’utilisation d’un moteur de rendu est toujours semblable à celui-ci :


<?php
require_once 'ecrire/include/bd/Renderer/Factory.php';

// Instanciation d'un moteur de rendu capable de représenter une
// ressource "Ressource" au format "Format"
$renderer =& Metier_Renderer_Factory::create'ressource''format' );
$ressource recuperer_instance_ressource();
$ressource->load($id);
$ressource->accept($renderer);

// Génération de la représentation
echo $renderer->render();
?>

Les avantages des moteurs de rendu

On peut retenir deux grands avantages :

- Le code dédié à la génération de la ressource n’est chargé qu’au moment où il est nécessaire.
- Il est très aisé d’implémenter de nouveaux moteurs de rendu.

Implémenter de nouveaux moteurs de rendu

Toute la logique des moteurs de rendu se trouve dans le répertoire /ecrire/include/bd/Renderer/.

Ce répertoire compte un sous-répertoire par type de ressource. Chacun de ces sous-répertoires contient un fichier par moteur de rendu pour la ressource.

En résumé : un moteur de rendu est une classe héritant de la classe de base Metier_Renderer ; nommée Metier_Renderer_%Ressource%_%Format% et déclarée dans le fichier /ecrire/include/bd/Renderer/%Ressource%/%Format%.php

Un moteur de rendu doit implémenter au minimum une méthode render() qui doit renvoyer la représentation litérale de la ressource associée.

Dès que l’instance de ressource à accepté ( $ressource->accept($renderer); ) le moteur, celui-ci à accès à la ressource par l’intermédiaire d’une propriété d’objet $_visited .

Par exemple, comment implémenter un moteur capable de représenter un auteur au format texte ?

Contenu du fichier /ecrire/include/bd/Renderer/Auteur/Txt.php :


<?php
require_once dirname(__FILE__).'/../../Renderer.php';
class 
Metier_Renderer_Auteur_Txt extends Metier_Renderer {
   function 
render() {
       
$str = array();
       
$str[] = " * Nom : " $this->_visited->getNom();
       
$str[] = " * Email : " $this->_visited->getEmail();
       
$str[] = " * Bio : " $this->_visited->getBio();

       return 
implode"\n"$str );
   }
}
?>

Utilisation du nouveau moteur de rendu :


<?php
require_once 'ecrire/include/bd/Renderer/Factory.php';
$renderer =& Metier_Renderer_Factory::create'auteur''txt' );

$auteur recuperer_instance_auteur();
$auteur->load($id);
$auteur->accept($renderer);

echo 
$renderer->render();
?>

Cela affichera une représentation du type :


* Nom : Michel Bertier
* Email : michel.bertier@cogip.com
* Bio : Michel est un élément indispensable à la cohésion des forces vives du bâtiment D.

C’est aussi simple que ça. Il ne reste plus qu’à implémenter des moteurs de rendu PDF, vCard, OpenOffice, CSV, etc.

Au boulot ;)

Ces moteurs de rendu sont une implémentation de la design pattern Visitor. Plus de détails à ce sujet : http://exciton.cs.oberlin.edu/javar...

Ce système est disponible à partir de SPIP-Agora 1.2.2 Beta 7.