Projet : MagicSite
URL de présentation : http://magicsite.manga-torii.com
Objet : Site générique indépendant de la base de données et même du type de site. La création d'un nouveau site se résume à écrire les requêtes SQL et les pages de rendu XSL. Pour le reste (mise à jour, contrôles e cohérence, etc.) tout se fait automatiquement à partir de la structure de la base de données.
18/07/2006 : Le projet, même s'il a encore quelques lacunes passe en release. L'application a démontré qu'elle était capable de gérer des contraintes complexes et gérer "proprement" les erreurs de saisie.
**************
Alors voilà.
En début de mois, je suis parti en formation (aussi inutile qu'inintéressante, comme d'hab ).
Le seul point intéressant de cette formation, c'est que j'ai découvert un outil propriétaire d'un ERP, qui permet, sans développement (uniquement XSL et SQL) de créer une interface web pour consulter/administrer les données de l'application.
En gros, c'est une grosse usine à gaz écrite en Java, qui bouffe 500 Mo par session (rien que ça ), d'une lenteur abominable, et pas super au point niveau conception (on s'en serait doutés )
Mais le principe de fonctionnement m'a bien plus, et je me suis mis en tête de refaire la même chose en certes, plus limité, mais :
- léger
- plus simple
- non dépendant de la base (pas même du SGBD)
Pour le moment, je pense avoir reproduit les fonction "essencielles", même si ces dernières demandent pas mal de boulot pour être améliorées (certainement au niveau optimisation)
En gros, le fonctionnement :
- Des fichiers XML décrivant une page, c'est à dire, quelles vues sont éxécutée, leur hiérachie, etc
- Des fichiers XML décrivant les requêtes dans la base, avec des critères pré-définis de tri et de filtre
- Des fichiers XSL, qui sont appelés au moment du rendu.
- Une unique page, qui ne contient rien (ça fallait déjà l'imaginer !), qui lit la description de la page demandée, exécute les vues, puis applique le XSL qui va bien dessus
Mise à part que j'ai codé en dur dans mon code (C#) des appels au client SQL Server, par souci d'optimisation, le code ne demande que quelques lignes de modification pour utiliser n'importe quel connecteur OLEDB. Et vu que les requêtes sont stockées dans des fichiers XML, on voit tout de suite qu'on n'est pas du tout liés à un modèle de données figé.
Un peu plus de détail :
Un fichier "page" ressemble à ça :
<?xml version="1.0" encoding="utf-8" ?>
<page>
<title>Accueil</title>
<template name="home"/>
<views>
<view name="V_MENU" output="menu">
<configuration>
<filter name="ALL"/>
<sort name="LABEL"/>
</configuration>
</view>
<view name="V_LOGIN" output="login">
<configuration>
<filter name="ONE">
<parameter name="nickname" type="input" value="user_nickname" default=""/>
<parameter name="password" type="input" value="user_password" default=""/>
</filter>
</configuration>
</view>
<view name="V_TEST" output="test">
<configuration>
<filter name="ALL"/>
<sort name="ID"/>
</configuration>
</view>
</views>
</page>
|
Dans le détail :
- Un titre (ouais, trop fort)
- Un template (le nom du XSL à appliquer, sans l'extension
- Une liste de vues
Dans cette liste de vue, on trouve, pour chaque vue :
- Son nom
- Le nom de la node XML qui va contenir le résultat
- Une configuration contenant :
- Le nom du filtre utilisé
- La liste des paramètres utilisés pour ce filtre (si existants) avec comme "type" : input = Querystring, POST d'un forumlaire, Variable serveur, Cookie / parent = Valeur d'un champ dans la vue "parente" / value = valeur en dur
- Le nom du critère de tri utilisé
Une fichier de vue, quand à lui, se présente de la façon suivante :
<?xml version="1.0" encoding="utf-8" ?>
<view>
<sql>select id, label, description, BusinessView from menuEntry</sql>
<filters>
<filter name="ALL"/>
<filter name="ONE" sql="id = @id">
<parameter name="id" sqltype="numeric" precision="18" scale="0" length="9"/>
</filter>
<filter name="LABEL" sql="label like '%' + @label + '%' or description like '%' + @description + '%'">
<parameter name="label" sqltype="nvarchar" precision="0" scale="0" length="50"/>
<parameter name="description" sqltype="nvarchar" precision="0" scale="0" length="50"/>
</filter>
</filters>
<sorts>
<sort name="ID" sql="id"/>
<sort name="LABEL" sql="label"/>
</sorts>
</view>
|
Dans le détail :
- Une requête SQL sans filtre, ni clause de tri
- Une liste de filtres prédéfinis, avec, pour chacun, le cas échéant un bout de code SQL qui sera mis dans la clause "where"
- Une liste de paramètres, avec leur type
- Une liste de critères de tri prédéfinis, avec, pour chacun, la liste des champs utilisés pour le tri
Voici aussi un exemple de fichier XSL, qui permet ensuite le rendu de la page :
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:import href="include/variables.xsl"/>
<xsl:import href="include/copyright.xsl"/>
<xsl:import href="include/menu.xsl"/>
<xsl:import href="include/head.xsl"/>
<xsl:template match="/">
<html xmlns="http://www.w3.org/1999/xhtml">
<xsl:call-template name="head"/>
<body>
<form action="." method="post">
<xsl:apply-templates select="/page/menu"/>
<xsl:apply-templates select="/page/test"/>
<xsl:call-template name="copyright"/>
</form>
</body>
</html>
</xsl:template>
<xsl:template match="test">
<table border="1">
<tr>
<th>ID</th>
<th>Label</th>
<th>Del</th>
</tr>
<xsl:for-each select="line">
<tr>
<td>
<xsl:value-of select="id"/>
</td>
<td>
<input type="text" name="upd:test-label-{position()}" value="{label}"/>
</td>
<td>
<input type="checkbox" name="del:test" value="{position()}"/>
</td>
</tr>
</xsl:for-each>
<tr>
<td>
New
</td>
<td>
<input type="text" name="add:test-label"/>
</td>
<td>
X
</td>
</tr>
<tr>
<td colspan="3">
<input type="submit" value="Mettre à jour"/>
</td>
</tr>
</table>
</xsl:template>
</xsl:stylesheet>
|
On se balade simplement dans l'arboressence du flux XML généré. On peut aussi indiquer des champs qui, selon leur nom, seront utilisés pour la sélection, la mise à jour, la suppression ou l'insertion de données.
Actuellement, le source complet est... petit, et assez rapide (ceci dit, je suis sous Vista, alors ça pourrait être largement mieux ) :
Un seul fichier de 604 lignes.
Alors maintenant, les questions sont (cf. sondage) :
- Est-ce que ça intéresse des gens ?
- Est-ce que des gens sont près à m'aider ?
Message édité par Arjuna le 18-07-2006 à 11:27:10