[php5] liméa xslt template engine

Description

LXTE est un script mettant en relation un modèle de style XSLT avec un fichier de données XML.
Il s'appui sur le DOM de PHP5.

1) Principe de fonctionnement

Vous commencez votre site, vous concevez la page d'accueil, celle-ci, pour rester original, s'appelera 'index.php'.
Cette page se compose de 2 éléments: un contenu et une 'interface publique'.
Le contenu, statique ou dynamique, est construit par votre code PHP, sa mise en page sera construite par un 'template' ou 'modele'.
Cette classe, documentée, va vous permettre de faire tout ceci très simplement. D'un coté votre page 'index.php' qui construira les données et de l'autre 'index.xhtml' qui sera votre 'modele d'interface'.

2) En détail

LXTE va, par ses fonctionnalités, va vous permettre de construire un fichier XML regroupant les différentes informations qui seront affichées sur votre page. Ce fichier XML, associé à une feuille de style de type XSLT, sera mis en forme puis renvoyé au naviguateur 'transformé'. Le naviguateur recevra du code XHTML1.1 Strict.
LXTE intègre aussi un système de cache pour eviter de devoir reconstruire le fichier de données XML à chaque chargement de votre page 'index.php' par ses visiteurs.

3) Et la suite ..

Dans le zip vous trouverez un exemple concret, une page PHP affichant diverses informations dans votre naviguateur avec en son contenu, un script exposant toutes les fonctionnalités de LXTE.
Si vous avez des questions au sujet de la synthaxe XML, XSLT, CSS, de nombreuses documentations sont accessibles sur le net.
Au sujet du script n'hesitez pas, exprimez vous :)

Source / Exemple :


INDEX.PHP - Fichier principal gérant les données à afficher

