====== Templates: Des Layouts et des Blocks ====== La documentation pour la création de thèmes est détaillée dans [[legacies:fr:templating/intro|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 //Layouts//((Définition de page)), les //Blocks//((Blocs HTML)) et les //View Scripts//((Scripts de Vue)). 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 ''''). 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 : On voit donc que ce fichier devra définir un élément racine '''' devant contenir une suite d'éléments '''' (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 : - L'extension ''[[http://www.php.net/manual/fr/book.simplexml.php|SimpleXML]]'' - 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 : 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 XML((Inclusions XML ou aussi applés XIncludes)). 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 : - Le bloc ''head'', de type ''Html/Head'' qui permet de générer un en-tête de page HTML (contenu de la baslise '''') - 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 - 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. - 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 =====