Templates: Des Layouts et des Blocks

La documentation pour la création de thèmes est détaillée dans le guide du graphiste

Introduction

Le Template est le gestionnaire de mise en forme des pages, c'est lui qui transformera des données de PHP en page HTML. Dans la novalib, le template est divisé en trois parties: les Layouts1), les Blocks2) et les View Scripts3).

Le layout est défini par un fichier XML contenant les définitions de mise en forme de toutes les pages de l'application, c'est lui qui définira comment chacun des blocs et des scripts de vue devront interagir ensemble. Le Block est une instance de classe dédiée à l'affichage d'une partie de la page, cette classe peut avoir des fonctionnalités très génériques ou au contraire apporter des fonctionnalités uniques, dédiées à une problématique particulière (le bloc Html/Head par exemple est capable de gérer des éléments <link />). Enfin, le script de vue est la partie qui contient du code HTML et PHP entremêlé, utilisant la syntaxe alternative aux structures de contrôle.

Le Layout

Le fichier XML suit la grammaire DTD suivante :

<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT layouts (layout)>
<!ATTLIST layouts
    xmlns       CDATA  #FIXED   "http://xml.xnova-ng.org/layout/1.0/"
    xmlns:xi    CDATA  #FIXED   "http://www.w3.org/2001/XInclude"
    >
 
<!ELEMENT layout (block|reference)*>
<!ATTLIST layout
    name        ID      #REQUIRED
    extends     IDREF   #IMPLIED
    >
 
<!ELEMENT block (block|action)*>
<!ATTLIST block
    type        CDATA   #REQUIRED
    name        ID      #IMPLIED
    template    CDATA   #IMPLIED
    mode        CDATA   #IMPLIED
    >
 
<!ELEMENT reference (block|action)*>
<!ATTLIST reference
    name        IDREF   #REQUIRED
    >
 
<!ELEMENT action ANY>
<!ATTLIST action
    method      CDATA   #REQUIRED
    >

On voit donc que ce fichier devra définir un élément racine <layouts> devant contenir une suite d'éléments <layout> (sans s). Chacun de ces éléments définira une page spécifique ou définira une structure de page de base dont d'autres layout pourront hériter.

Avant de commencer

Dépendances

Le Template de la novalib nécessite la présence de plusieurs prérequis :

  1. L'extension SimpleXML
  2. Le Zend Framework en version 1.9.4
    • Zend_View
    • Zend_Layout

Le fichier de Layout

Avant de commencer, nous allons définir un layout de base dans notre fichier XML :

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE layouts PUBLIC "" "http://xml.xnova-ng.org/layout/1.0/layout.dtd">
<layouts
  xmlns="http://xml.xnova-ng.org/layout/1.0/"
  xmlns:xi="http://www.w3.org/2001/XInclude"
  >
 
  <layout name="default-html">
    <block type="Html/Page" name="root" template="html/page.phtml">
 
      <block type="Html/Head" name="head" template="html/head.phtml" />
      <block type="Html/Block" name="header" template="html/header.phtml" />
      <block type="Generic/Concat" name="content" template="html/footer.phtml" />
      <block type="Html/Block" name="footer" template="html/footer.phtml" />
 
    </block>
  </layout>
</layouts>

Les 6 premières lignes sont là pour indiquer à l'analyseur XML comment interpréter le fichier, on y définit notre namespace XML racine http://xml.xnova-ng.org/layout/1.0/, et le namespace xi pour le support des inclusions XML4). Nous retrouvons ensuite notre premier layout nommé default-html, définissant donc notre layout de base pour toute page HTML qui se respecte.

Ce layout ne contient qu'un seul élément de bloc. Cet élément est de type Html/Page, un bloc dédié à l'affichage d'une page HTML, c'est cet élément qui nous permettra de définir la DTD que l'on souhaitera utiliser pour note page, entre autres. Dans cet élément bloc, on retrouve 4 éléments blocs enfants :

  1. Le bloc head, de type Html/Head qui permet de générer un en-tête de page HTML (contenu de la baslise <head>)
  2. Le bloc header, de type Html/Block qui permettra d'afficher l'en-tête visuel de notre page, ce bloc est le bloc HTML générique, il n'apporte aucune fonctionnalité particulière, mais il est le bloc parent de trous les autres blocs de type HTML
  3. Le bloc content, de type Generic/Concat qui contiendra tous les blocs enfants à afficher sur la page. Ce type de bloc est particulier et n'a pas besoin de script de vue, il afiche simplement le contenu de ses blocs enfants les uns après les autres sans apporter le moindre changement.
  4. Le bloc footer, de type Html/Block qui cette fois affichera le pied de page. Comme le bloc header, il utilise le type HTML générique puisque aucune fonction particulière n'est requise.

L'appel du layout

Le layout est représenté par la classe Nova_Template_Layout, c'est la classe autour de laquelle le template s'organise.

define('ROOT_PATH', dirname(__FILE__) . DIRECTORY_SEPARATOR);
 
require_once 'Nova/Template/Layout.php';
 
$layout = new Nova_Template_Layout(array(
    'layout' => 'default-html',
    'layoutPath' => ROOT_PATH . 'design/layout.xml'
    ));
 
echo $layout->render();

Ajouter un nouveau layout

Inclusions XML

Mise en cache

Génération procédurale

Les blocs de page

Le package Generic

Le package Html

Le package Widget

Les scripts de vue

1) Définition de page
2) Blocs HTML
3) Scripts de Vue
4) Inclusions XML ou aussi applés XIncludes