<?php

    $pageCopyright = '©2006 Christophe LEMOINE';
    $pageTitle = 'Exmple concret - Une liste d\'articles du 2eme au 7eme';
    $pageKeywords = 'xml,xslt,xsl,super,titre';
	$pageDescription = 'Une liste d\'articles du 2eme au 7eme';

	require_once ('class/class.template.php');

	$xslPath = './tpl/default';
	$xmlFileName = basename ($_SERVER['PHP_SELF'], '.php');
	$t = new TemplateXSLT (
				$xmlFileName, // nom de cette page PHP
				'./', // chemin d'accès au fichier XML
				$xslPath, // chemin d'accès au modèle XSLT (.xsl)
				false, // true = forcer à recréer le cache, false = gestion utomatique
				3600 // delai en secondes entre chaque recréation du cache
				);
	if (!$t->cached) // si le cache n'est pas utilisé alors on le recréé
	{
		$t->Open (); // préparation du document
		$t->appendElement ('tplpath', ($xslPath.(substr ($xslPath, strlen ($xslPath), 1) == '/' ? '' : '/')));
		$t->appendElement ('url', 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']);
		$t->appendElement ('generator', 'Liméa XSLT Template Engine');
		$t->appendElement ('copyright', $pageCopyright);
		$t->appendElement ('title', $pageTitle);
		$t->appendElement ('keywords', $pageKeywords);
		$t->appendElement ('description', $pageDescription);
		$t->appendComment ('Construction de la liste des articles');
		$t->loadPluginFunction ('appendArticles', null);
		$t->Close (); // ne jamais oublier! enregistre les modifictions apportées
	}

	$t->ShowXHTML (); // retourne le modèle XSL sous forme d'une page XHTML

?>

STYLE_INDEX.XSL - Le modèle XSL de la page à afficher

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet
	version="1.0"
	xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
	<xsl:output
		encoding="{_OUTPUT_ENCODING_}"
		indent="yes"
		method="xml"
		doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN"
		doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"/>
	<xsl:template match="/">
		<html xmlns="http://www.w3.org/1999/xhtml">
			<head>
				<meta http-equiv="content-type" content="text/xml, charset={_OUTPUT_ENCODING_}"/>
				<title><xsl:value-of select="page/title"/></title>
				<meta name="keywords" content="{page/keywords}"/>
				<meta name="description" content="{page/description}"/>
				<meta name="author" lang="fr" content="Christophe LEMOINE"/>
				<meta name="reply-to" content="lemoine.christophe@yahoo.fr (Christophe LEMOINE)"/>
				<meta name="identifier-url" content="{page/url}"/>
				<meta name="copyright" content="{page/copyright}"/>
				<meta name="generator" content="{page/generator}"/>
				<meta name="date" content="{page/infos/created}"/>
				<meta name="robots" content="all"/>
				<meta name="revisit-after" content="7"/>
				<link href="{page/tplpath}style.css" rel="stylesheet" type="text/css"/>
			</head>
			<body>
				<h2><xsl:value-of select="page/title"/></h2>
				<p>Le fichier XML comporte 10 articles mais pourtant votre template XSLT en affiche que 6, du 2 au 7 compris!</p>
				<xsl:for-each select="page/articles/article">
					<xsl:variable name="num">
			        	<xsl:number level="any" from="/page/articles"/>
			        </xsl:variable>
			        <xsl:if test="$num > 1 and $num < 8">
			        	<p class="article">
							<div class="maxi">
								<xsl:value-of select="title"/>
							</div>
							<div class="mini">
								écrit par <b><xsl:value-of select="author"/></b> 
								le <b><xsl:value-of select="date"/></b>, 
								lu <b><xsl:value-of select="numread"/></b> fois
							</div>
							<div class="desc">
								<xsl:value-of select="description"/><br />
							</div>
						</p>
					</xsl:if>
				</xsl:for-each>
			</body>
		</html>
	</xsl:template>
</xsl:stylesheet>

XSLT_PLUGIN.INC - Le fichier contenant la fonction perso pour afficher une liste d'articles

<?php

	class xslt_plugin
	{
	  
		function __construct ()
		{}
	
		function __destruct ()
		{}
		
		function appendArticles ($xmlObj, $param)
		{
		  	$artlist = array (
		  		array ('titre 1', 'description 1', '26/07/2006', 'auteur 1', 5),
		  		array ('titre 2', 'description 2', '26/07/2006', 'auteur 2', 1),
		  		array ('titre 3', 'description 3', '26/07/2006', 'auteur 3', 16),
		  		array ('titre 4', 'description 4', '26/07/2006', 'auteur 4', 9),
		  		array ('titre 5', 'description 5', '26/07/2006', 'auteur 5', 4),
		  		array ('titre 6', 'description 6', '26/07/2006', 'auteur 6', 0),
		  		array ('titre 7', 'description 7', '26/07/2006', 'auteur 7', 2),
		  		array ('titre 8', 'description 8', '26/07/2006', 'auteur 8', 1),
		  		array ('titre 9', 'description 9', '26/07/2006', 'auteur 9', 52),
		  		array ('titre 10', 'description 10', '26/07/2006', 'auteur 10', 7),
			  );
			$nodes = $xmlObj->getElementsByTagName ('page');
			foreach ($nodes as $node)
			{
				$articles = $xmlObj->createElement (utf8_encode ('articles'));
				foreach ($artlist as $a)
				{
					$artone = $xmlObj->createElement (utf8_encode ('article'));
					$a_titre = $xmlObj->createElement (utf8_encode ('title'), utf8_encode ($a[0]));
					$artone->appendChild ($a_titre);
					$a_description = $xmlObj->createElement (utf8_encode ('description'), utf8_encode ($a[1]));
					$artone->appendChild ($a_description);
					$a_date = $xmlObj->createElement (utf8_encode ('date'), utf8_encode ($a[2]));
					$artone->appendChild ($a_date);
					$a_author = $xmlObj->createElement (utf8_encode ('author'), utf8_encode ($a[3]));
					$artone->appendChild ($a_author);
					$a_numread = $xmlObj->createElement (utf8_encode ('numread'), utf8_encode ($a[4]));
					$artone->appendChild ($a_numread);
					$articles->appendChild ($artone);
				}
				$node->appendChild ($articles);
			}
		}
	  
	}

?>

Conclusion :


Liméa XSLT Template Engine est sous licence Creative Commons.
http://creativecommons.org/licenses/by-nc-sa/2.0/fr/

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.