[php5] liméa xslt template engine

Soyez le premier à donner votre avis sur cette source.

Vue 8 433 fois - Téléchargée 502 fois

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

Ajouter un commentaire Commentaires
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
26 juil. 2006 à 11:01
Hello,

c'est pas mal, très bonne idée, bien codée.
Mais ce que je trouve dommage, c'est qu'on se retrouve à créer un template XSL comme un autre XSL. Pour les débutants, ce n'est pas idéal de balancer des value-of select...et cie.
Ton système gagnerait en ergonomie s'il permettait d'utiliser des variables plus habituelles, comme {COMMENT_SECTION} par exemple. Et des balises prédéfinies.
Ensuite, tu fixes l'encodage, ce qui est dommage. Ce devrait être une option de ta classe.
Précise aussi que ta classe nécessite XSLTProcessor, parce que si DOM est souvent chargé sur un serveur PHP5, c'est moins souvent le cas de XSLTProcessor.
Sinon, je n'ai pas compris à quoi servait ton xslt_plugin, mais bon, je n'ai pas vraiment eu le temsp d'approfondir ton code.

Pas mal du tout, donc :-)
lumesh Messages postés 564 Date d'inscription jeudi 21 février 2002 Statut Membre Dernière intervention 7 novembre 2008
26 juil. 2006 à 16:22
Pour l'encodage, LXTE gere le UTF8, tu lui mets en entré ce que tu veux et il te ressort de l'utf-8. Couplé a une bonne identification de l'encodage par le naviguateur plus aucun probleme ne se pose!

Pour la simplification des value select, c'est une bonne idée. Cela m'embete de toucher au modele XSLT, car à la base il devait etre totalement independant.

Cette independance couplé au fichier xslt_plugin sont la pour permettre a tout un chacun de creer son propre site web. Ce n'est pas un moteur de template pur, LXTE permet de construire un site web en créant des interface qui afficheront les informations de bases et les infos custum.

Exemple, tu fais ton site via LXTE, dans ce site tu vx integrer un systeme d'articles, simple, tu codes ta fonction PHP dans le fichier xslt_plugin, et la gestion de l'a&ffichage (ordre d'apparence, nombre d'article dans une page, etc) tu la frabrique via le modele XSLT !

LXTE fait parti d'un esemble de fonctionnalité qui seront regroupée au sein d'un framework utilisable pour la conception sites (portails, blog, galleries photos, etc !)

LXTE est un peu le core du framework.
Plus tard des fonction predefinie, permetteront d'acceder a telle ou telle fonctionnalité, des constantes permetteront de connaitre telle ou telle informations.

LXTE est un début. Il ne sera pas fait pour un debutant en creation de site web mais pour des developpeurs PHP souhaitant realisé un site dynamique respectant les standards sans toutefois tout devoir creer de A a Z. En clair ceci est la base d'un systeme propre et extremement modulaire!
lumesh Messages postés 564 Date d'inscription jeudi 21 février 2002 Statut Membre Dernière intervention 7 novembre 2008
26 juil. 2006 à 16:25
Ces prochains jour je construirai un exemple concret en me basant sur la version actuelle de LXTE, soit la 0.1beta1.
Cet exemple sera contenu dans le zip si place il y a sinon sera dans la partie code de cette fiche.
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
26 juil. 2006 à 17:09
Hello,

on reprend...je connais plutôt bien le XML et XSL, pars de ce principe :-)
Donc, concernant l'encodage, ma question était : et si j'ai envie de passer en ISO-8859-1 ... ? Par exemple ?

Ensuite, mon idée n'était pas de toucher au XSL (il faut garder ses possibilités immenses), mais de coupler ça au système de templating habituel.

Ok, le xslt_plugin est là pour jouert avec registerPHPFunctions, quoi.

Pour l'idée d'un framework, ok...bien :-) Mais y a de la concurrence. Si tu ne connais pas, vas jeter un oeil à XMLRad.
lumesh Messages postés 564 Date d'inscription jeudi 21 février 2002 Statut Membre Dernière intervention 7 novembre 2008
26 juil. 2006 à 18:18
pour l'encodage je regarde ca, no pb!
Pour le systeme de templating je me penche sur le principe, mais pour t'avouer, j'ai beaucoup de mal à realiser un parser qui gererai des conditions, des boucles et etc! donc a voir, je conserve ton idee.

XMLRad .. je ne connaissais pas et effectivement, ca mal l'air plutot exelent!

Merci pour tes remarques. Si tu as d'autres idees, reproches n'hesite pas.

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.