Dotview - the php.net view style

Description

L'idée que j'ai eu en lançant ce projet c'est d'avoir un équivalent php de l'architecture MVC d'ASP.NET ou de SPRING en me concentrant juste sur la partie CONTROLER + VUE.

Pour ceux qui ne connaissent pas, le principe est le suivant :

Ma vue c'est du HTML conforme XML avec certaines balises interprétées niveau server.

Exemple :

<html>
...
<boutton id="monBoutton" title="Clique sur moi" />
...
</html>

Du coup vous ne mettez aucun code PHP dans la partie design / votre template est en XHTML dirrectement et le comportement des données et dans une partie php qu'on nomera le code-behind.

Le principe du code behind est simple, c'est là que vous inter-agissez avec l'interface. Ce code se présente sous la forme d'une classe qui prend en charge à travers des événements l'interface.

Déjà premier point, le PHP n'est pas événementiel, du coup j'ai créé une syntaxe particulière de déclaration de fonctions.

Exemple de ce que ça peut donner :

<?php

class maPage {
function onLoad(&$sender, &$evt) Handle $this->Load {
$this->monBoutton->setTitle('Toto fais du sky');
}
function maFonctionClick(&$sender, &$evt) Handle $this->monBoutton->Click {
$this->monBoutton->setTitle('Hello world !');
}
}

?>

Cette version ne dispose pas d'un ensemble super grand de tags, mais ça viendra au fur et à mesure, dans le même style que la librairie ASP.NET.

Cette version prend déjà en charge :

- Les masters (voir référence en .NET)
Mise en page définissant un ensemble de zones de contenus (les placeholders)

- Les Web User Controls (voir référence en .NET) :
Composants sous forme de code behind et vue html, qu'on peut référencer dans n'importe quelle page.

- Extension du language PHP pour l'orienter en événementielle :
function monClick($sender, $args) Handles $this->btn1->Click {
...
}

- Les custom web controls :
Composants que sous forme de code behind directement chargés dans le framework - plus performants et bas niveau - cette librairie est à compléter et finir

- Fichier de config type web.config :
Permet la configuration du framework - principalement déclare les namespace des custom web controls mais d'autres options vont s'y greffer.

----

Le système est optimisé pour la vitesse d'execution, le moteur d'execution se trouvant au niveau du générateur de cache :

Le système de cache consiste à générer des fichiers PHP à executer, sur le même principe que smarty, du coup j'utilise le moteur php pour simplement interpréter.

Quelques exemples de codes pour voir ce que ça peut donner au niveau syntaxe :

Source / Exemple :



      • LE MASTER :
<?php class DemoMaster { public function onLoad(&$sender, &$evt) Handle $this->Load { $this->menus->setData( array( new MenuItem('demo1.phpx', 'Un simple hello world'), new MenuItem('demo2.phpx', 'Un exemple de formulaire'), new MenuItem('demo3.phpx', 'Affichage de données'), new MenuItem('demo4.phpx', 'Outils de developpement rapide'), new MenuItem('demo5.phpx', 'Ajax en mode simple'), new MenuItem('autres.phpx', 'Goodies ...') ) ); } public function onRenderMenu(&$sender, &$item) Handle $this->sitemap->RenderRow { if ($item->URL == 'demo3.phpx') { $item->TITLE = '--> '.$item->TITLE; $sender->link->setStyle('font-weight', 'bold'); } else { $sender->link->setStyle('font-weight', 'normal'); } } } class MenuItem { public $URL; public $TITLE; public function __construct($url, $title) { $this->URL = $url; $this->TITLE = $title; } } ?> --- SA VUE : <% @MASTER Code="demo.class.php" Class="DemoMaster" %> <% @DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" %> <html> <head> <title> Demo </title> <link href="css/style.css" rel="stylesheet" type="text/css" /> </head> <body> <data:datasource id="menus" type="object" /> <div id="page"> <div> <ul> <view:repeater id="sitemap" source="menus"> <li><a id="link" runat="server" href="{URL}">{$TITLE}</a></li> </view:repeater> </ul> </div> <php:placeholder id="contents" /> </div> </body> </html>
      • LA PAGE D'ACCUEIL :
<% @PAGE master="masters/demo.view.php" %> <% @CACHE timeout="60" %> <% @REGISTER src="usercontrols/xiti.view.php" tagname="xiti" %> <php:content placeholder="contents"> <h1>Hello World</h1> <a name="toto" id="toto" runat="server" href="index.php"> My link </a> <xiti clientid="12346" /> </php:content>
      • Un exemple de Custom Web Control :
<?php class dotView_Web_Form_Button extends dotView_Tag { public function __construct(&$page, &$parent, $id, $tag) { parent::__construct($page, $parent, $id, $tag); $this->getEvents()->declareEvent('click'); $this->getPage()->getEvents()->listen($this, 'run', 'onPageRun'); } public function onPageRun(&$sender, &$evt) { if (isset($_POST[$this->getUID()])) { $this->getEvents()->Click(); } } public function setText($text) { $this->setAttribute('text', $text); } public function getText() { return $this->getAttribute('text'); } public function writeTag(&$writer) { $this->setAttribute('value', $this->getAttribute('text')); $writer->write('<input type="submit" name="'.$this->getUID().'" '); $this->writeAttributes($writer, array('id', 'text')); $writer->write(' />'); } } ?>

Conclusion :


Pour plus de détails ou participer activement à ce projet rendez-vous sur :

http://sourceforge.net/projects/dotview/

Petite astuce importante si vous faites des modifs :

Utilisez dans votre url ?command=clean_cache pour forcer le cache à se régénérer. Une gestion plus fine de la détection des modifs sera mise en place dans les évolutions.

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.