<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Le blog d&#039;Alexandre JULIEN &#187; PHP</title>
	<atom:link href="http://www.alexandre-julien.com/category/php/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.alexandre-julien.com</link>
	<description>blog développement web</description>
	<lastBuildDate>Sun, 27 Jun 2010 21:15:04 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=abc</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Zend Framework #6 : Utilisation de Zend_Navigation</title>
		<link>http://www.alexandre-julien.com/php/zend-framework-php/zend-framework-6-utilisation-de-zend_navigation/</link>
		<comments>http://www.alexandre-julien.com/php/zend-framework-php/zend-framework-6-utilisation-de-zend_navigation/#comments</comments>
		<pubDate>Thu, 25 Mar 2010 15:54:54 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[zend_navigation]]></category>
		<category><![CDATA[zf]]></category>

		<guid isPermaLink="false">http://www.alexandre-julien.com/?p=1197</guid>
		<description><![CDATA[
Il est très utile dans une application Web d&#8217;avoir un système de navigation capable de cartographier les pages d&#8217;un site et d&#8217;en déduire des plan de site, fils d&#8217;arianes, menus, sitemap.xml, &#8230;
Zend_Navigation a été conçu dans cette optique, il propose un système de gestion de pages et des helpers pour générer des composants graphiques.

Nous allons]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><a href="http://www.alexandre-julien.com/wp-content/uploads/2009/09/banner_zf_logo_v1_9.jpg"><img class="aligncenter" title="Zend Framework 1.9.2" src="http://www.alexandre-julien.com/wp-content/uploads/2009/09/banner_zf_logo_v1_9.jpg" alt="banner zf logo v1 9 Zend Framework #6 : Utilisation de Zend Navigation" width="429" height="255" /></a></p>
<p>Il est très utile dans une application Web d&#8217;avoir un système de navigation capable de cartographier les pages d&#8217;un site et d&#8217;en déduire des plan de site, fils d&#8217;arianes, menus, sitemap.xml, &#8230;</p>
<p>Zend_Navigation a été conçu dans cette optique, il propose un système de gestion de pages et des helpers pour générer des composants graphiques.</p>
<p><span id="more-1197"></span></p>
<p>Nous allons voir dans ce tutoriel une façon simple de mettre en place Zend_Navigation :</p>
<p>Tout d&#8217;abord il nous faut définir la navigation et le conteneur de donnée. Dans notre cas, on stockera l&#8217;arborescence dans un fichier XML appellé &#8216;navigation.xml&#8217; dans le répertoire &laquo;&nbsp;config&nbsp;&raquo;.</p>
<pre class="brush: php;">
protected function _initNavigation() {
$this-&gt;bootstrap('layout');
$layout = $this-&gt;getResource('layout');
$view = $layout-&gt;getView();
$config = new Zend_Config_Xml(APPLICATION_PATH . '/configs/navigation.xml', 'nav');
$container = new Zend_Navigation($config);
$view-&gt;navigation($container);
}
&lt;div&gt;
</pre>
<p>Ensuite, on remplit le fichier &laquo;&nbsp;navigation.xml&nbsp;&raquo; pour créer notre navigation, on y indiquera la page d&#8217;accueil et une page de listing.<br />
On se basera sur le système de routes pour donner le lien.</p>
<pre class="brush: xml;">
&lt;configdata&gt;
 &lt;nav&gt;
 &lt;home&gt;
 &lt;label&gt;Accueil&lt;/label&gt;
 &lt;route&gt;index&lt;/route&gt;
 &lt;pages&gt;
 &lt;listing&gt;
 &lt;label&gt;Liste CRUD&lt;/label&gt;
 &lt;route&gt;listing&lt;/route&gt;
 &lt;/listing&gt;
&lt;/pages&gt;
&lt;/home&gt;
&lt;/nav&gt;
&lt;/configdata&gt;
</pre>
<p>Et voilà la mise en place de Zend_Navigation est fini. Il ne vous reste plus qu&#8217;à utiliser des helpers pour appeler vos composants :<br />
Pour le breadcrumb par exemple :</p>
<pre class="brush: php;">
$this-&gt;navigation()-&gt;breadcrumbs()-&gt;setSeparator(&quot; -&gt; &quot;);
</pre>
<p>Il existe d&#8217;autres façon d&#8217;intégrer Zend_Navigation sur une application notamment en intervenant directement sur le code. Cette méthode reste très simple mais très fonctionnelle. On y pourra voir des améliorations comme mettre en place un cache pour augmenter les performances.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.alexandre-julien.com/php/zend-framework-php/zend-framework-6-utilisation-de-zend_navigation/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Documentation PHP accessible depuis Google Chrome grâce à une petite extension</title>
		<link>http://www.alexandre-julien.com/navigateurs/documentation-php-accessible-depuis-google-chrome-grace-a-une-petite-extension/</link>
		<comments>http://www.alexandre-julien.com/navigateurs/documentation-php-accessible-depuis-google-chrome-grace-a-une-petite-extension/#comments</comments>
		<pubDate>Tue, 23 Mar 2010 20:50:10 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Navigateurs]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[documentation]]></category>
		<category><![CDATA[extension]]></category>
		<category><![CDATA[google chrome]]></category>

		<guid isPermaLink="false">http://www.alexandre-julien.com/?p=1187</guid>
		<description><![CDATA[Voici une petite extension sympa sur le navigateur Google Chrome : il s&#8217;agit d&#8217;un petit moteur de recherche sur le site PHP.net permettant d&#8217;accéder directement à la documentation officielle de PHP à partir du navigateur. Tout bête, mais très pratique !
L&#8217;extension est téléchargeable à cette adresse : https://chrome.google.com/extensions/detail/kfiahljocaflpaiopilgpiochncgdnhd
Les résultats de recherche sont identiques à ceux]]></description>
			<content:encoded><![CDATA[<p>Voici une petite extension sympa sur le navigateur Google Chrome : il s&#8217;agit d&#8217;un petit moteur de recherche sur le site PHP.net permettant d&#8217;accéder directement à la documentation officielle de PHP à partir du navigateur. Tout bête, mais très pratique !</p>
<p>L&#8217;extension est téléchargeable à cette adresse : <a href="https://chrome.google.com/extensions/detail/kfiahljocaflpaiopilgpiochncgdnhd">https://chrome.google.com/extensions/detail/kfiahljocaflpaiopilgpiochncgdnhd</a></p>
<p><a href="http://www.alexandre-julien.com/wp-content/uploads/2010/03/Chrome-PHP-Documentation.png"><img class="aligncenter size-medium wp-image-1190" title="Chrome PHP Documentation" src="http://www.alexandre-julien.com/wp-content/uploads/2010/03/Chrome-PHP-Documentation-331x200.png" alt="Chrome PHP Documentation 331x200 Documentation PHP accessible depuis Google Chrome grâce à une petite extension" width="331" height="200" /></a><span id="more-1187"></span>Les résultats de recherche sont identiques à ceux du moteur de recherche de PHP.NET</p>
<p><a href="http://www.alexandre-julien.com/wp-content/uploads/2010/03/Chrome-PHP-Documentation-Result.png"><img class="aligncenter size-medium wp-image-1191" title="Chrome PHP Documentation Result" src="http://www.alexandre-julien.com/wp-content/uploads/2010/03/Chrome-PHP-Documentation-Result-340x200.png" alt="Chrome PHP Documentation Result 340x200 Documentation PHP accessible depuis Google Chrome grâce à une petite extension" width="340" height="200" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.alexandre-julien.com/navigateurs/documentation-php-accessible-depuis-google-chrome-grace-a-une-petite-extension/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>HipHop : quand Facebook revoit la runtime de PHP avec un compilateur C++ &#8230;</title>
		<link>http://www.alexandre-julien.com/php/hiphop-quand-facebook-revoit-la-runtime-de-php-avec-un-compilateur-c/</link>
		<comments>http://www.alexandre-julien.com/php/hiphop-quand-facebook-revoit-la-runtime-de-php-avec-un-compilateur-c/#comments</comments>
		<pubDate>Wed, 03 Feb 2010 10:21:31 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Facebook]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Réseaux sociaux]]></category>
		<category><![CDATA[c++]]></category>
		<category><![CDATA[compilateur]]></category>
		<category><![CDATA[facebook]]></category>
		<category><![CDATA[g++]]></category>
		<category><![CDATA[hiphop]]></category>
		<category><![CDATA[runtime]]></category>

		<guid isPermaLink="false">http://www.alexandre-julien.com/?p=1161</guid>
		<description><![CDATA[
Une rumeur circule depuis quelques temps, à propos d&#8217;une ré-inventation de PHP par Facebook pour optimiser les performances de leurs applications. Cette dernière a été désormais par la firme, un ingénieur a travaillé sur une refonte de la runtime de PHP afin d&#8217;avoir un résultat compilé et non plus interprété comme c&#8217;est le cas actuellement]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.alexandre-julien.com/wp-content/uploads/2010/02/facebook.jpg"><img class="aligncenter size-full wp-image-1169" title="facebook" src="http://www.alexandre-julien.com/wp-content/uploads/2010/02/facebook.jpg" alt="facebook HipHop : quand Facebook revoit la runtime de PHP avec un compilateur C++ ..." width="640" height="212" /></a></p>
<p>Une rumeur circule depuis quelques temps, à propos d&#8217;une ré-inventation de PHP par Facebook pour optimiser les performances de leurs applications. Cette dernière a été désormais par la firme, un ingénieur a travaillé sur une refonte de la runtime de PHP afin d&#8217;avoir un résultat compilé et non plus interprété comme c&#8217;est le cas actuellement avec la runtime de Zend.</p>
<p>Le projet s&#8217;appelle HipHop et il s&#8217;appuie non pas sur un compilateur mais plutôt sur un transcodeur qui permet de passer d&#8217;un code PHP à un code C++ très optimisé et ce dernier pouvant être compilé avec g++.</p>
<p>Ce travail a mis plus de 2 ans avant de voir le jour et ce travail verra le jour très bientôt dans un projet Open Source sous licence Creative-Commons.</p>
<p><span id="more-1161"></span></p>
<p>Voici le processus de HipPop pour optimiser une application PHP :</p>
<p style="text-align: center;"><a href="http://www.alexandre-julien.com/wp-content/uploads/2010/02/HipHop_transformation_process.png"><img class="aligncenter size-full wp-image-1165" title="HipHop_transformation_process" src="http://www.alexandre-julien.com/wp-content/uploads/2010/02/HipHop_transformation_process.png" alt="HipHop transformation process HipHop : quand Facebook revoit la runtime de PHP avec un compilateur C++ ..." width="645" height="403" /></a></p>
<p>Il s&#8217;agit d&#8217;une transformation de code qui part de sources PHP, le code est parsé et ensuite optimisé avant d&#8217;être traduit en C++. Le code C++ est lui aussi optimiser et ensuite il est compilé via G++ en langage machine.</p>
<p>Certaines fonctions trop gourmande comme &laquo;&nbsp;eval()&nbsp;&raquo; ne seront pas supportées mais la globalité du langage est supportée.</p>
<p>Les essais de Facebook révèleraient un gain de performance de l&#8217;ordre de 80 % coté processeur et l&#8217;application Facebook elle-même devrait migrer sur cette technologie d&#8217;ici quelques semaines ou quelques mois. Ils devraient réduire de 50 % l&#8217;utilisation du CPU pour héberger Facebook ce qui constitue une économie intéressante puisqu&#8217;au dernières nouvelles Facebook, utiliserait plus 30 000 machines pour héberger son réseau social.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.alexandre-julien.com/php/hiphop-quand-facebook-revoit-la-runtime-de-php-avec-un-compilateur-c/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Zend Framework #5 : Routing et UrlRewriting avec Zend_Controller</title>
		<link>http://www.alexandre-julien.com/php/zend-framework-php/zend-framework-5-routing-et-urlrewriting-avec-zend_controller/</link>
		<comments>http://www.alexandre-julien.com/php/zend-framework-php/zend-framework-5-routing-et-urlrewriting-avec-zend_controller/#comments</comments>
		<pubDate>Mon, 18 Jan 2010 18:57:51 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[Bootstrap]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Router]]></category>
		<category><![CDATA[UrlRewriting]]></category>
		<category><![CDATA[zend_controller]]></category>
		<category><![CDATA[zf]]></category>

		<guid isPermaLink="false">http://www.alexandre-julien.com/?p=1147</guid>
		<description><![CDATA[Un point essentiel à ne pas négliger sur une application Web est la ré-écriture d&#8217;URL via un système de routeur. Pourquoi ré-écrire des Urls alors que l&#8217;utilisateur n&#8217;en tape jamais directement ? Et bien tout simplement, parce que l&#8217;utilisateur ne comprend pas forcement où il se trouve sur le site en regardant une Url de]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.alexandre-julien.com/wp-content/uploads/2009/09/banner_zf_logo_v1_9.jpg"><img class="aligncenter size-full wp-image-685" title="Zend Framework 1.9.2" src="http://www.alexandre-julien.com/wp-content/uploads/2009/09/banner_zf_logo_v1_9.jpg" alt="banner zf logo v1 9 Zend Framework #5 : Routing et UrlRewriting avec Zend Controller"  /></a>Un point essentiel à ne pas négliger sur une application Web est la ré-écriture d&#8217;URL via un système de routeur. Pourquoi ré-écrire des Urls alors que l&#8217;utilisateur n&#8217;en tape jamais directement ? Et bien tout simplement, parce que l&#8217;utilisateur ne comprend pas forcement où il se trouve sur le site en regardant une Url de type &laquo;&nbsp;index.php?category=43&amp;id=32&amp;session=ad4zcf43lpo&amp;page=322214421&#8243;. Une url comme &laquo;&nbsp;maboutique.com/composants/processeurs/intel/liste-des-processeurs.html&nbsp;&raquo; est beaucoup plus parlante.</p>
<p>La preuve c&#8217;est qu&#8217; il s&#8217;agit du 3ème point qui influe le plus le référencement d&#8217;une page. Et puis on peut également avoir besoin internationaliser ses urls.</p>
<p>Zend Framework possède un routeur, qui permet de manipuler plus facilement les liens entre les pages au sein d&#8217;une application et également de faire de la réécriture.</p>
<p>Cette étape se fait au sein du Bootstrap d&#8217;une application Zend Framework et grâce à Zend_Controller.</p>
<p><span id="more-1147"></span></p>
<p>Il faut tout d&#8217;abord surcharger la méthode _initAutoLoad() du Bootstrap et récupérer l&#8217;instance de Zend_Controller</p>
<pre class="brush: php;">

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap {

// Surcharge de _initAutoLoad
protected function _initAutoload()

{
$moduleLoader = new Zend_Application_Module_Autoloader(array('namespace'=&gt;'', 'basePath'=&gt;APPLICATION_PATH));

$frontController = Zend_Controller_Front::getInstance();
$router = $frontController-&gt;getRouter();

return $moduleLoader;
}

}
</pre>
<p>Ensuite il suffit simplement de créer ses routes et de les rajouter au routeur du contrôleur.<br />
Pour cela on a plusieurs possibilités, on peut créer des routes statiques, des routes basées sur les modules, etc &#8230;<br />
Le plus efficace est de créer des routes à partir d&#8217;URL pré-formatées grâce à des expressions régulières.<br />
On devra donc créer des instances de la classe Zend_Controller_Router_Route_Regex.</p>
<p>On la construira avec les arguments suivants :</p>
<p>1) La route : sous forme d&#8217;expression régulière (exemple : &#8216;produits/(.+)/(.+)/article-(.+)-(.+).html&#8217;)<br />
2) Le lien MVC : il faut donner les éléments statiques pour accéder à la page, c&#8217;est à dire le module, le contrôleur et l&#8217;action cible (exemple : array(&#8216;module&#8217; =&gt; &#8216;default&#8217;, &#8216;controller&#8217; =&gt; &#8216;products&#8217;, &#8216;action&#8217; =&gt; &#8217;showProduct&#8217;))<br />
3)Le mapping des paramètre : on donne dans l&#8217;ordre le nom des paramètres que l&#8217;on passera dans l&#8217;Url (exemple : array(1 =&gt; &#8216;category&#8217;, 2=&gt; &#8217;subcategory&#8217;, 3 =&gt; &#8216;product_title&#8217;, 4 =&gt; &#8216;product_ref&#8217;))<br />
4) Le chemin inverse : une version de l&#8217;url interprétable par la fonction sprintf() de PHP (exemple : &#8216;produits/%s/%s/article-%s-%d.html&#8217;)</p>
<pre class="brush: php;">

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap {

// Surcharge de _initAutoLoad
protected function _initAutoload()

{
$moduleLoader = new Zend_Application_Module_Autoloader(array('namespace'=&gt;'', 'basePath'=&gt;APPLICATION_PATH));

$frontController = Zend_Controller_Front::getInstance();
$router = $frontController-&gt;getRouter();

// Nouvelle route pour accéder à produit
$article = new Zend_Controller_Router_Route_Regex(
 'produits/(.+)/(.+)/article-(.+)-(.+).html',
 array('module' =&gt; 'default', 'controller' =&gt; 'products', 'action' =&gt; 'showProduct'),
 array(1 =&gt; 'category', 2=&gt; 'subcategory', 3 =&gt; 'product_title', 4 =&gt; 'product_ref'),
 'produits/%s/%s/article-%s-%d.html');
$router-&gt;addRoute($article);

return $moduleLoader;
}

}
</pre>
<p>Ainsi on pourra créer et appeler une url de type : &laquo;&nbsp;www.maboutique.com/produits/processeurs/dual-core/article-intelcore2duo-PI5421.html&nbsp;&raquo;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.alexandre-julien.com/php/zend-framework-php/zend-framework-5-routing-et-urlrewriting-avec-zend_controller/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Netbeans 6.8 : IDE pour développement PHP Symfony</title>
		<link>http://www.alexandre-julien.com/php/symfony/netbeans-6-8-ide-pour-developpement-php-symfony/</link>
		<comments>http://www.alexandre-julien.com/php/symfony/netbeans-6-8-ide-pour-developpement-php-symfony/#comments</comments>
		<pubDate>Sat, 26 Dec 2009 09:40:03 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[IDE]]></category>
		<category><![CDATA[NetBeans]]></category>
		<category><![CDATA[Symfony]]></category>
		<category><![CDATA[développement]]></category>
		<category><![CDATA[Framework]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.alexandre-julien.com/?p=962</guid>
		<description><![CDATA[
A l&#8217;heure où les environnements de développement pour PHP sont majoritairement basé sur Eclipse : PHP Development Tools, Aptana et Zend Studio, Netbeans quant à lui se faisait très discret dans le domaine des IDE PHP.
Voici la nouvelle version de NetBeans en release 6.8 avec des outils de développement pour PHP 5 fort intéressants :
Tout]]></description>
			<content:encoded><![CDATA[<p><img class="aligncenter size-full wp-image-963" title="Netbeans68_logo" src="http://www.alexandre-julien.com/wp-content/uploads/2009/12/Netbeans68_logo.png" alt="Netbeans68 logo Netbeans 6.8 : IDE pour développement PHP Symfony"  /></p>
<p>A l&#8217;heure où les environnements de développement pour PHP sont majoritairement basé sur Eclipse : PHP Development Tools, Aptana et Zend Studio, Netbeans quant à lui se faisait très discret dans le domaine des IDE PHP.</p>
<p>Voici la nouvelle version de NetBeans en release 6.8 avec des outils de développement pour PHP 5 fort intéressants :</p>
<p><strong>Tout d&#8217;abord il existe une version de l&#8217;IDE entièrement dédié au développement PHP comme c&#8217;est le cas de la version All-In-One d&#8217;Eclipse.</strong></p>
<p><strong>- Il supporte également la version 5.3 de PHP</strong></p>
<p><strong>- Débugage de PHP dans l&#8217;IDE</strong></p>
<p><strong>- Exécution et pilotage de test-unitaires mis en place avec PHPUnit</strong></p>
<p><strong>- Support du Framework Symfony (autocompletion, exécution d&#8217;actions en ligne de commande depuis une console dans l&#8217;ide, support du YAML, &#8230;)</strong></p>
<p>Nous allons nous intéresser au support de Symfony dans l&#8217;IDE et voir si son usage facile le développement avec le framework PHP français !</p>
<p><span id="more-962"></span></p>
<p style="text-align: center;"><a href="http://www.alexandre-julien.com/wp-content/uploads/2009/12/Netbeans_1_capture1.png"><img class="aligncenter size-large wp-image-983" title="Netbeans_1_capture" src="http://www.alexandre-julien.com/wp-content/uploads/2009/12/Netbeans_1_capture1-1024x612.png" alt="Netbeans 1 capture1 1024x612 Netbeans 6.8 : IDE pour développement PHP Symfony" width="614" height="367" /></a></p>
<p style="text-align: left;">L&#8217;interface de NetBeans 6.8 est relativement simple, ergonome et traduite dans toutes les langues pour les non-anglophones.</p>
<p style="text-align: left;">
<h2 style="text-align: left;"><span style="text-decoration: underline;">1. Paramétrage de NetBeans pour PHP</span></h2>
<p>Le paramétrage de NetBeans se fait en 3 étapes :</p>
<p>- Le chemin de l&#8217;exécutable &laquo;&nbsp;php.exe&nbsp;&raquo;<br />
- Le chemin du script de PHPUnit (facultatif)<br />
- Le chemin de la sandbox de symfony (symfony.bat ou symfony.sh)</p>
<p><a href="http://www.alexandre-julien.com/wp-content/uploads/2009/12/config_php.png"><img class="aligncenter size-full wp-image-978" title="config_php" src="http://www.alexandre-julien.com/wp-content/uploads/2009/12/config_php.png" alt="config php Netbeans 6.8 : IDE pour développement PHP Symfony" width="757" height="648" /></a></p>
<p>Vous devez spécifier le chemin de votre serveur PHP, c&#8217;est à dire<strong> l&#8217;emplacement du &laquo;&nbsp;php.exe&nbsp;&raquo;</strong> de votre installation pour utiliser les fonctions de débugage, compilation et exécution de code PHP en &laquo;&nbsp;Command Line Interface&nbsp;&raquo;. Dans mon exemple, je donne le chemin d&#8217;accès de mon installation WAMP.</p>
<p><a href="http://www.alexandre-julien.com/wp-content/uploads/2009/12/config_symfony_sandbox.png"><img class="aligncenter size-full wp-image-980" title="config_symfony_sandbox" src="http://www.alexandre-julien.com/wp-content/uploads/2009/12/config_symfony_sandbox.png" alt="config symfony sandbox Netbeans 6.8 : IDE pour développement PHP Symfony" width="759" height="643" /></a></p>
<p>En suite, il vous faudra spécifier le chemin d&#8217;accès à la sandbox de Symfony, sous Windows il s&#8217;agit du fichier <strong>&laquo;&nbsp;symfony.bat&nbsp;&raquo;</strong>.</p>
<h2><span style="text-decoration: underline;">2. Création de votre projet Symfony</span></h2>
<p><a href="http://www.alexandre-julien.com/wp-content/uploads/2009/12/project_step0.png"><img class="aligncenter size-full wp-image-987" title="project_step0" src="http://www.alexandre-julien.com/wp-content/uploads/2009/12/project_step0.png" alt="project step0 Netbeans 6.8 : IDE pour développement PHP Symfony" width="728" height="501" /></a></p>
<p>Pour créer votre projet Symfony, rien de plus simple, il suffit d&#8217;aller sur <strong>&laquo;&nbsp;Fichier -&gt; Nouveau Projet&nbsp;&raquo;</strong> et de créer un nouveau projet <strong>&laquo;&nbsp;Application PHP&nbsp;&raquo;</strong>.</p>
<p><a href="http://www.alexandre-julien.com/wp-content/uploads/2009/12/project_step1.png"><img class="aligncenter size-full wp-image-988" title="project_step1" src="http://www.alexandre-julien.com/wp-content/uploads/2009/12/project_step1.png" alt="project step1 Netbeans 6.8 : IDE pour développement PHP Symfony" width="723" height="499" /></a></p>
<p>Donnez ensuite, un nom à votre projet, sélectionnez la version de PHP utilisée, dans notre cas, on pourra se contenter de la version 5.2.x.<br />
<span style="color: #ff0000;">N&#8217;oublier pas de donner le répertoire contenant le code source  du framework Symfony cela fonctionne avec n&#8217;importe quelle version du framework à priori sauf peut être pour la version en développement 2.0.</span></p>
<p><a href="http://www.alexandre-julien.com/wp-content/uploads/2009/12/project_step2.png"><img class="aligncenter size-full wp-image-989" title="project_step2" src="http://www.alexandre-julien.com/wp-content/uploads/2009/12/project_step2.png" alt="project step2 Netbeans 6.8 : IDE pour développement PHP Symfony" width="730" height="501" /></a></p>
<p>Pour ce qui est de la configuration de l&#8217;environnement de production pour le déploiement, nous n&#8217;avons pas à nous en soucier. On se contentera d&#8217;un environnement serveur en local.</p>
<p><a href="http://www.alexandre-julien.com/wp-content/uploads/2009/12/project_laststep.png"><img class="aligncenter size-full wp-image-990" title="project_laststep" src="http://www.alexandre-julien.com/wp-content/uploads/2009/12/project_laststep.png" alt="project laststep Netbeans 6.8 : IDE pour développement PHP Symfony" width="731" height="497" /></a></p>
<p>Enfin on pourra spécifier que l&#8217;on veut utiliser le framework Symfony et que l&#8217;on veut générer une application &laquo;&nbsp;frontend&nbsp;&raquo; (application web principale destinée aux visiteurs du site) et une application &laquo;&nbsp;backend&nbsp;&raquo; (application dédiée à l&#8217;administration et au backoffice de l&#8217;application principale).</p>
<h2><span style="text-decoration: underline;">3. Dans la pratique</span></h2>
<p><a href="http://www.alexandre-julien.com/wp-content/uploads/2009/12/netbeans_symfony_capture.png"><img class="aligncenter size-large wp-image-992" title="netbeans_symfony_capture" src="http://www.alexandre-julien.com/wp-content/uploads/2009/12/netbeans_symfony_capture-1024x401.png" alt="netbeans symfony capture 1024x401 Netbeans 6.8 : IDE pour développement PHP Symfony" width="1024" height="401" /></a></p>
<p>Voici comment se présente notre projet Symfony sous Netbeans 6.8. Nous avons un très bon éditeur de YML / YAML avec coloration syntaxique, autocompletion et schéma hiérarchique</p>
<p>On pourra également utiliser l&#8217;outil de génération de code en ligne de commande de Symfony en allant sur &laquo;&nbsp;MySymfonyProject -&gt; click-droit -&gt; Run Symfony Command&nbsp;&raquo;.</p>
<p><a href="http://www.alexandre-julien.com/wp-content/uploads/2009/12/symfony_cli.png"><img class="aligncenter size-full wp-image-995" title="symfony_cli" src="http://www.alexandre-julien.com/wp-content/uploads/2009/12/symfony_cli.png" alt="symfony cli Netbeans 6.8 : IDE pour développement PHP Symfony" width="687" height="538" /></a></p>
<p>On a le résultat de l&#8217;exécution de la ligne de commande dans le partie console de NetBeans cet outil est très pratique pour exécuter les tests-unitaires de LIME le framework de test intégré à Symfony.</p>
<p>On niveau du développement &laquo;&nbsp;pur&nbsp;&raquo;, on constate que l&#8217;autocompletion répond bien à la plupart des besoins de développeurs : les objets des vues, contrôleurs comme $sfWebRequest, $sfWebResponse, $view peuvent être appeler sans problème avec une intelliSense et même avec une petite documentation.</p>
<p><a href="http://www.alexandre-julien.com/wp-content/uploads/2009/12/symfony_autocomplete.png"><img class="aligncenter size-full wp-image-1000" title="symfony_autocomplete" src="http://www.alexandre-julien.com/wp-content/uploads/2009/12/symfony_autocomplete.png" alt="symfony autocomplete Netbeans 6.8 : IDE pour développement PHP Symfony" width="532" height="323" /></a></p>
<h2><span style="text-decoration: underline;"><strong>Conclusion</strong></span></h2>
<p>Ce support du framework Symfony est très intéressant à la fois pour la communauté des développeurs Symfony mais aussi pour NetBeans qui pourra peut être se faire une meilleure réputation dans le développement PHP car il faut le rappeler Symfony est le framework de développement PHP le plus utilisé avec Zend Framework . Les fonctionnalités de NetBeans vis à vis de ce framework sont très basiques mais relativement utiles. On regrettera peut être une meilleure intégration du framework de test unitaire et une génération de code plus importante. Peut-être vaut-il le coup d&#8217;être utiliser à la place d&#8217;Eclipse ou Aptana dans une optique de développement Symfony ? Ou aurons-nous du mal à nous séparer de nos bons vieux plugins sur Eclipse (pour Subversion, Database Explorer, PDT, Smarty, jQuery) ? Pour ma part, NetBeans a gagné ma confiance, je lui trouve une bonne ergonomie et une grande simplicité d&#8217;utilisation. Il existe une autre solution  pour le support de Symfony mais qui est quant-à-elle payante : il s&#8217;agit de PHPEdit il faut compter environ 219€ pour une version avec le support de Symfony et presque 300 € pour le support de PHPUnit et SVN.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.alexandre-julien.com/php/symfony/netbeans-6-8-ide-pour-developpement-php-symfony/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Aptana PHP Theme : mon petit thème de coloration syntaxique et d&#039;indentation sur Aptana Studio</title>
		<link>http://www.alexandre-julien.com/php/ide/aptana-studio/aptana-php-theme-mon-petit-theme-de-coloration-syntaxique-et-dindentation-sur-aptana-studio/</link>
		<comments>http://www.alexandre-julien.com/php/ide/aptana-studio/aptana-php-theme-mon-petit-theme-de-coloration-syntaxique-et-dindentation-sur-aptana-studio/#comments</comments>
		<pubDate>Tue, 06 Oct 2009 20:17:09 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Aptana Studio]]></category>
		<category><![CDATA[aptana]]></category>
		<category><![CDATA[color]]></category>
		<category><![CDATA[studio]]></category>
		<category><![CDATA[syntax]]></category>
		<category><![CDATA[thème]]></category>

		<guid isPermaLink="false">http://www.alexandre-julien.com/?p=916</guid>
		<description><![CDATA[Voici une petite coloration syntaxique et une norme d&#8217;indentation que j&#8217;ai personnalisé avec Aptana Studio. J&#8217;ai décidé de la faire partager au cas où quelqu&#8217;un serait à la recherche d&#8217;une idée de thème.
Aptana PHP Theme
]]></description>
			<content:encoded><![CDATA[<p>Voici une petite coloration syntaxique et une norme d&#8217;indentation que j&#8217;ai personnalisé avec Aptana Studio. J&#8217;ai décidé de la faire partager au cas où quelqu&#8217;un serait à la recherche d&#8217;une idée de thème.</p>
<p><a href="http://www.alexandre-julien.com/wp-content/uploads/2009/10/Aptana-PHP-Theme.zip">Aptana PHP Theme</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.alexandre-julien.com/php/ide/aptana-studio/aptana-php-theme-mon-petit-theme-de-coloration-syntaxique-et-dindentation-sur-aptana-studio/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Phoogle Map : release 2.1, nouveaux exemples, sources, compatibilité PHP 5.3</title>
		<link>http://www.alexandre-julien.com/php/phoogle-map/phoogle-map-release-2-1-nouveaux-exemples-sources-compatibilite-php-5-3/</link>
		<comments>http://www.alexandre-julien.com/php/phoogle-map/phoogle-map-release-2-1-nouveaux-exemples-sources-compatibilite-php-5-3/#comments</comments>
		<pubDate>Sun, 04 Oct 2009 20:55:08 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Phoogle Map]]></category>
		<category><![CDATA[google map api]]></category>
		<category><![CDATA[GoogleMap]]></category>
		<category><![CDATA[library]]></category>
		<category><![CDATA[Phoogle]]></category>
		<category><![CDATA[PhoogleMap]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.alexandre-julien.com/?p=903</guid>
		<description><![CDATA[ Nouvelle version de Phoogle Map 2.1 toujours basée sur l&#8217;API Google Map en version 2.0, cette nouvelle version offre une compatibilité avec PHP 5.3.
La sortie de cette nouvelle version s&#8217;accompagne d&#8217;une amélioration de la rubrique PhoogleMap sur le site avec des exemples téléchargeables, des sources mises à jour, une présentation approfondie, une PHP Doc]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.alexandre-julien.com/wp-content/uploads/2009/07/fbc_wide.png"><img class="alignleft size-medium wp-image-864" title="PhoogleMap" src="http://www.alexandre-julien.com/wp-content/uploads/2009/07/fbc_wide-300x188.png" alt="PhoogleMap" width="300" height="188" /></a> Nouvelle version de Phoogle Map 2.1 toujours basée sur l&#8217;API Google Map en version 2.0, cette nouvelle version offre une compatibilité avec PHP 5.3.</p>
<p>La sortie de cette nouvelle version s&#8217;accompagne d&#8217;une amélioration de la rubrique PhoogleMap sur le site avec des exemples téléchargeables, des sources mises à jour, une présentation approfondie, une PHP Doc en anglais, et des nouvelles ressources.</p>
<p>Très prochainement, je rajouterai une documentation complète en français et en anglais ainsi que de nouveaux exemples.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.alexandre-julien.com/php/phoogle-map/phoogle-map-release-2-1-nouveaux-exemples-sources-compatibilite-php-5-3/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Aptana : un IDE orienté développement Web 2.0 pour PHP, Python, Ruby On Rails</title>
		<link>http://www.alexandre-julien.com/php/ide/aptana-un-ide-oriente-developpement-web-2-0-pour-php-python-ruby-on-rails/</link>
		<comments>http://www.alexandre-julien.com/php/ide/aptana-un-ide-oriente-developpement-web-2-0-pour-php-python-ruby-on-rails/#comments</comments>
		<pubDate>Sat, 03 Oct 2009 16:01:33 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[IDE]]></category>
		<category><![CDATA[Adobe Spry]]></category>
		<category><![CDATA[aptana]]></category>
		<category><![CDATA[Dojo]]></category>
		<category><![CDATA[eclipse]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[Mootools]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Prototype]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[ruby on rails]]></category>
		<category><![CDATA[sdk]]></category>

		<guid isPermaLink="false">http://www.alexandre-julien.com/?p=824</guid>
		<description><![CDATA[
Aptana Studio est un IDE (Environnement de Développement orienté) Web 2.0 et basé sur les fondations d&#8217;Eclipse. Son principal avantage est qu&#8217;il n&#8217;utilise pas les plugin&#8217;s traditionnels d&#8217;Eclipse au profit de plugin&#8217;s développés par aptana qui sont beaucoup plus performants et plus astucieux.
Le logiciel est un environnement complet pour :
- PHP (sans passer le PDT]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.alexandre-julien.com/wp-content/uploads/2009/10/AptanaStudioProfessional.JPG"><img class="aligncenter size-full wp-image-825" title="AptanaStudioProfessional" src="http://www.alexandre-julien.com/wp-content/uploads/2009/10/AptanaStudioProfessional.JPG" alt=" Aptana : un IDE orienté développement Web 2.0 pour PHP, Python, Ruby On Rails" width="500" height="158" /></a></p>
<p>Aptana Studio est un IDE (Environnement de Développement orienté) Web 2.0 et basé sur les fondations d&#8217;Eclipse. Son principal avantage est qu&#8217;il n&#8217;utilise pas les plugin&#8217;s traditionnels d&#8217;Eclipse au profit de plugin&#8217;s développés par aptana qui sont beaucoup plus performants et plus astucieux.</p>
<p>Le logiciel est un environnement complet pour :</p>
<p>- PHP (sans passer le PDT d&#8217;Eclipse)</p>
<p>- Ruby On Rails</p>
<p>- Python Web</p>
<p>- Framework Javascript : jQuery, Prototype, Mootools, Adobe Spry, Dojo, &#8230;</p>
<p>- Javascript, HTML, CSS</p>
<p>- Application Adobe Air, Flex, &#8230;</p>
<p><span id="more-824"></span></p>
<p><a href="http://www.alexandre-julien.com/wp-content/uploads/2009/10/Aptana.png"><img class="aligncenter size-large wp-image-826" title="Aptana" src="http://www.alexandre-julien.com/wp-content/uploads/2009/10/Aptana-1024x640.png" alt="Aptana 1024x640 Aptana : un IDE orienté développement Web 2.0 pour PHP, Python, Ruby On Rails" width="1024" height="640" /></a></p>
<p>De plus, vous pourrez installer tous vos plugins préférés sur Aptana ou bien inversement, installer les plugins d&#8217;Aptana sur votre Eclipse existant !</p>
<p>Aptana est totalement libre et disponible sur Windows, MacOS X, Linux. Certaines personnes pourront également le coupler à une version 64 bits d&#8217;Eclipse sous Linux.</p>
<p>Rendez-vous sur le site Officiel : <a title="Aptana.com" href="http://www.aptana.com" target="_blank">http://www.aptana.com</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.alexandre-julien.com/php/ide/aptana-un-ide-oriente-developpement-web-2-0-pour-php-python-ruby-on-rails/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Joomla! API Framework MVC 1.5 : création d&#039;une application (tuto CRUD)</title>
		<link>http://www.alexandre-julien.com/php/joomla/joomla-api-framework-mvc-1-5-creation-dune-application-tuto-crud/</link>
		<comments>http://www.alexandre-julien.com/php/joomla/joomla-api-framework-mvc-1-5-creation-dune-application-tuto-crud/#comments</comments>
		<pubDate>Mon, 21 Sep 2009 19:38:00 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Joomla]]></category>
		<category><![CDATA[application]]></category>
		<category><![CDATA[cmf]]></category>
		<category><![CDATA[CMS]]></category>
		<category><![CDATA[component]]></category>
		<category><![CDATA[composant]]></category>
		<category><![CDATA[crud]]></category>
		<category><![CDATA[Framework]]></category>
		<category><![CDATA[MVC]]></category>
		<category><![CDATA[tuto]]></category>
		<category><![CDATA[tutoriel]]></category>

		<guid isPermaLink="false">http://www.alexandre-julien.com/?p=790</guid>
		<description><![CDATA[
Voici un tutorial pour créer une application &#171;&#160;composant&#160;&#187; sur Joomla! grâce à la nouvelle API basé sur Joomla framework MVC 1.5
Le gros avantage de la version 1.5 par rapport à la version 1.0, c&#8217;est qu&#8217;elle propose une API bien mieux construire et rend beaucoup plus agréable le développement d&#8217;applications. Le nouveau framework est basé sur]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.alexandre-julien.com/wp-content/uploads/2009/09/joomla-logo-vert-color.png"><img class="aligncenter size-full wp-image-794" title="Joomla! Api" src="http://www.alexandre-julien.com/wp-content/uploads/2009/09/joomla-logo-vert-color.png" alt="Joomla! Api" width="500" height="342" /></a></p>
<p>Voici un tutorial pour créer une application &laquo;&nbsp;composant&nbsp;&raquo; sur Joomla! grâce à la nouvelle API basé sur Joomla framework MVC 1.5</p>
<p>Le gros avantage de la version 1.5 par rapport à la version 1.0, c&#8217;est qu&#8217;elle propose une API bien mieux construire et rend beaucoup plus agréable le développement d&#8217;applications. Le nouveau framework est basé sur le design-pattern MVC bien que la couche modèle est quelque peu inutile, étant donné que Joomla 1.5 ne fonctionne avec rien d&#8217;autre que MySQL, cela dit, on a le choix entre les drivers &laquo;&nbsp;mysql&nbsp;&raquo; ou &laquo;&nbsp;mysqli&nbsp;&raquo;.</p>
<p>Nous illustrerons une application simple qui saisie des utilisateurs dans une table et qui les affiche sous la forme d&#8217;une liste. Cette application nous permettra de voir d&#8217;une façon pragmatique la structure des applications Joomla! et les fonctions de base du framework : création d&#8217;une classe modèle (ajout, mise à jour, suppression et requêtes en base de données), création d&#8217;un controller avec les actions de base (une action pour création et édition et une autre pour le listing), gestion des templates, redirections et notifications des erreurs et succès.</p>
<p>Télécharger Joomla! 1.5.x : <a href="http://www.alexandre-julien.com/wp-content/uploads/2009/09/Joomla_1.5.15-Stable-Full_Package.zip">Joomla_1.5.15</a></p>
<p>Télécharger l&#8217;application : <a href="http://www.alexandre-julien.com/wp-content/uploads/2009/09/com_crud.zip">Joomla! Crud Tutoriel</a></p>
<p><span id="more-790"></span></p>
<p>Voici ci-dessous la hiérarchie de notre application, il s&#8217;agit d&#8217;un répertoire à créer dans le dossier &laquo;&nbsp;components&nbsp;&raquo; de Joomla! :</p>
<p><a href="http://www.alexandre-julien.com/wp-content/uploads/2009/09/joomla-component-hierarchy.png"><img class="aligncenter size-full wp-image-798" title="joomla! component hierarchy" src="http://www.alexandre-julien.com/wp-content/uploads/2009/09/joomla-component-hierarchy.png" alt="joomla! component hierarchy" width="198" height="254" /></a></p>
<p>Voici le script SQL correspondant à la table &laquo;&nbsp;jos_crud_users&nbsp;&raquo; qui contient les données :</p>
<pre class="brush: sql;">

--
-- Structure de la table `jos_crud_users`
--

CREATE TABLE IF NOT EXISTS `jos_crud_users` (
 `user_id` int(11) NOT NULL AUTO_INCREMENT,
 `user_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
 `user_lastname` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
 `user_email` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
 PRIMARY KEY (`user_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
</pre>
<p>Voici le premier fichier à créer, &laquo;&nbsp;crud.php&nbsp;&raquo; il s&#8217;agit du fichier d&#8217;entrée qui est exécuté dès qu&#8217;un utilisateur visite l&#8217;application :</p>
<pre class="brush: php;">

&lt;?php
/**
 * @package    Joomla.Crud
 * @subpackage Components
 * components/com_crud/crud.php
 * @link http://www.alexandre-julien.com
 * @author Alexandre JULIEN
 */

// Pas d'accès direct à la page
defined( '_JEXEC' ) or die( 'Restricted access' );

// Requiert la classe des contrôleurs

require_once( JPATH_COMPONENT.DS.'controller.php' );

// Requiert un contrôleur spécifique si demander
if($controller = JRequest::getVar('controller')) {
 $path = JPATH_COMPONENT.DS.'controllers'.DS.$controller.'.php';
 if (file_exists($path)) {
 require_once $path;
 } else {
 $controller = '';
 }
}

// Instanciation du contrôleur
$classname    = 'CrudController'.$controller;
$controller   = new $classname( );

// Execute la tâche demandée
$controller-&gt;execute( JRequest::getVar( 'task' ) );

// Redirection si elle est sollicitée par le contrôleur
$controller-&gt;redirect();
?&gt;
</pre>
<p>Voici maintenant le contrôleur, chaque méthode correspond à une tâche accessible par l&#8217;url : &laquo;&nbsp;index.php?option=com_crud&amp;task=lamethode&nbsp;&raquo;</p>
<pre class="brush: php;">

&lt;?php
/**
 * @package    Joomla.Crud
 * @subpackage Components
 * @link http://www.alexandre-julien.com
 * @license GNU / GPL
 * @author Alexandre JULIEN
 */

// No direct access

defined( '_JEXEC' ) or die( 'Restricted access' );

jimport('joomla.application.component.controller');

/**
 * Hello World Component Controller
 *
 * @package    Joomla.Tutorials
 * @subpackage Components
 */
class CrudController extends JController
{
 /**
 * Méthode d'affichage
 *
 * @access    public
 */
 function display()
 {
 $model = $this-&gt;getModel();
 $view = $this-&gt;getView('list', 'html');
 $view-&gt;users = $model-&gt;getAllUsers();
 $view-&gt;display();
 }

 /**
 * Formulaire de création d'un utilisateur
 * @return unknown_type
 */
 function add()
 {
 $view =&amp; $this-&gt;getView('edit', 'html');
 $view-&gt;display();
 }

 /**
 * Formulaire d'édition d'un utilisateur
 * @return unknown_type
 */
 function edit()
 {
 if (isset($_GET) &amp;&amp; isset($_GET['id']))
 {
 $view = $this-&gt;getView ('edit', 'html');
 $model =&amp; $this-&gt;getModel();
 $view-&gt;data = $model-&gt;getUser($_GET['id']);
 $view-&gt;display();
 }
 else
 {
 $this-&gt;setRedirect('index.php?option=com_crud', &quot;L'identifiant est manquant&quot;, 'error');
 }
 }

 /**
 * Sauvegarde d'un utilisateur
 * @return unknown_type
 */
 function save()
 {
 if (isset($_POST))
 {
 $model =&amp; $this-&gt;getModel();
 if (isset($_POST['id']) &amp;&amp; $model-&gt;getUser($_POST['id']))
 {
 $model-&gt;updateUser($_POST);
 }
 else
 {
 $model-&gt;addUser($_POST);
 }
 $this-&gt;setRedirect('index.php?option=com_crud', &quot;Les modifications ont bien été enregistrées&quot;, 'message');
 }
 else
 {
 $this-&gt;setRedirect('index.php?option=com_crud', &quot;Les données sont manquantes&quot;, 'error');
 }
 }

 /**
 * Suppression d'un utilisateur
 * @return unknown_type
 */
 function delete()
 {
 if (isset($_GET) &amp;&amp; isset($_GET['id']))
 {
 $model =&amp; $this-&gt;getModel();
 $model-&gt;removeUser($_GET['id']);
 $this-&gt;setRedirect('index.php?option=com_crud', &quot;L'utilisateur a bien été supprimé&quot;, 'message');
 }
 else
 {
 $this-&gt;setRedirect('index.php?option=com_crud', &quot;L'identifiant est manquant&quot;, 'error');
 }
 }
}
?&gt;
</pre>
<p>La couche modèle qui gère les transactions avec la base de données dans le fichiers &laquo;&nbsp;models/crud.php&nbsp;&raquo; :</p>
<pre class="brush: php;">

&lt;?php
/**
 * Crud modèle pour le composant Crud
 *
 * @package    Joomla.Crud
 * @subpackage Components
 * @link http://www.alexandre-julien.com
 * @license    GNU/GPL
 * @author Alexandre JULIEN
 */

// Pas d'accès direct

defined( '_JEXEC' ) or die( 'Restricted access' );

jimport( 'joomla.application.component.model' );

/**
 * Modèle Crud
 *
 * @package    Joomla.Crud
 * @subpackage Components
 */
class CrudModelCrud extends JModel
{
 /**
 * Retourne tous les enregistrements de la table
 * @return unknown_type
 */
 function getAllUsers()
 {
 $query = 'SELECT * FROM #__crud_users';
 return $this-&gt;_getList ($query);
 }

 /**
 * Retourne l'enregistrement en fonction de l'identifiant de l'utilisateur
 * @param $user_id
 * @return unknown_type
 */
 function getUser ($user_id)
 {
 $query = 'SELECT * FROM #__crud_users WHERE user_id = '.(int)$user_id;
 $result = $this-&gt;_getList ($query);
 return $result[0];
 }

 /**
 * Ajoute un enregistrement
 * @param $values
 * @return unknown_type
 */
 function addUser ($values)
 {
 $db =&amp; JFactory::getDBO();

 $row = new stdClass();
 $row-&gt;user_name = $values['user_name'];
 $row-&gt;user_lastname = $values['user_lastname'];
 $row-&gt;user_email = $values['user_email'];

 $db-&gt;insertObject ('#__crud_users', $row);
 }

 /**
 * Met à jour un enregistrement
 * @param $values
 * @return unknown_type
 */
 function updateUser ($values)
 {
 $db =&amp; JFactory::getDBO();

 $row = new stdClass();
 $row-&gt;user_id = $values['user_id'];
 $row-&gt;user_name = $values['user_name'];
 $row-&gt;user_lastname = $values['user_lastname'];
 $row-&gt;user_email = $values['user_email'];

 $db-&gt;updateObject ('#__crud_users', $row, 'user_id');
 }

 /**
 * Supprime un enregistrement
 * @param $id
 * @return unknown_type
 */
 function removeUser ($id)
 {
 $db =&amp; JFactory::getDBO();
 $query = 'DELETE FROM #__crud_users WHERE user_id = '.(int)$id;
 $db-&gt;setQuery($query);
 return $this-&gt;query();
 }
}
?&gt;
</pre>
<p>Voici un exemple de fichier &laquo;&nbsp;View.html.php&nbsp;&raquo;, il s&#8217;agit de celui de l&#8217;écran de listing :</p>
<pre class="brush: php;">

&lt;?php
/**
 * @package    Joomla.Crud
 * @subpackage Components
 * @link http://www.alexandre-julien.com
 * @license   GNU/GPL
 * @author Alexandre JULIEN
 */

// Pas d'accès direct

defined( '_JEXEC' ) or die( 'Restricted access' );

jimport( 'joomla.application.component.view');

/**
 * HTML View pour afficher la liste des utilisateurs
 *
 * @package    Crud
 */

class CrudViewList extends JView
{
 function display($tpl = null)
 {
 $this-&gt;assignRef('data', $this-&gt;users);
 parent::display($tpl);
 }
}
?&gt;
</pre>
<p>Le template de la vue &laquo;&nbsp;edit&nbsp;&raquo; :</p>
<pre class="brush: php;">
&lt;?php

// Pas d'accès direct

defined('_JEXEC') or die('Restricted access'); ?&gt;

&lt;h1&gt;Edition d'un utilisateur&lt;/h1&gt;
&lt;form name=&quot;utilisateur&quot; method=&quot;POST&quot;
	action=&quot;&lt;?php echo JRoute::_('index.php?option=com_crud&amp;task=save') ?&gt;&quot;&gt;
&lt;input type=&quot;hidden&quot; name=&quot;user_id&quot; value=&quot;&lt;?php echo $this-&gt;data-&gt;user_id ?&gt;&quot; /&gt;
&lt;table&gt;
	&lt;tbody&gt;
		&lt;tr&gt;
			&lt;th&gt;Prénom de l'utilisateur&lt;/th&gt;
			&lt;td&gt;&lt;input type=&quot;text&quot; name=&quot;user_name&quot;
				value=&quot;&lt;?php if (isset($this-&gt;data)) { echo $this-&gt;data-&gt;user_name; } ?&gt;&quot; /&gt;&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;th&gt;Nom de l'utilisateur&lt;/th&gt;
			&lt;td&gt;&lt;input type=&quot;text&quot; name=&quot;user_lastname&quot;
				value=&quot;&lt;?php if(isset($this-&gt;data)) { echo $this-&gt;data-&gt;user_lastname; } ?&gt;&quot; /&gt;&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;th&gt;Email de l'utilisateur&lt;/th&gt;
			&lt;td&gt;&lt;input type=&quot;text&quot; name=&quot;user_email&quot;
				value=&quot;&lt;?php if(isset($this-&gt;data)) { echo $this-&gt;data-&gt;user_email; } ?&gt;&quot;&gt;&lt;/input&gt;&lt;/td&gt;
		&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;

&lt;br /&gt;
&lt;br /&gt;
&lt;input type=&quot;submit&quot; value=&quot;Enregistrer&quot; /&gt;&lt;/form&gt;
</pre>
<p>Le template de la vue &laquo;&nbsp;list&nbsp;&raquo; :</p>
<pre class="brush: php;">
&lt;?php

// Pas d'accès direct

defined('_JEXEC') or die('Restricted access'); ?&gt;

&lt;h1&gt;Liste des utilisateurs&lt;/h1&gt;

&lt;table&gt;
	&lt;tbody&gt;
		&lt;tr&gt;
			&lt;th&gt;Nom&lt;/th&gt;
			&lt;th&gt;Prénom&lt;/th&gt;
			&lt;th&gt;Adresse e-mail&lt;/th&gt;
			&lt;th&gt;Actions&lt;/th&gt;
		&lt;/tr&gt;
		&lt;?php foreach ($this-&gt;data as $key =&gt; $value) { ?&gt;
		&lt;tr&gt;
			&lt;td&gt;&lt;?php echo $value-&gt;user_lastname ?&gt;&lt;/td&gt;
			&lt;td&gt;&lt;?php echo $value-&gt;user_name ?&gt;&lt;/td&gt;
			&lt;td&gt;&lt;?php echo $value-&gt;user_email ?&gt;&lt;/td&gt;
			&lt;td&gt;&lt;a
				href=&quot;&lt;?php echo JRoute::_('index.php?option=com_crud&amp;task=edit&amp;id='.(int)$value-&gt;user_id) ?&gt;&quot;&gt;
			Editer &lt;/a&gt; | &lt;a
				href=&quot;&lt;?php echo JRoute::_('index.php?option=com_crud&amp;task=delete&amp;id='.(int)$value-&gt;user_id) ?&gt;&quot;&gt;Supprimer&lt;/a&gt;&lt;/td&gt;
		&lt;/tr&gt;
		&lt;?php } ?&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;br /&gt;
&lt;a href=&quot;&lt;?php echo JRoute::_('index.php?option=com_crud&amp;task=add') ?&gt;&quot;&gt;
Créer un utilisateur &lt;/a&gt;
</pre>
<p>On pourra également créer un package Joomla! qui automatisera l&#8217;installation des fichiers et des tables SQL grâce à un fichier de configuration d&#8217;installation &laquo;&nbsp;hello.xml&nbsp;&raquo; :</p>
<pre class="brush: xml;">
&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
&lt;!DOCTYPE install SYSTEM &quot;http://www.joomla.org/xml/dtd/1.5/component-install.dtd&quot;&gt;
&lt;install type=&quot;component&quot; version=&quot;1.5.0&quot;&gt;
  &lt;name&gt;crud&lt;/name&gt;
  &lt;!-- Les éléments suivants sont optionnels  --&gt;
  &lt;creationDate&gt;2009 09 21&lt;/creationDate&gt;
  &lt;author&gt;Alexandre JULIEN&lt;/author&gt;
  &lt;authorEmail&gt;mail@alexandre.julien.com&lt;/authorEmail&gt;
  &lt;authorUrl&gt;http://www.alexandre-julien.com&lt;/authorUrl&gt;
  &lt;copyright&gt;Le blog d'Alex&lt;/copyright&gt;
  &lt;license&gt;GNU / GPL&lt;/license&gt;
  &lt;!--  Version du composant --&gt;
  &lt;version&gt;stable 1.0&lt;/version&gt;
  &lt;!-- Description du Composant --&gt;
  &lt;description&gt;Petit tutoriel CRUD pour illustrer Joomla! MVC Framework&lt;/description&gt;

  &lt;!-- Fichiers d'installation --&gt;
  &lt;files folder=&quot;site&quot;&gt;
    &lt;filename&gt;crud.php&lt;/filename&gt;
    &lt;filename&gt;controller.php&lt;/filename&gt;
    &lt;filename&gt;models/crud.php&lt;/filename&gt;
    &lt;filename&gt;views/edit/view.html.php&lt;/filename&gt;
    &lt;filename&gt;views/edit/tmpl/default.php&lt;/filename&gt;
    &lt;filename&gt;views/list/view.html.php&lt;/filename&gt;
    &lt;filename&gt;views/list/tmpl/default.php&lt;/filename&gt;
  &lt;/files&gt;
  &lt;install&gt;
    &lt;sql&gt;
      &lt;file charset=&quot;uft8&quot; driver=&quot;mysql&quot;&gt;install.sql&lt;/file&gt;
      &lt;file charset=&quot;utf8&quot; driver=&quot;mysqli&quot;&gt;install.sql&lt;/file&gt;
    &lt;/sql&gt;
  &lt;/install&gt;
  &lt;uninstall&gt;
    &lt;sql&gt;
      &lt;file charset=&quot;utf8&quot; driver=&quot;mysql&quot;&gt;uninstall.sql&lt;/file&gt;
      &lt;file charset=&quot;utf8&quot; driver=&quot;mysqli&quot;&gt;uninstall.sql&lt;/file&gt;
    &lt;/sql&gt;
  &lt;/uninstall&gt;
  &lt;administration&gt;
    &lt;!-- Administration Menu Section --&gt;
    &lt;menu&gt;Joomla! CRUD&lt;/menu&gt;

    &lt;!-- Fichiers de la partie administration --&gt;
    &lt;files folder=&quot;admin&quot;&gt;
      &lt;filename&gt;index.html&lt;/filename&gt;
      &lt;filename&gt;install.sql&lt;/filename&gt;
      &lt;filename&gt;uninstall.sql&lt;/filename&gt;
    &lt;/files&gt;
  &lt;/administration&gt;
&lt;/install&gt;
</pre>
<p>Voici des &laquo;&nbsp;screenshots&nbsp;&raquo; de notre application finale :</p>
<p><a href="http://www.alexandre-julien.com/wp-content/uploads/2009/09/add_joomla.png"><img class="aligncenter size-full wp-image-806" title="Joomla Crud Tuto MVC" src="http://www.alexandre-julien.com/wp-content/uploads/2009/09/add_joomla.png" alt="Joomla Crud Tuto MVC" width="595" height="353" /></a><br />
<a href="http://www.alexandre-julien.com/wp-content/uploads/2009/09/list_joomla.png"><img class="aligncenter size-full wp-image-807" title="List Joomla Tuto MVC" src="http://www.alexandre-julien.com/wp-content/uploads/2009/09/list_joomla.png" alt="List Joomla Tuto MVC" width="594" height="383" /></a></p>
<p>L&#8217;application est disponible ici dans cette archive : <a href="http://www.alexandre-julien.com/wp-content/uploads/2009/09/crud.zip">Tutoriel Joomla! CRUD (installation package)</a></p>
<div id="_mcePaste" style="overflow: hidden; position: absolute; left: -10000px; top: 5658px; width: 1px; height: 1px;">&lt;?php</p>
<p>// Pas d&#8217;accÃ¨s direct</p>
<p>defined(&#8216;_JEXEC&#8217;) or die(&#8216;Restricted access&#8217;); ?&gt;</p>
<p>&lt;h1&gt;Edition d&#8217;un utilisateur&lt;/h1&gt;<br />
&lt;form name=&nbsp;&raquo;utilisateur&nbsp;&raquo; method=&nbsp;&raquo;POST&nbsp;&raquo;<br />
action=&nbsp;&raquo;&lt;?php echo JRoute::_(&#8216;index.php?option=com_crud&amp;task=save&#8217;) ?&gt;&nbsp;&raquo;&gt;<br />
&lt;input type=&nbsp;&raquo;hidden&nbsp;&raquo; name=&nbsp;&raquo;user_id&nbsp;&raquo; value=&nbsp;&raquo;&lt;?php echo $this-&gt;data-&gt;user_id ?&gt;&nbsp;&raquo; /&gt;<br />
&lt;table&gt;<br />
&lt;tbody&gt;<br />
&lt;tr&gt;<br />
&lt;th&gt;PrÃ©nom de l&#8217;utilisateur&lt;/th&gt;<br />
&lt;td&gt;&lt;input type=&nbsp;&raquo;text&nbsp;&raquo; name=&nbsp;&raquo;user_name&nbsp;&raquo;<br />
value=&nbsp;&raquo;&lt;?php if (isset($this-&gt;data)) { echo $this-&gt;data-&gt;user_name; } ?&gt;&nbsp;&raquo; /&gt;&lt;/td&gt;<br />
&lt;/tr&gt;<br />
&lt;tr&gt;<br />
&lt;th&gt;Nom de l&#8217;utilisateur&lt;/th&gt;<br />
&lt;td&gt;&lt;input type=&nbsp;&raquo;text&nbsp;&raquo; name=&nbsp;&raquo;user_lastname&nbsp;&raquo;<br />
value=&nbsp;&raquo;&lt;?php if(isset($this-&gt;data)) { echo $this-&gt;data-&gt;user_lastname; } ?&gt;&nbsp;&raquo; /&gt;&lt;/td&gt;<br />
&lt;/tr&gt;<br />
&lt;tr&gt;<br />
&lt;th&gt;Email de l&#8217;utilisateur&lt;/th&gt;<br />
&lt;td&gt;&lt;input type=&nbsp;&raquo;text&nbsp;&raquo; name=&nbsp;&raquo;user_email&nbsp;&raquo;<br />
value=&nbsp;&raquo;&lt;?php if(isset($this-&gt;data)) { echo $this-&gt;data-&gt;user_email; } ?&gt;&nbsp;&raquo;&gt;&lt;/input&gt;&lt;/td&gt;<br />
&lt;/tr&gt;<br />
&lt;/tbody&gt;<br />
&lt;/table&gt;</p>
<p>&lt;br /&gt;<br />
&lt;br /&gt;<br />
&lt;input type=&nbsp;&raquo;submit&nbsp;&raquo; value=&nbsp;&raquo;Enregistrer&nbsp;&raquo; /&gt;&lt;/form&gt;</p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.alexandre-julien.com/php/joomla/joomla-api-framework-mvc-1-5-creation-dune-application-tuto-crud/feed/</wfw:commentRss>
		<slash:comments>48</slash:comments>
		</item>
		<item>
		<title>Zend Framework tutoriel #4 : Création de formulaire et validations avec Zend_Form et Zend_Validate</title>
		<link>http://www.alexandre-julien.com/php/zend-framework-php/zend-framework-tutoriel-4-creation-de-formulaire-et-validations-avec-zend_form-et-zend_validate/</link>
		<comments>http://www.alexandre-julien.com/php/zend-framework-php/zend-framework-tutoriel-4-creation-de-formulaire-et-validations-avec-zend_form-et-zend_validate/#comments</comments>
		<pubDate>Tue, 15 Sep 2009 19:30:30 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[formulaire]]></category>
		<category><![CDATA[validateur]]></category>
		<category><![CDATA[zend]]></category>
		<category><![CDATA[zend_form]]></category>
		<category><![CDATA[zend_validate]]></category>
		<category><![CDATA[zf]]></category>

		<guid isPermaLink="false">http://www.alexandre-julien.com/?p=763</guid>
		<description><![CDATA[
Zend Framework possède son propre outil pour gérer les formulaires correctement : Zend_Form est là pour ça !
Il s&#8217;agit d&#8217;une librairie qui gère vos composants de formulaires (y compris leur rendu), les validations, le filtrage des données, et la gestion de sous-formulaires.
La librairie Zend_Validate qui gère les validateurs sera aussi utiliser dans ce tutoriel afin]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.alexandre-julien.com/wp-content/uploads/2009/09/forms.jpg"><img class="size-medium wp-image-766 aligncenter" title="forms" src="http://www.alexandre-julien.com/wp-content/uploads/2009/09/forms-300x227.jpg" alt="forms 300x227 Zend Framework tutoriel #4 : Création de formulaire et validations avec Zend Form et Zend Validate" width="300" height="227" /></a></p>
<p>Zend Framework possède son propre outil pour gérer les formulaires correctement : Zend_Form est là pour ça !<br />
Il s&#8217;agit d&#8217;une librairie qui gère vos composants de formulaires (y compris leur rendu), les validations, le filtrage des données, et la gestion de sous-formulaires.<br />
La librairie Zend_Validate qui gère les validateurs sera aussi utiliser dans ce tutoriel afin d&#8217;illustrer les validations de formulaire et ce de façon personnalisé.</p>
<p><span id="more-763"></span></p>
<p>Tout d&#8217;abord nous allons voir les principes basiques des formulaires avec Zend Framework : <strong>il nous faudra ajouter un dossier &laquo;&nbsp;forms&nbsp;&raquo; dans notre répertoire &laquo;&nbsp;application&nbsp;&raquo;</strong>.</p>
<p><a href="http://www.alexandre-julien.com/wp-content/uploads/2009/09/forms_folder.png"><img class="aligncenter size-full wp-image-770" title="forms_folder" src="http://www.alexandre-julien.com/wp-content/uploads/2009/09/forms_folder.png" alt="forms folder Zend Framework tutoriel #4 : Création de formulaire et validations avec Zend Form et Zend Validate" width="377" height="133" /> </a></p>
<p>Voici un premier example de la création d&#8217;un formulaire dans notre fichier &laquo;&nbsp;Author.php&nbsp;&raquo;. Il s&#8217;agit d&#8217;une classe qui correspondra à un formulaire d&#8217;inscription d&#8217;un auteur :</p>
<pre class="brush: php;">
class Form_Author extends Zend_Form
{
  /**
   * Surcharge du constructeur du formulaire
   */
  public function __construct($options = null)
  {
    parent::__construct($options = null)
    $this-&gt;setName('subscription'); // On nomme le formulaire

    $id = new Zend_Form_Element_Hidden('id'); // On rajoute un champs caché

    $email = new Zend_Form_Element_Text('email');
    $email-&gt;setRequired(true)
          -&gt;setLabel('Veuillez saisir votre e-mail');

     // Nous avons rajouter un attribut obligatoire à notre email et nous lui avons donné un libellé avant le champs texte

    // Ensuite on peut insérer les composants (elements) dans le formulaire
    $this-&gt;addElements($id, $email);

  }
}
</pre>
<p>Nous avons réaliser une ébauche de formulaire, pour l&#8217;utiliser dans notre contrôleur et vue, rien de plus simple</p>
<p>AuthorController.php</p>
<pre class="brush: php;">

function suscribeAction ()

{

$form = new Form_Author(); // On instancie le formulaire

$this-&gt;view-&gt;form = $form // On le renvoie à la vue

}

// Pour l'éditer il faut renvoyer les informations au formulaire

function editsubscriptionAction()

{

$form = new Form_Author();

$model = new Model_DbTable_Author();

$data = $model-&gt;getAuthor('5'); // On récupère toutes les données d'un auteur dans la base de données

$form-&gt;populate ($data); // On propulse les données dans le formulaire

$this-&gt;view-&gt;form = $form;

}
</pre>
<p>Ensuite dans la vue, on affiche le formulaire et on définit son action :</p>
<p>Author.phtml</p>
<pre class="brush: php;">
echo $this-&gt;form;
$this-&gt;form&gt;setAction(author/save); // On définit l'action qui récupère le formulaire
</pre>
<p>Voici un exemple beaucoup plus complet d&#8217;un formulaire avec des validateurs, internationalisation et un captcha :</p>
<pre class="brush: php;">
&lt;?php
class Form_Author extends Zend_Form
{
public function __construct($options = null)
{
parent::__construct($options);
$this-&gt;setName('Subscription');
$id = new Zend_Form_Element_Hidden('id');

$translate = Zend_Registry::get('translate');

$emptyValidator = new Zend_Validate_NotEmpty();
$emptyValidator-&gt;setMessage($translate-&gt;_(&quot;Ce champs est vide : vous devez le compléter&quot;));

$emailValidator = new Zend_Validate_EmailAddress();
$emailValidator-&gt;setMessage($translate-&gt;_('L\'adresse email n\'est pas valide'));

$primaryValidator = new Zend_Validate_Db_NoRecordExists('users', 'username');
$primaryValidator-&gt;setMessage($translate-&gt;_(&quot;L'adresse email a déjà été utilisée&quot;), Zend_Validate_Db_Abstract::ERROR_RECORD_FOUND);

$stringLengthValdiator = new Zend_Validate_StringLength(6, 12);
$stringLengthValdiator-&gt;setMessage($translate-&gt;_('La longueur du mot de pase doit être comprise entre 6 et 12 caractères'));

$email = new Zend_Form_Element_Text('email');
$email-&gt;setLabel($translate-&gt;_('Email'))
-&gt;setRequired(true)
-&gt;addFilter('StripTags')
-&gt;addFilter('StringTrim')
-&gt;addValidator($emailValidator)
-&gt;addValidator($primaryValidator)
-&gt;addValidator($emptyValidator);

$password = new Zend_Form_Element_Password('password');
$password-&gt;setLabel($translate-&gt;_('mot de passe'));
$password-&gt;addValidator($stringLengthValdiator);
$password-&gt;addValidator($emptyValidator);

$password_verification = new Zend_Form_Element_Password ('password_confirm');
$password_verification-&gt;setLabel ($translate-&gt;_('retapez le mot de passe pour vérification'));
$password_verification-&gt;addValidator($emptyValidator);
if (isset($_POST['password'])) {
$passwordVerificationValidator = new Zend_Validate_Identical($_POST['password']);
$passwordVerificationValidator-&gt;setMessage($translate-&gt;_('Les mots de passe ne correspondent pas'));
$password_verification-&gt;addValidator($passwordVerificationValidator);
}

$sex = new Zend_Form_Element_Radio('sex', array('separator' =&gt; ' '));
$sex-&gt;setMultiOptions (array('male' =&gt; 'Homme', 'female' =&gt; 'Femme '))
-&gt;setLabel($translate-&gt;_('Sexe'))
-&gt; isRequired(true);

$name = new Zend_Form_Element_Text('name');
$name-&gt;setLabel($translate-&gt;_('Prénom'))
-&gt;setRequired(true)
-&gt;addFilter('StripTags')
-&gt;addFilter('StringTrim')
-&gt;addValidator($emptyValidator);

$surname = new Zend_Form_Element_Text('surname');
$surname-&gt;setLabel($translate-&gt;_('Nom'))
-&gt;setRequired(true)
-&gt;addFilter('StripTags')
-&gt;addFilter('StringTrim')
-&gt;addValidator($emptyValidator);

$address = new Zend_Form_Element_Text('address_author');
$address-&gt;setLabel($translate-&gt;_('Adresse'))
-&gt;setRequired(true)
-&gt;addFilter('StripTags')
-&gt;addFilter('StringTrim')
-&gt;addValidator($emptyValidator);

$zip_code = new Zend_Form_Element_Text('zip_code_author');
$zip_code-&gt;setLabel($translate-&gt;_('Code Postal'))
-&gt;setRequired(true)
-&gt;addFilter('StripTags')
-&gt;addFilter('StringTrim')
-&gt;addValidator($emptyValidator);

$city = new Zend_Form_Element_Text('city_author');
$city-&gt;setLabel($translate-&gt;_('Ville'))
-&gt;setRequired(true)
-&gt;addFilter('StripTags')
-&gt;addFilter('StringTrim')
-&gt;addValidator($emptyValidator);

$phone = new Zend_Form_Element_Text('phone');
$phone-&gt;setLabel($translate-&gt;_('Téléphone'))
-&gt;setRequired(true)
-&gt;addFilter('StripTags')
-&gt;addFilter('StringTrim')
-&gt;addValidator($emptyValidator);

}

$submit = new Zend_Form_Element_Submit('valid');
$submit-&gt;setAttrib('id', 'submitbutton')
-&gt;setLabel($translate-&gt;_('Enregistrer l\'annonce'));

 $this-&gt;addElements(array($id, $email,$password, $password_verification, $sex, $name, $surname, $address, $zip_code, $city, $phone, $submit));
}
}
?&gt;
</pre>
<p>Dans le prochaine tutorial, nous verrons comment mettre en application tout ce que nous avons vu précédemment dans un &laquo;&nbsp;CRUD&nbsp;&raquo; (Create Read Update Delete) qui illustrera l&#8217;utilisateur du design-pattern MVC, Zend_Db, Zend_Form, Zend_Validate et Zend_Layout.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.alexandre-julien.com/php/zend-framework-php/zend-framework-tutoriel-4-creation-de-formulaire-et-validations-avec-zend_form-et-zend_validate/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>

<!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

Minified using disk
Page Caching using disk (enhanced) (user agent is rejected)
Database Caching 8/14 queries in 0.033 seconds using disk
Content Delivery Network via N/A

Served from: www.alexandre-julien.com @ 2010-07-29 18:26:23 -->