La documentation pour la création de thèmes est détaillée dans le guide du graphiste
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 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.
Le Template de la novalib
nécessite la présence de plusieurs prérequis :
SimpleXML
Zend_View
Zend_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 :
head
, de type Html/Head
qui permet de générer un en-tête de page HTML (contenu de la baslise <head>
)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 HTMLcontent
, 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.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.
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();