mardi 2 octobre 2007

Composition de page par heritage

La dernière fois, nous avons abordé la composition de page par aggrégation de composants. Ce type de composition est particulierement bien adapté aux composants fonctionnels. Par exemple, une page d'accueil peut être composée des composants "Dernieres news", "Utilisateurs en lignes", "Bloc de publicite", "Edito", "Boite de connexion". Chacun de ces composants apporte une fonctionnalité a la page. Aujourd'hui, je vous propose d'aborder la mise en place d'un layout de page cohérent pour toutes les pages de votre site. Le problème: pouvoir ajouter facilement une page a votre site en gardant le layout general. La solution: utiliser la notion d'heritage de mason pour factoriser le layout global de votre site. L'héritage en mason. Mason permet de définir une chaine d'héritage entre composants. Le composant terminal de cette chaîne d'héritage doit être une page. En fait, la notion d'héritage en mason est un peu éloignée de la notion d'héritage classique que l'on connait dans les langages objets. Pour faire simple, il faudrait plutôt parler d'auto inclusion inversée automatique. Pour être plus clair, prenons un exemple basique: traditionnellement, une page est composée d'un layout global (incluant le header et le footer) et d'un contenu utile. Dans un système à base d'inclusion, on écrierait une page comme ceci:

  1. INCLUDE header
  2. Contenu utile
  3. INCLUDE footer
Avec les fichiers (ou les scripts) header et footer écrits de façon séparée. Cette approche est possible en mason, mais elle n'est pas optimale. En mason, on fait un composant "de base" contenant le layout global de toutes les pages:
  1. %# layout.mas
  2. <html>
  3. <head>
  4. ...
  5. </head>
  6. <body>
  7. ...
  8. % $m->call_next()
  9. ...
  10. </body>
  11. </html>
A la ligne 8, le $m->call_next() permet à mason de continuer dans la chaine d'héritage. Lorsqu'on fait une nouvelle page, il suffit de préciser qu'elle hérite de layout.mas pour que son rendu inclue automatiquement le layout:
  1. %# page.html
  2. <flags>
  3. inherit => '/layout.mas'
  4. </flags>
  5. <p>
  6. Contenu
  7. </p>
Lorsqu'on interroge l'url http://yourserver/page.html , mason va automatiquement inclure le contenu de page.html dans le layout de layout.mas. En ligne 3, on spécifie de quel composant hérite la page. Par défaut, mason assume que toutes les pages héritent d'un composant particulier: autohandler . C'est donc plutôt dans un composant nommé autohandler qu'on va définir le layout global de la page plutôt que dans un layout.mas. De cette façon, on n'a pas besoin de spécifier de quel composant héritent nos pages:
  1. %# autohandler
  2. <html>
  3. <head>
  4. ...
  5. </head>
  6. <body>
  7. ...
  8. % $m->call_next()
  9. ...
  10. </body>
  11. </html>
Ensuite, plus besoin de spéficier l'héritage:
  1. %# page.html
  2. <p>
  3. Contenu
  4. </p>
On voit que de cette manière, ajouter une page qui hérite du layout global est facile. Il suffit de faire une page avec le contenu utile, et elle héritera automatiquement du composant autohandler. La prochaine fois, je vous parlerai des méthodes et de leur comportement dans la chaîne d'héritage. Référence : l'héritage dans le mason book.

Aucun commentaire: