Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

DOTVIEW - THE PHP.NET VIEW STYLE


Information sur la source

Catégorie :Class et Objet ( POO ) Classé sous : DOTVIEW, VUE-CONTROLER, ASP NET, PRADO-LIKE, TEMPLATE Niveau : Initié Date de création : 29/10/2008 Date de mise à jour : 31/10/2008 13:12:28 Vu / téléchargé: 1 843 / 91

Note :
8 / 10 - par 2 personnes
8,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (9)
Ajouter un commentaire et/ou une note

Description

Cliquez pour voir la capture en taille normale
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

  • *** 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(' />');
  • }
  • }
  • ?>
*** 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.


 

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Historique

29 octobre 2008 11:48:57 :
Quelques explications supplémentaires, pour forcer la mise à jour du cache utilisez ?command=clean_cache
31 octobre 2008 13:12:30 :
Simplification de l'explication du projet :)

Commentaires et avis

signaler à un administrateur
Commentaire de aKheNathOn le 31/10/2008 09:41:29

Une 30aine de téléchargements et aucun commentaire ou retour, c'est un site de partage non - vous n'avez aucun avis ou conseil ?

Pourtant y'à plein de trucs à critiquer ou améliorer dans cette version ...

signaler à un administrateur
Commentaire de neigedhiver le 31/10/2008 12:39:33

Salut,

Pour ma part, je n'ai pas encore téléchargé (manque de temps pour regarder de plus près), donc je ne peux pas encore commenter.

Mais avant de m'y mettre, il me manque des informations... Si j'ai quelques notions quant au motif de conception MVC, je ne connais ni .Net, ni Prado... Et j'ai un peu de mal à bien me représenter ce que ta source fait...
Ca a l'air vraiment très intéressant, mais vraiment, je manque de données... Buffer underflow ^^

signaler à un administrateur
Commentaire de aKheNathOn le 31/10/2008 13:18:18

Désolé, en me relisant je me rends compte que mes explications sont rudes.

Le principe de base est simple :

Faire un système de template qui permette de garder le code d'un côté et la présentation de l'autre.

Pour la présentation, c'est que du xml, pas de syntaxe particulière. Les éléments dynamiques de la partie XML sont des balises représentant des composants.

Ces composants sont instanciés lors de l'exécution de la page, et dans la partie code vous pouvez les manipuler comme vous voulez.

Y'à d'autres notions se rapprochant du framework ASP.NET.

Prado (http://www.xisc.com/) est un framework similaire au niveau résultat, mais on utilise pas exactement la même methodo / archi du coup j'ai des perfs plus intéressantes.

signaler à un administrateur
Commentaire de toutphp le 03/11/2008 07:03:58

Alors la c'est génial ! je vais y regarder de plus pres dans la semaine et je vais revenir vers toi pour te noter apres. Deja je sais que je recherche ce genre de truc, mais dès son début pour bien me familiariser avec.

signaler à un administrateur
Commentaire de toutphp le 03/11/2008 21:01:34 8/10

Vraiment excellent :) j'adore.

Si tu cherches quelqu'un pour t'aider je suis preneur !

signaler à un administrateur
Commentaire de DCWeb le 03/11/2008 21:58:54

Tres belle initiative, je regarde ca de pres et je te note

J'aimerai participer au developpement si tu cherches de l'aide

DCWeb

signaler à un administrateur
Commentaire de aKheNathOn le 04/11/2008 10:27:44

Je commençais à désespérer que personne ne soit intéressé par le projet.

Je bosse en parallèle sur un IDE similaire à VS 2005 orienté que pour ce projet et en même temps je fais évoluer le coeur du système - le tout en vue de préparer un CMS reposant dessus : autant dire qu'il y a du taf.

Pour ceux qui le souhaitent, vous pouvez m'aider, le projet est hébergé sur la plateforme collaborative SourceForge - le lien du projet est le suivant :
https://sourceforge.net/projects/dotview/

Pour adhérer au projet n'hésitez pas à me contacter en MP.

signaler à un administrateur
Commentaire de LeFauve42 le 04/11/2008 16:34:37 8/10

C'est un bon challenge auquel tu t'attaques, meme si j'avoue ne pas etre un grand fan de l'aproche ASP.net :o)

Coucou747 : Pour te donner une idee, ca permet de coder comme sur un formulaire "Windows" standard. Par exemple si tu as un <label> (sorte de <span>) avec une visibilite cachee, et un <button> avec un handler "onclick" qui appelle une fonction "toto", tu peux ecrire dans le fichier "code" de ta page quelque chose comme:

void toto()
{
  monlabel.Visibility = true;
}

(generalement en C# ou VB) et ASP.net genere tout seul le HTML qui va avec, et gere tout seul les rechargement de la page (par defaut ca utilise tres peu JS, et dans l'exemple que je donne, un click sur le bouton va recharger la page avec le <label> visible).

Une petite remarque:
<boutton id="monBoutton" title="Clique sur moi" />

C'est "button" en anglais ou "bouton" en francais (bon, je suis mal place pour faire ces remarques avec un clavier sans accents ni cedille mais autant utiliser la bonne syntaxe des le depart :o) )

Sinon, ton projet a l'air plutot bien avance !
Si tu arrives a faire quelque chose avec la plupart des avantages d'ASP.net et sans ses defauts (comme par exemple les cookies de plusieurs centaines de Ko passes dans les deux sens pour garder le contexte de la page) ce sera vraiment cool !
Je te souhaite d'y arriver.

Eric

signaler à un administrateur
Commentaire de aKheNathOn le 04/11/2008 17:16:39

Merci Eric - effectivement je corrigerais tous les commentaires ou textes en français.

Ce qui est relativement "génial" dans ce projet, c'est que contrairement à ASP.NET le coeur du système est ouvert, du coup tu peux t'amuser à faire ce qui te passe par la tête - faisabilité proche du 100%.

Concernant le viewstate, ce n'est pas implémenté pour le moment, va falloir trouver une solution qui ne plomberait pas les perf côté server et qui n'abuserait pas sur la partie client ... du coup je vois pas trop mais je m'y penche activement.

L'avantage de l'approche ASP.NET (ou STRUTS) c'est de créer une couche de gestion unique et normée permettant de REELEMENT modulariser et rationaliser le développement web - mais y'à plein d'autres avantages : environnement événementiel + moteur de templating complet + toolkit de dév ...etc...

Je recherche des passionnés pour me rejoindre sur le projet. N'hésitez pas à m'envoyer un message privé afin que je puisse vous intégrer au projet.

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

Template :: Comment ça marche??? [ par Adagyo ] Salut @ tous,Je souhaiterais proposer au utilisateur plusieurs theme d'affichage de mes page web... Pour cela, j'ai essayé de décortiquer un peux vBul template.inc [ par joedalton ] bonjourVoila, je possede un fichier template.inc qui me permet de définir ma classe template, mais le probleme c'est que ce fichier est valable pour l template aide [ par thedentiste ] Voila est ce que quelqu'un pourrais m'aider pour utlisation de template j'ai chope plein de tuto mais je trouve pas ce qu'il le faut je cherche a fair Template phplib [ par TuXAveRy ] Bonjour,Voila j'ai un problème de logique assez basic :/J'utilise smarty depuis quelque temps déjà et pour des raisons technique je souhaiterais passe php dans template [ par BirD ] hello, une tite question par rapport aux templates : peut -on ins&#233;rer du code&nbsp; php dans le fichier de template et faire que ca fonctionne ? template [ par Urukai1 ] bonjour a tous g une question sur les termplates j'utilise celle de PHPLib en gros j'ai fait un modele de page web a laquelle j'applique des valeurs Comment gérer les boutons submits [ par alaise ] Bonjour,Je cherche &#224; savoir comment je peux faire pour g&#233;rer les boutons submits lorsque j'ai plusieurs formulaires dans une page (template) Prob avec preg_replace() [ par Kevergeek ] Voici mon code : &lt;?php $file = "templates/default/test.tpl"; $template['TITLE'] = "titre"; $template['TEXT'] = "blabla"; $file = file_get_content Récupérer du code d'une page html [ par Metaldark ] Salut ! [;)] Bon, j'explique mon problème : j'ai fait un script qui gere des templates et génére des pages html statiques.Par exemple, le template es probleme liens internes [ par greg975 ] bonjour à tous, debutant en programmation je met sur pieds un petit site. Ainsi j'ai telécharger un template (design) que je veux bien modifier.Le dos


Nos sponsors

Sondage...

CalendriCode