<?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>Vincent Mazenod, aka mazenovi, aka voisin de gennetines &#187; php</title>
	<atom:link href="http://blog.mazenod.fr/tag/php/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.mazenod.fr</link>
	<description>#ispcp #php #symfony #social_networking #cornemuse</description>
	<lastBuildDate>Wed, 23 Nov 2011 09:46:05 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
		<item>
		<title>forcer l&#8217;utilisation de ssl sur un sous domaine avec ispcp</title>
		<link>http://blog.mazenod.fr/2011/03/forcer-lutilisation-de-ssl-sur-un-sous-domaine-avec-ispcp/</link>
		<comments>http://blog.mazenod.fr/2011/03/forcer-lutilisation-de-ssl-sur-un-sous-domaine-avec-ispcp/#comments</comments>
		<pubDate>Mon, 28 Mar 2011 12:11:56 +0000</pubDate>
		<dc:creator>mazenovi</dc:creator>
				<category><![CDATA[bricolage]]></category>
		<category><![CDATA[dev]]></category>
		<category><![CDATA[libre]]></category>
		<category><![CDATA[Non classé]]></category>
		<category><![CDATA[securité]]></category>
		<category><![CDATA[gratuit]]></category>
		<category><![CDATA[ispcp]]></category>
		<category><![CDATA[open source]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[sécurité]]></category>
		<category><![CDATA[www]]></category>

		<guid isPermaLink="false">http://blog.mazenod.fr/?p=1878</guid>
		<description><![CDATA[<p><a href="http://blog.mazenod.fr/wp-content/uploads/2011/03/isp-control-panel_bigger.jpg"><img class="alignleft" style="margin-left: 20px; margin-right: 20px;" title="isp-control-panel_bigger" src="http://blog.mazenod.fr/wp-content/uploads/2011/03/isp-control-panel_bigger.jpg" alt="" width="73" height="73" /></a>Apprenez comment ajouter et même forcer l'utilisation de ssl sur les domaines ou sous domaines que vous hébergez ispcp, un control panel simple et complet</p>
]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblog.mazenod.fr%2F2011%2F03%2Fforcer-lutilisation-de-ssl-sur-un-sous-domaine-avec-ispcp%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.mazenod.fr%2F2011%2F03%2Fforcer-lutilisation-de-ssl-sur-un-sous-domaine-avec-ispcp%2F&amp;style=normal&amp;b=2" height="61" width="50" title="forcer lutilisation de ssl sur un sous domaine avec ispcp" alt=" forcer lutilisation de ssl sur un sous domaine avec ispcp" /><br />
			</a>
		</div>
<p>Tout d&#8217;abord il faut activer ssl sur votre serveur et générer vos certificats ssl (à moins que vous en ayez déjà).</p>
<p>Le how to officiel d&#8217;ispcp <a href="http://isp-control.net/documentation/howto/security/ssl_made_easy">How to: SSL made easy</a> est très bien fait et vous apprendra en premier lieu comment sécuriser votre control panel.</p>
<p><a href="http://blog.mazenod.fr/wp-content/uploads/2011/03/ispcp.png" rel="lightbox[1878]"><img class="aligncenter size-full wp-image-1880" title="ispcp" src="http://blog.mazenod.fr/wp-content/uploads/2011/03/ispcp.png" alt="ispcp forcer lutilisation de ssl sur un sous domaine avec ispcp" width="502" height="256" /></a></p>
<p>Ayant un peu plus cherché pour mettre la même chose en place avec un sous domaine géré par ispcp, je me permets de relayer la solution (en allemand) que<a href="http://isp-control.net/forum/printthread.php?tid=9450"> j&#8217;ai trouvé dans un forum</a>.</p>
<p>le but est de créer un virtual host sub.domain.tld accessible en ssl (sachant que le virtual host est simplement créé avec ispcp)</p>
<p>il faut d&#8217;abord créer vhost en écoute sur le port 443 en éditant</p>
<div class="codecolorer-container bash blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">vi</span> <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>apache2<span style="color: #000000; font-weight: bold;">/</span>site-available<span style="color: #000000; font-weight: bold;">/</span>sub-ssl</div></div>
<p>et en y ajoutant</p>
<div class="codecolorer-container bash blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:300px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000; font-weight: bold;">&lt;</span>VirtualHost XXX.XXX.XXX.XXX:<span style="color: #000000;">443</span><span style="color: #000000; font-weight: bold;">&gt;</span><br />
<br />
&nbsp; &nbsp; SSLEngine On<br />
<br />
&nbsp; &nbsp; SSLCertificateFile <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>ssl<span style="color: #000000; font-weight: bold;">/</span>certs<span style="color: #000000; font-weight: bold;">/</span>domain.tld.crt<br />
&nbsp; &nbsp; SSLCertificateKeyFile <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>ssl<span style="color: #000000; font-weight: bold;">/</span>certs<span style="color: #000000; font-weight: bold;">/</span>domain.tld.key<br />
<br />
&nbsp; &nbsp; SSLProtocol All <span style="color: #660033;">-SSLv2</span><br />
&nbsp; &nbsp; SSLCipherSuite ALL:<span style="color: #000000; font-weight: bold;">!</span>EXP:<span style="color: #000000; font-weight: bold;">!</span>NULL:<span style="color: #000000; font-weight: bold;">!</span>ADH:<span style="color: #000000; font-weight: bold;">!</span>LOW<br />
&nbsp; &nbsp; SetEnvIf User-Agent “.<span style="color: #000000; font-weight: bold;">*</span>MSIE.<span style="color: #000000; font-weight: bold;">*</span>” nokeepalive ssl-unclean-shutdown<br />
<br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">&lt;</span>IfModule suexec_module<span style="color: #000000; font-weight: bold;">&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;SuexecUserGroup vu2001 vu2001<br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">&lt;/</span>IfModule<span style="color: #000000; font-weight: bold;">&gt;</span><br />
<br />
&nbsp; &nbsp; ServerAdmin &nbsp; &nbsp; webmestre.cerdi<span style="color: #000000; font-weight: bold;">@</span>u-clermont1.fr<br />
&nbsp; &nbsp; DocumentRoot &nbsp; &nbsp;<span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>www<span style="color: #000000; font-weight: bold;">/</span>virtual<span style="color: #000000; font-weight: bold;">/</span>domain.tld<span style="color: #000000; font-weight: bold;">/</span>sub<span style="color: #000000; font-weight: bold;">/</span>htdocs<br />
<br />
&nbsp; &nbsp; ServerName &nbsp; &nbsp; &nbsp;pssi.domain.tld<br />
<br />
&nbsp; &nbsp; Alias <span style="color: #000000; font-weight: bold;">/</span>errors <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>www<span style="color: #000000; font-weight: bold;">/</span>virtual<span style="color: #000000; font-weight: bold;">/</span>domain.tld<span style="color: #000000; font-weight: bold;">/</span>errors<span style="color: #000000; font-weight: bold;">/</span><br />
<br />
&nbsp; &nbsp; ErrorDocument <span style="color: #000000;">401</span> <span style="color: #000000; font-weight: bold;">/</span>errors<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">401</span>.html<br />
&nbsp; &nbsp; ErrorDocument <span style="color: #000000;">403</span> <span style="color: #000000; font-weight: bold;">/</span>errors<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">403</span>.html<br />
&nbsp; &nbsp; ErrorDocument <span style="color: #000000;">404</span> <span style="color: #000000; font-weight: bold;">/</span>errors<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">404</span>.html<br />
&nbsp; &nbsp; ErrorDocument <span style="color: #000000;">500</span> <span style="color: #000000; font-weight: bold;">/</span>errors<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">500</span>.html<br />
&nbsp; &nbsp; ErrorDocument <span style="color: #000000;">503</span> <span style="color: #000000; font-weight: bold;">/</span>errors<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">503</span>.html<br />
<br />
&nbsp; &nbsp; ErrorLog <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>log<span style="color: #000000; font-weight: bold;">/</span>apache2<span style="color: #000000; font-weight: bold;">/</span>ssl_error_log<br />
&nbsp; &nbsp; CustomLog <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>log<span style="color: #000000; font-weight: bold;">/</span>apache2<span style="color: #000000; font-weight: bold;">/</span>ssl_request_log &nbsp; ssl_combined<br />
<br />
&nbsp; &nbsp; <span style="color: #666666; font-style: italic;"># httpd sub entry cgi support BEGIN.</span><br />
&nbsp; &nbsp; ScriptAlias <span style="color: #000000; font-weight: bold;">/</span>cgi-bin<span style="color: #000000; font-weight: bold;">/</span> <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>www<span style="color: #000000; font-weight: bold;">/</span>virtual<span style="color: #000000; font-weight: bold;">/</span>domain.tld<span style="color: #000000; font-weight: bold;">/</span>sub<span style="color: #000000; font-weight: bold;">/</span>cgi-bin<span style="color: #000000; font-weight: bold;">/</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">&lt;</span>Directory <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>www<span style="color: #000000; font-weight: bold;">/</span>virtual<span style="color: #000000; font-weight: bold;">/</span>domain.tld<span style="color: #000000; font-weight: bold;">/</span>sub<span style="color: #000000; font-weight: bold;">/</span>cgi-bin<span style="color: #000000; font-weight: bold;">&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; AllowOverride AuthConfig<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #666666; font-style: italic;">#Options ExecCGI</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; Order allow,deny<br />
&nbsp; &nbsp; &nbsp; &nbsp; Allow from all<br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">&lt;/</span>Directory<span style="color: #000000; font-weight: bold;">&gt;</span><br />
&nbsp; &nbsp; <span style="color: #666666; font-style: italic;"># httpd sub entry cgi support END.</span><br />
<br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">&lt;</span>Directory <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>www<span style="color: #000000; font-weight: bold;">/</span>virtual<span style="color: #000000; font-weight: bold;">/</span>domain.tld<span style="color: #000000; font-weight: bold;">/</span>sub<span style="color: #000000; font-weight: bold;">/</span>htdocs<span style="color: #000000; font-weight: bold;">&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #666666; font-style: italic;"># httpd sub entry PHP support BEGIN.</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #666666; font-style: italic;"># httpd sub entry PHP support END.</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; Options <span style="color: #660033;">-Indexes</span> Includes FollowSymLinks MultiViews<br />
&nbsp; &nbsp; &nbsp; &nbsp; AllowOverride All<br />
&nbsp; &nbsp; &nbsp; &nbsp; Order allow,deny<br />
&nbsp; &nbsp; &nbsp; &nbsp; Allow from all<br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">&lt;/</span>Directory<span style="color: #000000; font-weight: bold;">&gt;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #666666; font-style: italic;"># httpd sub entry PHP2 support BEGIN.</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">&lt;</span>IfModule mod_php5.c<span style="color: #000000; font-weight: bold;">&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; php_admin_value open_basedir <span style="color: #ff0000;">&quot;/var/www/virtual/domain.tld/:/var/www/virtual/domain.tld/phptmp/:/usr/share/php/&quot;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; php_admin_value upload_tmp_dir <span style="color: #ff0000;">&quot;/var/www/virtual/domain.tld/phptmp/&quot;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; php_admin_value session.save_path <span style="color: #ff0000;">&quot;/var/www/virtual/domain.tld/phptmp/&quot;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; php_admin_value sendmail_path <span style="color: #ff0000;">'/usr/sbin/sendmail -f vu2001 -t -i'</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">&lt;/</span>IfModule<span style="color: #000000; font-weight: bold;">&gt;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">&lt;</span>IfModule mod_fastcgi.c<span style="color: #000000; font-weight: bold;">&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; ScriptAlias <span style="color: #000000; font-weight: bold;">/</span>php5<span style="color: #000000; font-weight: bold;">/</span> <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>www<span style="color: #000000; font-weight: bold;">/</span>fcgi<span style="color: #000000; font-weight: bold;">/</span>domain.tld<span style="color: #000000; font-weight: bold;">/</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">&lt;</span>Directory <span style="color: #ff0000;">&quot;/var/www/fcgi/domain.tld&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; AllowOverride None<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Options +ExecCGI <span style="color: #660033;">-MultiViews</span> <span style="color: #660033;">-Indexes</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Order allow,deny<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Allow from all<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">&lt;/</span>Directory<span style="color: #000000; font-weight: bold;">&gt;</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">&lt;/</span>IfModule<span style="color: #000000; font-weight: bold;">&gt;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">&lt;</span>IfModule mod_fcgid.c<span style="color: #000000; font-weight: bold;">&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; Include <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>apache2<span style="color: #000000; font-weight: bold;">/</span>mods-available<span style="color: #000000; font-weight: bold;">/</span>fcgid_ispcp.conf<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">&lt;</span>Directory <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>www<span style="color: #000000; font-weight: bold;">/</span>virtual<span style="color: #000000; font-weight: bold;">/</span>domain.tld<span style="color: #000000; font-weight: bold;">/</span>sub<span style="color: #000000; font-weight: bold;">/</span>htdocs<span style="color: #000000; font-weight: bold;">&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; FCGIWrapper <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>www<span style="color: #000000; font-weight: bold;">/</span>fcgi<span style="color: #000000; font-weight: bold;">/</span>domain.tld<span style="color: #000000; font-weight: bold;">/</span>php5-fcgi-starter .php<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Options +ExecCGI<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">&lt;/</span>Directory<span style="color: #000000; font-weight: bold;">&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">&lt;</span>Directory <span style="color: #ff0000;">&quot;/var/www/fcgi/domain.tld&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; AllowOverride None<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Options +ExecCGI MultiViews <span style="color: #660033;">-Indexes</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Order allow,deny<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Allow from all<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">&lt;/</span>Directory<span style="color: #000000; font-weight: bold;">&gt;</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">&lt;/</span>IfModule<span style="color: #000000; font-weight: bold;">&gt;</span><br />
&nbsp; &nbsp; <span style="color: #666666; font-style: italic;"># httpd sub entry PHP2 support END.</span><br />
<br />
<span style="color: #000000; font-weight: bold;">&lt;/</span>VirtualHost<span style="color: #000000; font-weight: bold;">&gt;</span></div></div>
<p>activer le virtual host</p>
<div class="codecolorer-container bash blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #c20cb9; font-weight: bold;">sudo</span> a2ensite sub-ssl</div></div>
<p>et recharger la configuration d&#8217;apache</p>
<div class="codecolorer-container bash blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>init.d<span style="color: #000000; font-weight: bold;">/</span>apache2 reload</div></div>
<p>reste à interdire l&#8217;utilisation du http non sécurisé, ce qui revient à forcer le https via un règle de rewriting qui peut par exemple être mise dans un .htaccess à la racine du sous domaine</p>
<div class="codecolorer-container bash blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #c20cb9; font-weight: bold;">vi</span> <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>www<span style="color: #000000; font-weight: bold;">/</span>virtual<span style="color: #000000; font-weight: bold;">/</span>domain.tld<span style="color: #000000; font-weight: bold;">/</span>sub<span style="color: #000000; font-weight: bold;">/</span>htdocs<span style="color: #000000; font-weight: bold;">/</span>.htaccess</div></div>
<p>et ajouter quelque chose du genre<a href="http://blog.mazenod.fr/wp-content/uploads/2011/03/isp-control-panel_bigger.jpg" rel="lightbox[1878]"><br />
</a></p>
<div class="codecolorer-container bash blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000; font-weight: bold;">&lt;</span>IfModule mod_rewrite.c<span style="color: #000000; font-weight: bold;">&gt;</span><br />
&nbsp; &nbsp;RewriteEngine On<br />
&nbsp; &nbsp;RewriteCond <span style="color: #000000; font-weight: bold;">%</span><span style="color: #7a0874; font-weight: bold;">&#123;</span>SERVER_PORT<span style="color: #7a0874; font-weight: bold;">&#125;</span> <span style="color: #000000;">80</span><br />
&nbsp; &nbsp;RewriteRule ^<span style="color: #7a0874; font-weight: bold;">&#40;</span>.<span style="color: #000000; font-weight: bold;">*</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>$ https:<span style="color: #000000; font-weight: bold;">//</span>sub.domain.tld<span style="color: #000000; font-weight: bold;">/</span><span style="color: #007800;">$1</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span>R,L<span style="color: #7a0874; font-weight: bold;">&#93;</span><br />
<span style="color: #000000; font-weight: bold;">&lt;/</span>IfModule<span style="color: #000000; font-weight: bold;">&amp;</span>gt<span style="color: #000000; font-weight: bold;">&gt;</span></div></div>
<p><a href="http://blog.mazenod.fr/wp-content/uploads/2011/03/ispcp-box.jpg" rel="lightbox[1878]"><img class="aligncenter size-full wp-image-1882" title="ispcp-box" src="http://blog.mazenod.fr/wp-content/uploads/2011/03/ispcp-box.jpg" alt="ispcp box forcer lutilisation de ssl sur un sous domaine avec ispcp" width="219" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.mazenod.fr/2011/03/forcer-lutilisation-de-ssl-sur-un-sous-domaine-avec-ispcp/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>postgreSQL &amp; xampp portable sous windows</title>
		<link>http://blog.mazenod.fr/2011/03/postgresql-xampp-portable-sous-windows/</link>
		<comments>http://blog.mazenod.fr/2011/03/postgresql-xampp-portable-sous-windows/#comments</comments>
		<pubDate>Wed, 23 Mar 2011 18:09:41 +0000</pubDate>
		<dc:creator>mazenovi</dc:creator>
				<category><![CDATA[bricolage]]></category>
		<category><![CDATA[dev]]></category>
		<category><![CDATA[libre]]></category>
		<category><![CDATA[portable apps]]></category>
		<category><![CDATA[doctrine]]></category>
		<category><![CDATA[open source]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[windows]]></category>
		<category><![CDATA[www]]></category>

		<guid isPermaLink="false">http://blog.mazenod.fr/?p=1862</guid>
		<description><![CDATA[<p><a href="http://blog.mazenod.fr/wp-content/uploads/2011/03/03568004-photo-logo-postgresql.jpg"><img class="alignleft" style="margin-left: 20px; margin-right: 20px;" title="03568004-photo-logo-postgresql" src="http://blog.mazenod.fr/wp-content/uploads/2011/03/03568004-photo-logo-postgresql.jpg" alt="" width="220" height="170" /></a>PostgreSQL est une alternative libre et professionnelle à MySQL. Si il est répandu dans le monde UNIX il l'est un peu moins dans le monde windows, et encore moins en tant qu'application portable. Le propos de ce post est donc de pouvoir installer ce SGBD afin de l'intégrer à un XAMPP portable déjà installé</p>
]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblog.mazenod.fr%2F2011%2F03%2Fpostgresql-xampp-portable-sous-windows%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.mazenod.fr%2F2011%2F03%2Fpostgresql-xampp-portable-sous-windows%2F&amp;style=normal&amp;b=2" height="61" width="50" title="postgreSQL & xampp portable sous windows" alt=" postgreSQL & xampp portable sous windows" /><br />
			</a>
		</div>
<p>Tout est dans le titre je crois. Je suis parti de ce billet <a href="http://notepad.patheticcockroach.com/628/adding-postgresql-portable-to-xampp-on-windows/">http://notepad.patheticcockroach.com/628/adding-postgresql-portable-to-xampp-on-windows/</a>et je vous livre ce qui a fonctionné pour moi. J&#8217;ai déjà expliqué sur ce blog <a href="http://blog.mazenod.fr/2009/11/environnement-de-developpement-portable-pour-symfony-framakey/">comment installer une plateforme xampp portable sous windows</a>.</p>
<p>Le prérequis est donc d&#8217;en avoir une fonctionnelle pour la suite <img src='http://blog.mazenod.fr/wp-includes/images/smilies/icon_wink.gif' alt="icon wink postgreSQL & xampp portable sous windows" class='wp-smiley' title="postgreSQL & xampp portable sous windows" /> </p>
<p>Tout d&#8217;abord il vous faudra une version portable de postrgre, que vous trouverez sur <a href="http://www.postgresql.org/download/windows">http://www.postgresql.org/download/windows</a>. En tant qu&#8217;<em>&laquo;&nbsp;Advanced user&nbsp;&raquo; </em>vous téléchagerez l&#8217; <a href="http://www.enterprisedb.com/products/pgbindownload.do">archive zip</a> sans l&#8217;installeur (la version portable quoi). J&#8217;ai opté pour la <em> 9.0.3-1</em> qui semble être la stable du moment.</p>
<p>Une fois l&#8217;archive décompressée, copier / coller le répertoire pgsql qu&#8217;elle contient dans Z:/MyApps/xampp/.</p>
<p><a href="http://blog.mazenod.fr/wp-content/uploads/2011/03/images.jpg" rel="lightbox[1862]"><img class="aligncenter size-full wp-image-1874" title="images" src="http://blog.mazenod.fr/wp-content/uploads/2011/03/images.jpg" alt="images postgreSQL & xampp portable sous windows" width="259" height="194" /></a></p>
<p>La première des choses à faire est ensuite de créer un cluster en tapant</p>
<div class="codecolorer-container bash blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:300px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">Z:\MyApps\xampp\pgsql\bin\initdb.exe <span style="color: #660033;">-D</span> ..\data<br />
<br />
Les fichiers de ce cluster appartiendront à l<span style="color: #ff0000;">'utilisateur « mazenovi».<br />
Le processus serveur doit également lui appartenir.<br />
<br />
Le cluster sera initialisé avec la locale French_France.1252.<br />
L'</span>encodage par défaut des bases de données a été configuré en conséquence<br />
avec WIN1252.<br />
La configuration de la recherche plein texte a été initialisée à « french ».<br />
<br />
correction des droits sur le répertoire existant ..<span style="color: #000000; font-weight: bold;">/</span>data... ok<br />
création des sous-répertoires... ok<br />
sélection de la valeur par défaut de max_connections... <span style="color: #000000;">100</span><br />
sélection des valeurs par défaut de shared_buffers<span style="color: #000000; font-weight: bold;">/</span>max_fsm_pages... 32MB<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">204800</span><br />
création des fichiers de configuration... ok<br />
création de la base de données template1 dans ..<span style="color: #000000; font-weight: bold;">/</span>data<span style="color: #000000; font-weight: bold;">/</span>base<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">1</span>... ok<br />
initialisation de pg_authid... ok<br />
initialisation des dépendances... ok<br />
création des vues système... ok<br />
chargement de la description des objets système... ok<br />
création des conversions... ok<br />
création des dictionnaires... ok<br />
initialisation des droits sur les objets internes... ok<br />
création <span style="color: #c20cb9; font-weight: bold;">du</span> schéma d<span style="color: #ff0000;">'informations... ok<br />
lancement du vacuum sur la base de données template1... ok<br />
copie de template1 vers template0... ok<br />
copie de template1 vers postgres... ok<br />
<br />
ATTENTION : active l'</span>authentification « trust » pour les connexions<br />
locales.<br />
Vous pouvez modifier ceci en éditant pg_hba.conf ou en utilisant l<span style="color: #ff0000;">'option -A<br />
au prochain lancement d'</span>initdb.<br />
<br />
Succès. Vous pouvez maintenant lancer le serveur de bases de données par :<br />
<br />
<span style="color: #ff0000;">&quot;postgres&quot;</span> <span style="color: #660033;">-D</span> <span style="color: #ff0000;">&quot;../data&quot;</span><br />
ou<br />
<span style="color: #ff0000;">&quot;pg_ctl&quot;</span> <span style="color: #660033;">-D</span> <span style="color: #ff0000;">&quot;../data&quot;</span> <span style="color: #660033;">-l</span> journal_applicatif start</div></div>
<p><strong>N.B. </strong>le cluster appartient à l&#8217;utilisateur système avec lequel il est créé c&#8217;est important pour la suite!</p>
<p>pour lancer le serveur</p>
<div class="codecolorer-container bash blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #7a0874; font-weight: bold;">cd</span> Z:\MyApps\xampp\pgsql\bin<br />
<br />
<span style="color: #ff0000;">&quot;pg_ctl&quot;</span> <span style="color: #660033;">-D</span> <span style="color: #ff0000;">&quot;../data&quot;</span> <span style="color: #660033;">-l</span> journal_applicatif start</div></div>
<p>vous pouvez déjà jouer avec pgAdmin3 en entrant l&#8217;adresse de votre serveur (127.0.01 ou localhost) et le login mot de passe de l&#8217;utilisateur que vous avez utilisez pour créer le cluster. Mais il s&#8217;agit ici de faire fonctionner postgreSQL avec php. On va donc décommenter deux extensions dans le Z:\MyApps\xampp\php\php.ini</p>
<div class="codecolorer-container bash blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">; php driver to use postgreSQL databases<br />
<span style="color: #007800;">extension</span>=php_pgsql.dll<br />
; abstraction layer <span style="color: #000000; font-weight: bold;">for</span> PDO<br />
<span style="color: #007800;">extension</span>=php_pdo_pgsql.dll</div></div>
<p>Mais là vous risquez d&#8217;être victime de message d&#8217;erreur car PostgreSQl a besoin de quelques dll pour fonctionner sous windows. Afin de garder l&#8217;installation portable il faut ajouter \MyApps\xampp\pgsql\bin au path, car ce répertoire contient les dll nécessaires (et évite du coup d&#8217;avoir à les copier dans c:\windows\system32).</p>
<p><a href="http://blog.mazenod.fr/wp-content/uploads/2011/03/environnement.png" rel="lightbox[1862]"><img class="aligncenter size-full wp-image-1864" title="environnement" src="http://blog.mazenod.fr/wp-content/uploads/2011/03/environnement.png" alt="environnement postgreSQL & xampp portable sous windows" width="578" height="420" /></a></p>
<p>Afin de tester que postgreSQL fonctionne bien avec php je vous propose d&#8217;installer phpPgAdmin en le téléchargeant sur le site officiel http://phppgadmin.sourceforge.net/ puis en le décompressant dans Z:/MyApps/xampp/phpPgAdmin/</p>
<p>Afin de le rendre visible ajouter dans Z:\MyApps\xampp\apache\conf\extra\httpd-xampp.conf</p>
<div class="codecolorer-container bash blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">Alias <span style="color: #000000; font-weight: bold;">/</span>phppgadmin <span style="color: #ff0000;">&quot;Z:/MyApps/xampp/phpPgAdmin/&quot;</span><br />
<br />
<span style="color: #000000; font-weight: bold;">&amp;</span>lt;Directory <span style="color: #ff0000;">&quot;Z:/MyApps/xampp/phpPgAdmin&quot;</span><span style="color: #000000; font-weight: bold;">&amp;</span>gt;<br />
AllowOverride AuthConfig<br />
<span style="color: #000000; font-weight: bold;">&amp;</span>lt;<span style="color: #000000; font-weight: bold;">/</span>Directory<span style="color: #000000; font-weight: bold;">&amp;</span>gt;</div></div>
<p>et modifier</p>
<div class="codecolorer-container bash blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000; font-weight: bold;">&amp;</span>lt;LocationMatch <span style="color: #ff0000;">&quot;^/(?i:(?:xampp|security|licenses|phpmyadmin|phppgadmin|webalizer|server-status|server-info))&quot;</span><span style="color: #000000; font-weight: bold;">&amp;</span>gt;<br />
Order deny,allow<br />
Deny from all<br />
Allow from 127.0.0.0<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">8</span><br />
ErrorDocument <span style="color: #000000;">403</span> <span style="color: #000000; font-weight: bold;">/</span>error<span style="color: #000000; font-weight: bold;">/</span>HTTP_XAMPP_FORBIDDEN.html.var<br />
<span style="color: #000000; font-weight: bold;">&amp;</span>lt;<span style="color: #000000; font-weight: bold;">/</span>LocationMatch<span style="color: #000000; font-weight: bold;">&amp;</span>gt;</div></div>
<p>éditer également selon vos besoins le fichier de configuration de phpPgAdmin Z:\MyApps\xampp\phpPgAdmin\conf\config.inc.php</p>
<p>ouvrez maintenant http://localhost/phppgadmin dans votre navigateur et saisissez les login mot de passe de l&#8217;utilisateur associé au cluster</p>
<p><a href="http://blog.mazenod.fr/wp-content/uploads/2011/03/phppgadmin.png" rel="lightbox[1862]"><img class="aligncenter size-full wp-image-1867" title="phppgadmin" src="http://blog.mazenod.fr/wp-content/uploads/2011/03/phppgadmin.png" alt="phppgadmin postgreSQL & xampp portable sous windows" width="591" height="183" /></a></p>
<p>&nbsp;</p>
<p>A vous postgreSQL</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.mazenod.fr/2011/03/postgresql-xampp-portable-sous-windows/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>installation de symfony via PEAR avec UwAmp</title>
		<link>http://blog.mazenod.fr/2010/01/installation-de-symfony-via-pear-avec-uwamp/</link>
		<comments>http://blog.mazenod.fr/2010/01/installation-de-symfony-via-pear-avec-uwamp/#comments</comments>
		<pubDate>Sun, 31 Jan 2010 19:43:41 +0000</pubDate>
		<dc:creator>mazenovi</dc:creator>
				<category><![CDATA[dev]]></category>
		<category><![CDATA[gratuit]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[symfony]]></category>
		<category><![CDATA[windows]]></category>
		<category><![CDATA[www]]></category>

		<guid isPermaLink="false">http://blog.mazenod.fr/?p=827</guid>
		<description><![CDATA[<p><a href="http://blog.mazenod.fr/wp-content/uploads/2010/01/uwamp_logo.jpg"><img class="alignleft" style="margin-left: 20px; margin-right: 20px;" title="uwamp_logo" src="http://blog.mazenod.fr/wp-content/uploads/2010/01/uwamp_logo-300x135.jpg" alt="" width="300" height="135" /></a> Une plateforme entièrement portable, avec gestion des services et de la configuration via une interface graphique et qui permet d'utiliser plusieurs version de PHP?</p>
<p>C'est un environnement de dev pour ma Framakey!!</p>
]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblog.mazenod.fr%2F2010%2F01%2Finstallation-de-symfony-via-pear-avec-uwamp%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.mazenod.fr%2F2010%2F01%2Finstallation-de-symfony-via-pear-avec-uwamp%2F&amp;style=normal&amp;b=2" height="61" width="50" title="installation de symfony via PEAR avec UwAmp" alt=" installation de symfony via PEAR avec UwAmp" /><br />
			</a>
		</div>
<p><a href="http://blog.mazenod.fr/wp-content/uploads/2010/01/uwamp_logo.jpg" rel="lightbox[827]"></a>sorti en fin d&#8217;année 2009 UwAmp est un environnement de développement Apache MySQL PHP portable pour windows. Son installation est on ne peut plus simple puisqu&#8217;il suffit de le télécharger et de le dézipper (dans z:\Apps\UwAmp par exemple) pour l&#8217;utiliser.</p>
<p>C&#8217;est sans aucun doute le plus sexy de tous les environnements de développement PHP pour windows (<a href="http://www.wampserver.com/">wampserver2</a>, successeur du défunt Wamp5, <a href="http://www.apachefriends.org/en/xampp.html">xampp</a> , et <a href="http://www.easyphp.org/">easyPHP</a>), en effet son interface de maintenance est riche et ergonomique</p>
<p style="text-align: center;"><a href="http://blog.mazenod.fr/wp-content/uploads/2010/01/screenshot.2.jpg" rel="lightbox[827]"><img class="aligncenter size-medium wp-image-829" title="UwAmp" src="http://blog.mazenod.fr/wp-content/uploads/2010/01/screenshot.2-268x300.jpg" alt="screenshot.2 268x300 installation de symfony via PEAR avec UwAmp" width="268" height="300" /></a></p>
<p>Elle permet notamment de passer d&#8217;une version à une autre de PHP en 1 clic, ce qui n&#8217;est pas négligeable.</p>
<p>Elle propose des interfaces de gestion simplifiées pour la configuration de PHP (extensions et variables du fichier  php.ini)</p>
<p style="text-align: center;"><a href="http://blog.mazenod.fr/wp-content/uploads/2010/01/screenshot.4.jpg" rel="lightbox[827]"><img class="aligncenter size-medium wp-image-830" title="config extension php" src="http://blog.mazenod.fr/wp-content/uploads/2010/01/screenshot.4-300x234.jpg" alt="screenshot.4 300x234 installation de symfony via PEAR avec UwAmp" width="300" height="234" /></a></p>
<p style="text-align: center;"><a href="http://blog.mazenod.fr/wp-content/uploads/2010/01/screenshot.4.jpg" rel="lightbox[827]"></a><a href="http://blog.mazenod.fr/wp-content/uploads/2010/01/screenshot.5.jpg" rel="lightbox[827]"><img class="aligncenter size-medium wp-image-831" title="config php.ini" src="http://blog.mazenod.fr/wp-content/uploads/2010/01/screenshot.5-300x234.jpg" alt="screenshot.5 300x234 installation de symfony via PEAR avec UwAmp" width="300" height="234" /></a></p>
<p>ainsi que pour celle d&#8217;apache (configuration de virtual hosts &amp; modules apache)</p>
<p><a href="http://blog.mazenod.fr/wp-content/uploads/2010/01/screenshot.6.jpg" rel="lightbox[827]"><img class="aligncenter size-medium wp-image-832" title="screenshot.6" src="http://blog.mazenod.fr/wp-content/uploads/2010/01/screenshot.6-300x265.jpg" alt="screenshot.6 300x265 installation de symfony via PEAR avec UwAmp" width="300" height="265" /></a></p>
<p><a href="http://blog.mazenod.fr/wp-content/uploads/2010/01/screenshot.7.jpg" rel="lightbox[827]"><img class="aligncenter size-medium wp-image-833" title="screenshot.7" src="http://blog.mazenod.fr/wp-content/uploads/2010/01/screenshot.7-300x265.jpg" alt="screenshot.7 300x265 installation de symfony via PEAR avec UwAmp" width="300" height="265" /></a></p>
<p>Pour les barbus, les fichiers php.ini et httpd.conf sont toujours accessibles via un bouton, et il est même possible de paramétrer son éditeur de texte  préféré (paths portables acceptés!) en cliquant sur le bouton &laquo;&nbsp;préférences&nbsp;&raquo;.</p>
<p>Dans la séries des raccourcis vous pourrez accéder en un clic</p>
<ul>
<li>à la page d&#8217;accueil de votre répertoire racine &#8211; http://localhost/</li>
<li>au répertoire contenant les virtual hosts &#8211; z:\Apps\UwAmp\www\</li>
<li>à phpMyAdmin &#8211; http://localhost/mysql/ (à noter que le mot de passe root de MySQL par défaut est root)</li>
<li>à un phpinfo() &#8211; http://localhost/uwamp/phpinfo.php</li>
<li>à SQLite Database Browser qui vous permettra de gérer vos bases de données SQLite</li>
</ul>
<p>et en cadeau bonus</p>
<ul>
<li>Les logs access du serveur apache</li>
<li>Les logs error du serveur apache</li>
<li>Les logs du serveur MySQL</li>
<li>à la suppression des fichiers de log sus cités</li>
<li>à la suppression des fichiers de sessions PHP</li>
</ul>
<p>&#8230;</p>
<p>Le petit bémol que je mettrais par rapport à l&#8217;installation de <a href="../2009/11/environnement-de-developpement-portable-pour-symfony-framakey/">xampp portable</a>, que j&#8217;ai déjà documentée, est que PEAR n&#8217;est pas préinstallé.</p>
<p>Pour utiliser les commandes PHP et mysql sans se préoccupper de leur path, suivez <a href="http://blog.mazenod.fr/2009/11/environnement-de-developpement-portable-pour-symfony-framakey/#path">les explications suivantes</a> en remplaçant ;\Apps\xampp\php\;\Apps\xampp\mysql\bin\ par  ;\Apps\UwAmp\apache\php_5.3.1;\Apps\UwAmpp\mysql\bin\. N&#8217;oubliez pas de fermer et de rouvrir votre session pour prendre en compte le nouveau Path (n&#8217;oubliez pas non plus de laisser un commentaire si vous avez une meilleure solution).</p>
<p>ouvrez ensuite un prompt de commande et tapez</p>
<pre class="php:nogutter">cd z:\Apps\UwAmp\apache\php_5.31
go-pear.bat</pre>
<p>si vous ne vous mettez pas dans le dossier  vous allez obtenir un message d&#8217;erreur du genre</p>
<p>Could not open input file: PEAR\go-pear.phar<br />
Appuyez sur une touche pour continuer&#8230;</p>
<p>Sinon PEAR vous demandera si vous souhaitez faire une installation système ou locale. La différence réside essentiellement dans la localisation du fichier pear.ini. Si vous voulez comme moi jouer avec plusieurs installations de PEAR choisissez local. En effet l&#8217;installation système installe le fichier pear.ini dans c:\windows, ce qui le rendra commun à toutes  vos installations de PEAR. L&#8217;installation local permet de ranger le pear.ini dans le répertoire de la commande php auquel CETTE commande PEAR est associée &#8230;</p>
<p>Une fois le choix fait vous pouvez choisir les options par défaut lors du process d&#8217;installation</p>
<p>ensuite pour installer symfony 1.0</p>
<pre class="php:nogutter">pear upgrade PEAR
pear channel-discover pear.symfony-project.com
pear install symfony/symfony-1.0.21
symfony -V</pre>
<p>Vous êtes alors prêt pour <a href="http://www.symfony-project.org/askeet/1_0/en/">askeet</a>.</p>
<p>Pour installer la dernière version courante de symfony1.4.1</p>
<pre class="php:nogutter">pear install symfony/symfony</pre>
<p>Vous êtes alors prêt pour <a href="http://www.symfony-project.org/jobeet/1_4/Doctrine/en/">jobeet</a>.</p>
<p>L&#8217;avantage c&#8217;est que vous disposez d&#8217;une installation de PEAR par version de PHP, ce qui est idéale pour avoir plusieurs version de symfony sur votre plateforme de développement!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.mazenod.fr/2010/01/installation-de-symfony-via-pear-avec-uwamp/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Design Pattern MVC &#8211; zoom sur la couche modèle : DAL / DAO / ORM / CRUD</title>
		<link>http://blog.mazenod.fr/2010/01/design-pattern-mvc-zoom-sur-la-couche-modele-dal-dao-orm-crud/</link>
		<comments>http://blog.mazenod.fr/2010/01/design-pattern-mvc-zoom-sur-la-couche-modele-dal-dao-orm-crud/#comments</comments>
		<pubDate>Sun, 17 Jan 2010 14:30:41 +0000</pubDate>
		<dc:creator>mazenovi</dc:creator>
				<category><![CDATA[dev]]></category>
		<category><![CDATA[design pattern]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[www]]></category>

		<guid isPermaLink="false">http://blog.mazenod.fr/?p=739</guid>
		<description><![CDATA[<p><a href="http://blog.mazenod.fr/wp-content/uploads/2010/01/ORMNam_5.jpg"><img class="alignleft" style="margin-left: 20px; margin-right: 20px;" title="ORMNam_5" src="http://blog.mazenod.fr/wp-content/uploads/2010/01/ORMNam_5-240x300.jpg" alt="" width="240" height="300" /></a></p>
<p>L'ORM Un <strong>object-relational mapping</strong> (<strong>mapping objet-relationnel</strong> en pseudo français) est considéré comme le Vietnam de l'informatique ... Une bataille obligée qui ne possède pas de bonne solution ...</p>
<p>Sous cette acronyme se cache en fait la possibilité pour les développeurs de manipuler des données en provenance d'une base de données sous forme d'objets.</p>
<p>L'idée est ici d'effectuer une première approche en identifiant et en disséquant les différentes strates que sont</p>
<ul>
<li>La DAL</li>
<li>le DAO</li>
<li>L'ORM proprement dite</li>
</ul>
<p>Des concepts sont souvent galvaudés ...</p>
]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblog.mazenod.fr%2F2010%2F01%2Fdesign-pattern-mvc-zoom-sur-la-couche-modele-dal-dao-orm-crud%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.mazenod.fr%2F2010%2F01%2Fdesign-pattern-mvc-zoom-sur-la-couche-modele-dal-dao-orm-crud%2F&amp;style=normal&amp;b=2" height="61" width="50" title="Design Pattern MVC   zoom sur la couche modèle : DAL / DAO / ORM / CRUD" alt=" Design Pattern MVC   zoom sur la couche modèle : DAL / DAO / ORM / CRUD" /><br />
			</a>
		</div>
<h2><a href="http://blog.mazenod.fr/wp-content/uploads/2010/01/ORMNam_5.jpg" rel="lightbox[739]"></a>Design Pattern MVC</h2>
<p>Voilà deux ans que je fais un cours, suivi d’un petit projet traitant du design Pattern MVC.  Le projet est à écrire en PHP5, avec une base de données MySQL comme support de stockage des données, l’architecture MVC est donc à implémenter dans un contexte purement web. Le paradigme objet est tout indiqué quand il s&#8217;agit d&#8217;écrire et d&#8217;agencer des composants logiciels, c&#8217;est donc celui qui sera adopté dans toute la suite.</p>
<p>Il y a bien entendu beaucoup de projets existants implémentant le design Pattern MVC en PHP, mais le propos du cours est plutôt de réaliser un cas pratique d’implémentation afin de bien saisir les bien faits du design pattern  MVC.</p>
<p>En effet l’utilisation d’un design pattern architectural en PHP, s’oppose à la pratique empirique de ce langage qui consiste à mélanger les connexions et accès à la base de données, avec le traitement des données et leur affichage. Dans ce cas il est alors commun d’avoir dans un seul script: du PHP, du SQL, du Javascript et du CSS dans les attributs des balises HTML soit pas moins de 5 langages distincts.</p>
<p>Au même titre qu’il est conseillé dans la présentation de séparer l’HTML, qui structure le document, du CSS, qui l’habille, il est conseillé d’<a href="http://www.do-as-i-say.com/notes/2009/09/design-patterns-symfony-explique-a-ma-maman-2/">utiliser un design pattern architectural pour structurer une application web</a>.</p>
<p>Pour mémoire cette architecture permet d’organiser une application en 3 couches distinctes à savoir :</p>
<ul>
<li>le modèle, qui contient la logique métier;</li>
<li>la vue, qui regroupe tout ce qui a trait à la présentation (des données / comme des interactions utilisateur);</li>
<li>le contrôleur, qui répond à des interactions utilisateurs en provenance de la vue, en appelant des traitements mis à disposition sous forme de méthode par le modèle, afin de nourrir la vue associée au traitement demandé par l&#8217;utilisateur.</li>
</ul>
<p style="text-align: center;"><a href="http://blog.mazenod.fr/wp-content/uploads/2010/01/MVC_final.png" rel="lightbox[739]"><img class="aligncenter" title="MVC_final" src="http://blog.mazenod.fr/wp-content/uploads/2010/01/MVC_final.png" alt="MVC final Design Pattern MVC   zoom sur la couche modèle : DAL / DAO / ORM / CRUD" width="585" height="315" /></a></p>
<p>Si vous pratiquez PHP et n&#8217;avez jamais utilisé le design pattern MVC, je vous recommande la lecture de : &laquo;&nbsp;<a href="http://trac.symfony-project.org/wiki/Documentation/fr_FR/book/1.0/trunk/02-Exploring-Symfony-s-Code">comment convertir une application PHP standard en une application basée sur l’architecture MVC</a>&laquo;&nbsp;.</p>
<p>Le propos de ce billet n’est pas de vanter <a href="http://www.do-as-i-say.com/notes/2010/01/symfony-explique-a-ma-maman-4eme-partie-le-mvc/">les mérites du design pattern MVC</a>, car ils sont en général bien compris par mes étudiants. C&#8217;est plutôt d’en détailler la couche modèle dont la structure est assez dure à disséquer. J’ai moi-même pas mal lu et beaucoup débattu, avec le camarade <a href="http://willdurand.fr">will durand</a> notamment, avant d&#8217;arriver à isoler chaque composant de cette couche.</p>
<p><a href="http://blog.mazenod.fr/wp-content/uploads/2010/01/Zoom_modele.png" rel="lightbox[739]"><img class="aligncenter size-full wp-image-741" title="Zoom_modele" src="http://blog.mazenod.fr/wp-content/uploads/2010/01/Zoom_modele.png" alt="Zoom modele Design Pattern MVC   zoom sur la couche modèle : DAL / DAO / ORM / CRUD" width="568" height="268" /></a></p>
<h2>le Modèle</h2>
<p>Sous sa forme la plus brute, la couche modèle peut être vu comme les « données ». Par données on entend tout ce qui est persistant, c&#8217;est-à-dire tout ce qu’on pourra lire à partir d’une source, et modifier pour le relire plus tard si besoin est. Dans une logique de découplage, il est de bon ton d’essayer de s’affranchir le plus possible de la forme brute des données. C’est ce que va faire le modèle en transformant des données brutes en objets structurés, utilisables simplement par la couche inférieure : le contrôleur.</p>
<p>Pour réaliser ce découplage le modèle utilise 3 couches d’abstraction :</p>
<ul>
<li>La DAL (Data Access Layer) : couche abstraction de données</li>
<li>Le DAO (Data Access Object) : objet d’accès aux données</li>
<li>L’ORM (Object / Relation Mapping) : Mapping objet / relationnel</li>
</ul>
<p><a href="http://blog.mazenod.fr/wp-content/uploads/2010/01/DAL_final.png" rel="lightbox[739]"><img class="aligncenter size-full wp-image-766" title="DAL_final" src="http://blog.mazenod.fr/wp-content/uploads/2010/01/DAL_final.png" alt="DAL final Design Pattern MVC   zoom sur la couche modèle : DAL / DAO / ORM / CRUD" width="555" height="323" /></a></p>
<p>Pour l&#8217;exemple je vous propose de partir du diagramme UML suivant</p>
<p><a href="http://blog.mazenod.fr/wp-content/uploads/2010/01/uml.png" rel="lightbox[739]"><img class="aligncenter size-full wp-image-754" title="uml" src="http://blog.mazenod.fr/wp-content/uploads/2010/01/uml.png" alt="uml Design Pattern MVC   zoom sur la couche modèle : DAL / DAO / ORM / CRUD" width="315" height="152" /></a></p>
<p>qui donne le MLD (schéma de base de données) suivant</p>
<p><a href="http://blog.mazenod.fr/wp-content/uploads/2010/01/mld.png" rel="lightbox[739]"><img class="aligncenter size-full wp-image-755" title="mld" src="http://blog.mazenod.fr/wp-content/uploads/2010/01/mld.png" alt="mld Design Pattern MVC   zoom sur la couche modèle : DAL / DAO / ORM / CRUD" width="529" height="470" /></a></p>
<h3>La DAL</h3>
<p>La DAL Permet de s’abstraire du support des données. Pour se faire elle met à disposition des méthodes génériques permettant d’accomplir des actions de maintenances sur les données. Les actions les plus communes sont regroupées sous l’acronyme CRUD (Create Read Update Delete). Basiquement la DAL va donc mettre à disposition des méthodes permettant d’ajouter, mettre à jour, lire, supprimer un enregistrement, et ce quelque soit le support de stockage des donnéees.</p>
<p>La généricité par rapport au stockage est en général matérialisée par un paramètre permettant de spécifier la nature du support (on appelle ça des drivers). Ainsi les méthodes CRUD associées au support de stockage sont utilisées de manière transparente par le développeur. Concrètement il n’y a donc en théorie qu’un paramètre à changer pour qu’une application utilisant une DAL puisse changer de support.</p>
<p>D’un point de vue strictement théorique la DAL devrait offrir la possibilité de maintenir des données dans n&#8217;importe quelle base de données, dans des fichiers texte, dans des fichiers xml …</p>
<p>D’un point de vue pratique, en PHP, une DAL utilise toujours un SGBD. Son rôle est donc de rendre l’applicatif qui l’utilise (la DAL) portable par rapport au SGBD utilisé.</p>
<p>Les DAL PHP que je connais sont <a href="http://pear.php.net/package/DB">Pear DB</a> (la première que j&#8217;ai utilisé), <a href="http://creole.phpdb.org/trac/wiki/Documentation/CreoleGuide">Creole</a>, et <a href="http://php.net/manual/fr/book.pdo.php">PDO</a> qui tend à devenir le standard en PHP, puisque disponible sous forme d&#8217;extension PHP.</p>
<h3>Le DAO</h3>
<p>Le Dao a pour but de transformer les données contenues dans une bases de données en objets et inversement</p>
<p>Pour se faire il va faire correspondre (de manière bijective &#8211; ca veut dire qu&#8217;on peut rajouter &laquo;&nbsp;et inversement&nbsp;&raquo; à la fin de chacun des points suivants)</p>
<ul>
<li>une table (appelée aussi relation) à une liste d’objets</li>
<li>une ligne d&#8217;une table (appelée aussi tuple) à un objet</li>
<li>un champs de base de données à un attribut d’objet</li>
<li>une valeur d’un champs à une valeur d’attribut d’un objet</li>
</ul>
<p>Dans notre exemple les classes issues du DAO seront au minimum</p>
<p style="text-align: center;"><a href="http://blog.mazenod.fr/wp-content/uploads/2010/01/UML_DAO.png" rel="lightbox[739]"><img class="aligncenter size-full wp-image-794" title="UML_DAO" src="http://blog.mazenod.fr/wp-content/uploads/2010/01/UML_DAO.png" alt="UML DAO Design Pattern MVC   zoom sur la couche modèle : DAL / DAO / ORM / CRUD" width="479" height="511" /></a></p>
<p>je dis au minimum, car ces classes pourraient avoir un peu plus de &#8230; classe! avec des getters et des setters.</p>
<p>Techniquement la DAO interroge le SGBD via la DAL sur la structure des tables afin de maintenir la correspondance entre les champs des tables de la base de données et les attributs des objets. Il y a au moins deux façons de réaliser celà:</p>
<ul>
<li>soit en générant un code PHP minimale fonction de la structure de la base de données (il faudra alors regénérer à chaque modification du schéma de base de données).</li>
<li>soit en utilisant les méthodes magiques PHP (comme <a href="http://www.php.net/manual/en/language.oop5.overloading.php">__get, __set ou __call et ___callStatic</a>) et le <a href="http://php.net/manual/fr/language.oop5.late-static-bindings.php">late static binding de PHP 5.3</a></li>
</ul>
<p>Notez qu&#8217;à ce niveau là le seul code logique que possède les objets construits à partir d’un DAO sont les méthodes CRUD qui vont permettre d’aller le lire, le modifier, le supprimer en base. En cela les objets issus d’un DAO pourraient être appelés des POPO  (rigolez pas! c&#8217;est pas moi qui l&#8217;ai dit le premier) par analogie aux <a href="http://fr.wikipedia.org/wiki/Plain_Old_Java_Object">POJO Java (Plain Old Java Object)</a></p>
<p>Notez également que dans le schéma de présentation des couches d&#8217;abstraction du modèle,  le DAO utilise la DAL, mais que ce n’est pas une vraie obligation : un DAO hardcodé en mysql resterait un DAO … simplement non portable au niveau du SGBD.</p>
<p>Notez enfin que chaque classe est isolée, c&#8217;est à dire qu&#8217;il n&#8217;existe pas de code logique qui permette une quelconque interaction entre elles.</p>
<h3>L’ORM</h3>
<p>L’ORM a pour but de transformer les relations entre les tables d’ une base de données en relations entre objets et inversement</p>
<p>Elle va typiquement se préoccuper de matérialiser les clés étrangères par des dépendances entre objets<a href="http://blog.mazenod.fr/wp-content/uploads/2010/01/UML_ORM.png" rel="lightbox[739]"><img class="aligncenter size-full wp-image-777" title="UML_ORM" src="http://blog.mazenod.fr/wp-content/uploads/2010/01/UML_ORM.png" alt="UML ORM Design Pattern MVC   zoom sur la couche modèle : DAL / DAO / ORM / CRUD"  /></a>L&#8217;intérêt réside dans le fait que les méthodes de la couche ORM, renvoient ou prennent en paramètres des listes d&#8217;objets. Par exemple $post-&gt;getComments() renverra une liste d&#8217;objets de classe Comment. Ces objets Comment seront sous forme de POPOS, c&#8217;est en celà que l&#8217;ORM utilise le DAO.</p>
<p>Techniquement l’ORM utilise soit les contraintes d’intégrité référentielle, soit une certaine logique de nommage, pour déterminer les clés étrangères. Dans les deux cas elle passe par la DAL.</p>
<p>Comme pour le DAO, les stratégies de génération de code ou d&#8217;utilisation des méthodes magiques peuvent être adoptées.</p>
<p>Comme pour le DAO également, l&#8217;utilisation d&#8217;une DAL est conseillée mais pas obligatoire.</p>
<p><a href="http://propel.phpdb.org">propel</a> et <a href="http://www.doctrine-project.org/">doctrine</a> sont deux <a href="http://trac.symfony-project.org/wiki/ComparingPropelAndDoctrine">ORM PHP typiques</a>.</p>
<h3>La couche métier</h3>
<p>Le but des couhes précédentes est de soulager la couche métier. Si la couche métier peut hériter des méthodes de la DAO et de l&#8217;ORM, nous aurons des objets présentant toutes les méthodes pour les gérer en base.</p>
<p><a href="http://blog.mazenod.fr/wp-content/uploads/2010/01/UML_METIER.png" rel="lightbox[739]"><img class="aligncenter size-full wp-image-778" title="UML_METIER" src="http://blog.mazenod.fr/wp-content/uploads/2010/01/UML_METIER.png" alt="UML METIER Design Pattern MVC   zoom sur la couche modèle : DAL / DAO / ORM / CRUD"  /></a></p>
<p>La couche métier est sensée ne contenir que la logique métier, c&#8217;est à dire propre à l&#8217;objet qu&#8217;elle représente. Ce sera effectivement le cas dans la class Post par exemple, où l&#8217;on pourra n&#8217;avoir qu&#8217;une seule méthode Post::getArchives(), qui retourne une liste de liste contenant les archives du type</p>
<pre class="php:nogutter">Array(
'2009' =&gt; Array('janvier' =&gt; 1),
'2008' =&gt; Array('septembre' =&gt; 7, 'octobre' =&gt; 2, 'novembre' =&gt; 1, 'décembre' =&gt; 1)
)</pre>
<p>Cette méthode fait bien parti de la couche métier puisqu&#8217;elle est propre au concept de post (ou billet) de blog.</p>
<p>En appelant cette méthode le contrôleur pourra nourrir une vue qui n&#8217;aura alors qu&#8217;un double foreach à faire pour présenter les archives dans le menu de droite.</p>
<h2>conclusion</h2>
<p>Les concepts que je viens de détailler sont souvent amalgamés, aussi il est souvent difficile de les cerner précisément. J&#8217;ai essayé d&#8217;illustrer le rôle de chacun par un exemple simpliste, mais je ne prétends détenir aucune vérité sur le sujet et les commentaires sont ouverts pour accueillir vos questions, suggestions et corrections</p>
<p>le mld a été généré avec <a href="http://www.fabforce.net/dbdesigner4/">DBDesigner4</a> et tout les diagrammes uml ont été générés avec <a href="http://yuml.me/diagram/scruffy/class/draw">yUML</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.mazenod.fr/2010/01/design-pattern-mvc-zoom-sur-la-couche-modele-dal-dao-orm-crud/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>environnement de développement portable pour symfony #FramaKey</title>
		<link>http://blog.mazenod.fr/2009/11/environnement-de-developpement-portable-pour-symfony-framakey/</link>
		<comments>http://blog.mazenod.fr/2009/11/environnement-de-developpement-portable-pour-symfony-framakey/#comments</comments>
		<pubDate>Mon, 16 Nov 2009 09:14:46 +0000</pubDate>
		<dc:creator>mazenovi</dc:creator>
				<category><![CDATA[bricolage]]></category>
		<category><![CDATA[dev]]></category>
		<category><![CDATA[gratuit]]></category>
		<category><![CDATA[install]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[windows]]></category>

		<guid isPermaLink="false">http://blog.mazenod.fr/?p=519</guid>
		<description><![CDATA[<p><a href="http://blog.mazenod.fr/wp-content/uploads/2009/11/xampp.png"><img class="alignleft" title="xampp" src="http://blog.mazenod.fr/wp-content/uploads/2009/11/xampp.png" alt="" width="154" height="154" /></a>Je vous propose un tuto visant à faciliter l'installation du framework symfony 1.0 via PEAR, sur un environnement de développement portable et complet : XAMPP!</p>
]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblog.mazenod.fr%2F2009%2F11%2Fenvironnement-de-developpement-portable-pour-symfony-framakey%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.mazenod.fr%2F2009%2F11%2Fenvironnement-de-developpement-portable-pour-symfony-framakey%2F&amp;style=normal&amp;b=2" height="61" width="50" title="environnement de développement portable pour symfony #FramaKey" alt=" environnement de développement portable pour symfony #FramaKey" /><br />
			</a>
		</div>
<p><span><a href="http://blog.mazenod.fr/wp-content/uploads/2009/11/xampp.png" rel="lightbox[519]"></a>Le propos de cet article est de disposer d&#8217;un environnement de développement complet et portable pour le framework PHP <a href="http://www.symfony-project.org/">symfony</a>. Les paths sont ceux utilisés par la <a href="http://blog.mazenod.fr/2009/10/framakey-ubuntu-remix-100-portable-100-libre-et-multiplateforme-aussi-un-peu/">Framakey Unbuntu Remix</a>, dont j&#8217;ai déjà parlé &#8211; je suppose dans toute la suite de ce post que vous voyez votre clé sur le lecteur <em>z:\</em> dans votre poste de travail. <a href="http://www.symfony-project.org/">symfony</a> sera installé via la commande PEAR, comme dans <a href="http://www.symfony-project.org/askeet/1_0/en/">askeet</a> et non en stand-alone comme dans <a href="http://www.symfony-project.org/jobeet/1_2/Doctrine/en/"><span> </span>jobeet</a>.</span></p>
<h2><span>installation et configuraiton de xampp portable<br />
</span></h2>
<p><a href="http://www.apachefriends.org/fr/xampp.html">xampp</a> est l&#8217;environnement Apache / MySQL / PHP portable le plus stable que j&#8217;ai trouvé à l&#8217;heure actuelle. Je garde toutefois un œil sur le tout jeune, mais néanmoins prometteur, <a href="http://www.uwamp.com/">uWamp</a> (soumis par le camarade <a href="http://www.willdurand.fr/">@couac</a>).<br />
il faudra télécharger la <a href="http://www.apachefriends.org/en/xampp-windows.html#641">version zip de xampp</a> et la dézipper dans <em>z:\Apps\xampp</em> par exemple</p>
<p>Dans un premier temps il faut exécuter le batch <em>z:\Apps\xampp\setup_xampp.bat</em> (il faudra le faire à chaque fois que le path change)</p>
<p style="text-align: center;"><a href="http://blog.mazenod.fr/wp-content/uploads/2009/11/setup_xampp_1.jpg" rel="lightbox[519]"><br />
</a><a href="http://blog.mazenod.fr/wp-content/uploads/2009/11/setup_xampp_2.jpg" rel="lightbox[519]"><br />
</a><a href="http://blog.mazenod.fr/wp-content/uploads/2009/11/setup_xampp_2.jpg" rel="lightbox[519]"><img class="size-medium wp-image-671 aligncenter" title="setup_xampp_1" src="http://blog.mazenod.fr/wp-content/uploads/2009/11/setup_xampp_1-300x151.jpg" alt="setup xampp 1 300x151 environnement de développement portable pour symfony #FramaKey" width="300" height="151" /><img class="aligncenter size-medium wp-image-672" title="setup_xampp_2" src="http://blog.mazenod.fr/wp-content/uploads/2009/11/setup_xampp_2-300x151.jpg" alt="setup xampp 2 300x151 environnement de développement portable pour symfony #FramaKey" width="300" height="151" /></a><a href="http://blog.mazenod.fr/wp-content/uploads/2009/11/setup_xampp_3.jpg" rel="lightbox[519]"><img class="aligncenter size-medium wp-image-673" title="setup_xampp_3" src="http://blog.mazenod.fr/wp-content/uploads/2009/11/setup_xampp_3-300x151.jpg" alt="setup xampp 3 300x151 environnement de développement portable pour symfony #FramaKey" width="300" height="151" /></a><a href="http://blog.mazenod.fr/wp-content/uploads/2009/11/setup_xampp_4.jpg" rel="lightbox[519]"><img class="aligncenter size-medium wp-image-674" title="setup_xampp_4" src="http://blog.mazenod.fr/wp-content/uploads/2009/11/setup_xampp_4-300x151.jpg" alt="setup xampp 4 300x151 environnement de développement portable pour symfony #FramaKey" width="300" height="151" /></a><a href="http://blog.mazenod.fr/wp-content/uploads/2009/11/setup_xampp_5.jpg" rel="lightbox[519]"></a><a href="http://blog.mazenod.fr/wp-content/uploads/2009/11/setup_xampp_6.jpg" rel="lightbox[519]"><img class="aligncenter size-medium wp-image-676" title="setup_xampp_6" src="http://blog.mazenod.fr/wp-content/uploads/2009/11/setup_xampp_6-300x151.jpg" alt="setup xampp 6 300x151 environnement de développement portable pour symfony #FramaKey" width="300" height="151" /></a><a href="http://blog.mazenod.fr/wp-content/uploads/2009/11/setup_xampp_3.jpg" rel="lightbox[519]"><br />
</a><a href="http://blog.mazenod.fr/wp-content/uploads/2009/11/setup_xampp_4.jpg" rel="lightbox[519]"><br />
</a><a href="http://blog.mazenod.fr/wp-content/uploads/2009/11/setup_xampp_5.jpg" rel="lightbox[519]"><br />
</a><a href="http://blog.mazenod.fr/wp-content/uploads/2009/11/setup_xampp_6.jpg" rel="lightbox[519]"><br />
</a></p>
<p>normalement si vous taper <a href="http://localhost/xampp/">http://localhost/xampp/</a> dans votre navigateur  vous devriez arriver sur la page suivante</p>
<p><a href="http://blog.mazenod.fr/wp-content/uploads/2009/11/localhost_xampp.png" rel="lightbox[519]"><img class="aligncenter size-full wp-image-678" title="localhost_xampp" src="http://blog.mazenod.fr/wp-content/uploads/2009/11/localhost_xampp.png" alt="localhost xampp environnement de développement portable pour symfony #FramaKey" width="300" height="141" /></a></p>
<p>Ca y est! vous avez installé des services portables et fonctionnels &#8230;</p>
<p><a name="path"></a>Maintenant passons à la ligne de commande. En effet pour être tout à fait à l&#8217;aise, l&#8217;idéal est de pouvoir appeler l&#8217;interpréteur php (ainsi que la commande pear et les commandes mysql) sans avoir à se préoccupper du chemin pour y accéder. Pour cela il va falloir ajouter deux chemins supplémentaires dans la variable d&#8217;environnement PATH de windows.</p>
<p>Voici comment procéder sur windows 7 (la démarche pour Vista peut être adaptée à partir de ces <a href="http://notes.mazenod.fr/symfony-on-wamp-pret-pour-l-utilisation-d-eclipse-pdt-avec-plugins-sfdt.html">explications dans la section &laquo;&nbsp;mise à jour des variables d&#8217;environnement&nbsp;&raquo;</a>).</p>
<p style="text-align: center;"><a href="http://blog.mazenod.fr/wp-content/uploads/2009/11/environnement_1.jpg" rel="lightbox[519]"></a><a href="http://blog.mazenod.fr/wp-content/uploads/2009/11/environnement_1.jpg" rel="lightbox[519]"><img class="aligncenter size-medium wp-image-679" title="environnement_1" src="http://blog.mazenod.fr/wp-content/uploads/2009/11/environnement_1-300x226.jpg" alt="environnement 1 300x226 environnement de développement portable pour symfony #FramaKey" width="300" height="226" /></a><a href="http://blog.mazenod.fr/wp-content/uploads/2009/11/environnement_2.jpg" rel="lightbox[519]"><img class="size-medium wp-image-680 aligncenter" title="environnement_2" src="http://blog.mazenod.fr/wp-content/uploads/2009/11/environnement_2-300x226.jpg" alt="environnement 2 300x226 environnement de développement portable pour symfony #FramaKey" width="300" height="226" /></a><a href="http://blog.mazenod.fr/wp-content/uploads/2009/11/environnement_3.jpg" rel="lightbox[519]"><img class="size-medium wp-image-681 aligncenter" title="environnement_3" src="http://blog.mazenod.fr/wp-content/uploads/2009/11/environnement_3-259x300.jpg" alt="environnement 3 259x300 environnement de développement portable pour symfony #FramaKey" width="259" height="300" /></a><a href="http://blog.mazenod.fr/wp-content/uploads/2009/11/environnement_4.jpg" rel="lightbox[519]"><img class="size-medium wp-image-682 aligncenter" title="environnement_4" src="http://blog.mazenod.fr/wp-content/uploads/2009/11/environnement_4-271x300.jpg" alt="environnement 4 271x300 environnement de développement portable pour symfony #FramaKey" width="271" height="300" /></a><a href="http://blog.mazenod.fr/wp-content/uploads/2009/11/environnement_5.jpg" rel="lightbox[519]"><img class="size-medium wp-image-683 aligncenter" title="environnement_5" src="http://blog.mazenod.fr/wp-content/uploads/2009/11/environnement_5-300x115.jpg" alt="environnement 5 300x115 environnement de développement portable pour symfony #FramaKey" width="300" height="115" /></a></p>
<p>Notez les que nous n&#8217;avons pas spécifié de lettre dans les path que nous venons d&#8217;ajouter (;\Apps\xampp\php\;\Apps\xampp\mysql\bin\) &#8230;<br />
cela présente un avantage majeur : le path n&#8217;aura pas à être changé si la clé change de lettre;<br />
Mais aussi un inconvénient : la commande php ne peut être utilisée qu&#8217;à partir du lecteur de la clé USB (pour l&#8217;utilisation de la commande php pour symfony cela ne pose aucun problème).</p>
<p>Il faut savoir que les variables d&#8217;environnements dans un système d&#8217;exploitation sont initialisées à l&#8217;ouverture de la session d&#8217;un utilisateur. Dans la plupart des systèmes on peut forcer la relecture de ces variables, mais je n&#8217;ai jamais trouvé comment faire sous windows (les suggestions sont les bienvenues) &#8230; donc pour appliquer les changements qui viennent d&#8217;être effectués il faut fermer votre session et la rouvrir (ou de manière plus brutale redémarrer).</p>
<p>Une fois reconnecté, ouvrez un ligne de commande, positionnez vous dans le répertoire <em>z:\Apps\xampp</em> et tapez</p>
<pre class="bash:nogutter">php -v</pre>
<p>si vous voyez apparaître quelque chose du genre</p>
<pre class="bash:nogutter">PHP 5.3.0 (cli) (built: Jul  2 2009 21:08:11)
Copyright (c) 1997-2009 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2009 Zend Technologies</pre>
<p>c&#8217;est gagné!<br />
Il suffit maintenant de procéder à l&#8217;installation de symfony via PEAR. Ca tombe bien , la commande est déjà installé et accessible via la ligne de commande, il n&#8217;y a donc qu&#8217;à taper</p>
<pre class="bash:nogutter">pear upgrade PEAR
pear channel-discover pear.symfony-project.com
pear install symfony/symfony-1.0.21
symfony -V</pre>
<p>devrait maintenant afficher</p>
<pre class="bash:nogutter">symfony version 1.0.21</pre>
<p><strong>N.B.</strong> pour installer la version stable courante de symfony il suffit de lancer la commande</p>
<pre class="bash:nogutter">pear install symfony/symfony</pre>
<p>sans spécifier de numéro de version</p>
<p>Félicitation votre environnement est près &#8230;</p>
<h3>configuration des virtual hosts</h3>
<p>Pour utiliser les virtual hosts il vous faudra décommenter cette ligne</p>
<pre class="bash:nogutter">NameVirtualHost *:80</pre>
<p>Les vhosts et les alias peuvent s&#8217;écrire sans lettre de lecteur dans <em>z:\Apps\xampp\apache\conf\extra\httpd-vhosts</em></p>
<pre>#préserver le vhost localhost pour avoir accès à la page d'admin de xampp
&lt;virtualhost *:80&gt;
  ServerName localhost
  DocumentRoot /apps/xampp/htdocs
&lt;/virtualhost&gt;
#création d'un vhost dédié pour un projet symfony
&lt;virtualhost *:80&gt;
  ServerName vdm
  DocumentRoot /apps/xampp/htdocs/vdm/web
  &lt;directory "/Apps/xampp/htdocs/vdm/web/"&gt;
    AllowOverride All
  &lt;/directory&gt;
  #alias permettant d'accéder aux js / css / images symfony installés dans PEAR
  Alias /sf /apps/xampp/pear/data/symfony/web/sf
  #directive permettant de faire fonctionner l'alias précédent sous windows
  &lt;directory "/Apps/xampp/pear/data/symfony/web/"&gt;
    AllowOverride All
    Allow from All
  &lt;/directory&gt;
&lt;/virtuahHost&gt;</pre>
<p>Dernière étape, la moins fun,  il vous faudra ajouter le nom du vhost au fichier <em>c:\windows\system32\drivers\etc\hosts</em> comme suit</p>
<pre class="bash:nogutter">127.0.0.1   vdm</pre>
<p>vous pouvez a présent configurer autant de virtual host que vous voulez et bénéficier sans limite des bienfaits du routing symfony</p>
<h2>Portabiliser NetBeans</h2>
<p>source: <a href="http://www.portablefreeware.com/forums/viewtopic.php?f=4&amp;t=5301&amp;hilit=netbeans">http://www.portablefreeware.com/forums/viewtopic.php?f=4&amp;t=5301&amp;hilit=netbeans</a></p>
<p>En résumé pour une <a href="../2009/09/framakey-ubuntu-remix-100-portable-100-libre-et-multiplateforme-aussi-un-peu/">FramaKey</a> (sur le lecteur <em>z:\</em> par exemple), sachant que ce qui m&#8217;intéresse c&#8217;est netbeans pour PHP :</p>
<p>Sur <a href="http://www.netbeans.org/downloads/index.html">http://www.netbeans.org/downloads/index.html</a> télécharger la version que vous voulez en sélectionnant dans plateforme &laquo;&nbsp;OS Independent Zip&nbsp;&raquo;, et décompressez l&#8217;archive dans <em>z:\Apps\portableNetbeans\</em></p>
<p>Sur <a href="https://cds.sun.com/is-bin/INTERSHOP.enfinity/WFS/CDS-CDS_Developer-Site/en_US/-/USD/ViewProductDetail-Start?ProductRef=jdk-6u16-oth-JPR@CDS-CDS_Developer">https://cds.sun.com/is-bin/INTERSHOP.enfinity/WFS/CDS-CDS_Developer-Site/en_US/-/USD/ViewProductDetail-Start?ProductRef=jdk-6u16-oth-JPR@CDS-CDS_Developer</a>,  téléchargez la version &laquo;&nbsp;windows&nbsp;&raquo;, installez la et copiez le contenu de <em>c:\program files\java\jdk1.6.0_16\ dans z:\Apps\portableJava\</em></p>
<p>Créez le répertoire <em>z:\Data\Netbeans</em></p>
<p>Editez le fichier <em>z:\Apps\portableNetbeans\etc\netbeans.conf</em> et modifiez le comme suit</p>
<pre class="bash:nogutter"># ${HOME} will be replaced by JVM user.home system property
# netbeans_default_userdir="${HOME}/.netbeans/6.7"
netbeans_default_userdir="/Data/Netbeans"

# Options used by NetBeans launcher by default, can be overridden by explicit
# command line switches:
netbeans_default_options="-J-client -J-Xss2m -J-Xms32m -J-XX:PermSize=32m -J-XX:MaxPermSize=200m -J-Xverify:none -J-Dapple.laf.useScreenMenuBar=true -J-Dsun.java2d.noddraw=true"
# Note that a default -Xmx is selected for you automatically.
# You can find this value in var/log/messages.log file in your userdir.
# The automatically selected value can be overridden by specifying -J-Xmx here
# or on the command line.

# If you specify the heap size (-Xmx) explicitely, you may also want to enable
# Concurrent Mark &amp; Sweep garbage collector. In such case add the following
# options to the netbeans_default_options:
# -J-XX:+UseConcMarkSweepGC -J-XX:+CMSClassUnloadingEnabled -J-XX:+CMSPermGenSweepingEnabled
# (see http://wiki.netbeans.org/wiki/view/FaqGCPauses)

# Default location of JDK, can be overridden by using --jdkhome &lt;dir&gt;:
netbeans_jdkhome="/Apps/portableJava"

# Additional module clusters, using ${path.separator} (';' on Windows or ':' on Unix):
#netbeans_extraclusters="/absolute/path/to/cluster1:/absolute/path/to/cluster2"

# If you have some problems with detect of proxy settings, you may want to enable
# detect the proxy settings provided by JDK5 or higher.
# In such case add -J-Djava.net.useSystemProxies=true to the netbeans_default_options.</pre>
<p>et le tour est joué.</p>
<p>Notez que cette astuce marche également avec le support symfony fraîchement disponible sur <a href="http://blogs.sun.com/netbeansphp/entry/symfony_support_finished">http://blogs.sun.com/netbeansphp/entry/symfony_support_finished</a></p>
<h2>Portabiliser PHPEdit</h2>
<p>Si vous êtes l&#8217;heureux possesseur d&#8217;une licence PHPedit, cet IDE est également portabilisable</p>
<p>source : <a href="http://doc.waterproof.fr/faq/phpedit/how_do_i_install_phpedit_on_a_usb_stick_phpedit_2_10_and_up">http://doc.waterproof.fr/faq/phpedit/how_do_i_install_phpedit_on_a_usb_stick_phpedit_2_10_and_up</a></p>
<p>Il suffit de copier le répertoire <em>c:\Program Files\WaterProof\PHPEdit\3.4.2</em> sur votre clé USB par exemple dans <em>z:\Apps\PHPedit</em><br />
créez le répertoire <em>z:\Data\PHPEdit</em> destiné à stocker l&#8217;espace de travail<br />
Ensuite Deux solutions s&#8217;offrent à vous :<br />
créer un fichier texte PHPEdit.PHPEditSettings dans le répertoire contenant PHPEdit.exe<br />
enregistrer le contenu suivant dans <em>z:\Apps\PHPedit\</em><em>PHPEdit.PHPEditSettings</em></p>
<pre class="bash:nogutter">      ..\..\Data\PHPedit

      ..\..\Data\PHPedit</pre>
<p>Sinon Rendez-vous dans &laquo;&nbsp;Outils&nbsp;&raquo; -&gt; &laquo;&nbsp;Editer les préférences&nbsp;&raquo; (ou directement en tapant F1O)</p>
<ul>
<li><span>cliquez juste en dessous de la barre des titres là où il y a les deux flèches (1)</span></li>
<li><span>cliquez ensuite sur &laquo;&nbsp;paramètres locaux&nbsp;&raquo; en haut à gauche (2)</span></li>
<li><span>remplir le champs &laquo;&nbsp;Dossier de stockage des données de l&#8217;application&nbsp;&raquo; avec un path relatif (ici ..\..\Data\PHPEdit) (3)</span></li>
</ul>
<p style="text-align: center;"><a href="http://blog.mazenod.fr/wp-content/uploads/2009/11/PHPedit.jpg" rel="lightbox[519]"><a href="http://blog.mazenod.fr/wp-content/uploads/2009/11/PHPedit.jpg" rel="lightbox[519]"><img class="aligncenter size-medium wp-image-689" title="PHPedit" src="http://blog.mazenod.fr/wp-content/uploads/2009/11/PHPedit-300x217.jpg" alt="PHPedit 300x217 environnement de développement portable pour symfony #FramaKey" width="300" height="217" /></a></a></p>
<p>Notez que je fais l&#8217;impasse sur eclipse que je trouve définitivement trop gourmand en ressource!</p>
<h2>En guise de conclusion</h2>
<p><span>J&#8217;ajoute également quelques outils portables supplémentaires que j&#8217;aime bien avoir à portée de clic:<br />
</span></p>
<ul>
<li><span><a href="http://sourceforge.net/projects/console/">console 2</a> :  un projet de console un peu plus fun que la ligne de commande de base. Au programme paramètrage du dossier d&#8217;ouverture par défaut, redimensionnement, choix des polices et de leur taille, consoles virtuelles et transparence &#8230; voici <a href="http://blog.mazenod.fr/wp-content/uploads/2009/10/console.xml">mon fichier de conf</a> à copier / coller dans<em> z:\Apps\Console2\bin\release</em></span></li>
<li><span> <a href="http://winmerge.org/">winmerge</a> : permet de fusionner facilement du code. C&#8217;est en gros une version graphique de la commande UNIX diff</span></li>
<li><span> <a href="http://fabforce.net/dbdesigner4">DBDesigner4</a> ou <a href="http://www.mysql.fr/products/workbench/">MySQL Workbench</a> : designers graphique de base de données.</span></li>
</ul>
<div><span><img src="http://img.zemanta.com/pixy.gif?x-id=2365d92c-67c6-8d33-b209-77e459db8965" alt=" environnement de développement portable pour symfony #FramaKey" width="1.5" height="1.5" title="environnement de développement portable pour symfony #FramaKey" /></span></div>
]]></content:encoded>
			<wfw:commentRss>http://blog.mazenod.fr/2009/11/environnement-de-developpement-portable-pour-symfony-framakey/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>code Highlightment ou la coloration syntaxique en quelques clics</title>
		<link>http://blog.mazenod.fr/2009/03/code-highlightment-ou-la-coloration-syntaxique-en-quelques-clics/</link>
		<comments>http://blog.mazenod.fr/2009/03/code-highlightment-ou-la-coloration-syntaxique-en-quelques-clics/#comments</comments>
		<pubDate>Thu, 12 Mar 2009 17:49:44 +0000</pubDate>
		<dc:creator>mazenovi</dc:creator>
				<category><![CDATA[blog]]></category>
		<category><![CDATA[bricolage]]></category>
		<category><![CDATA[dev]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[www]]></category>

		<guid isPermaLink="false">http://blog.mazenod.fr/?p=184</guid>
		<description><![CDATA[
			
				
			
		
Depuis que j&#8217;ai suivi ce fameux tuto Create a Simple, Intelligent Accordion Effect Using Prototype and Scriptaculous, j&#8217;avais en tête, de mettre en place la coloration syntaxique sur mazenod.fr. Après prospection du côté de Geshi, j&#8217;ai finalement opté pour SyntaxHighlighter &#8230; outre le fait que l&#8217;un (Geshi) est en PHP et l&#8217;autre est en JS [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblog.mazenod.fr%2F2009%2F03%2Fcode-highlightment-ou-la-coloration-syntaxique-en-quelques-clics%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.mazenod.fr%2F2009%2F03%2Fcode-highlightment-ou-la-coloration-syntaxique-en-quelques-clics%2F&amp;style=normal&amp;b=2" height="61" width="50" title="code Highlightment ou la coloration syntaxique en quelques clics" alt=" code Highlightment ou la coloration syntaxique en quelques clics" /><br />
			</a>
		</div>
<p>Depuis que j&#8217;ai suivi ce fameux tuto Create a Simple, Intelligent Accordion Effect Using Prototype and Scriptaculous, j&#8217;avais en tête, de mettre en place la coloration syntaxique sur mazenod.fr. Après prospection du côté de Geshi, j&#8217;ai finalement opté pour SyntaxHighlighter &#8230; outre le fait que l&#8217;un (Geshi) est en PHP et l&#8217;autre est en JS pure (SyntaxHighlighter), le dernier possède une fonctionnalité qui me faisait très envie et que je n&#8217;avais pas le temps de coder, c&#8217;est le bouton &laquo;&nbsp;copy to clipboard&nbsp;&raquo; qui permet de copier dans le buffer le contenu de la portion de code.<br />
Très pratique!<br />
Surtout pour les lignes de commandes &#8230; ça tombe bien! j&#8217;ai l&#8217;intention de me remettre à l&#8217;admin dans pas longtemps (et donc à la documentation qui va avec <img src='http://blog.mazenod.fr/wp-includes/images/smilies/icon_wink.gif' alt="icon wink code Highlightment ou la coloration syntaxique en quelques clics" class='wp-smiley' title="code Highlightment ou la coloration syntaxique en quelques clics" /> .</p>
<p>Outre ce petit détail la mise en place c&#8217;est faite en quelques minutes et l&#8217;intégration aux styles de FCKeditor est juste trop pratique!!</p>
<p>un petit copier / coller du filtre que j&#8217;ai utilisé pour l&#8217;intégration dans mazenod.fr (en symfony donc pour ceux qui ne suivent pas):</p>
<pre name="code" class="php:nocontrols">
&lt;?php class sfCmsCodeHighlightFilter extends sfFilter {
   public function execute($filterChain)
   {
      $filterChain-&gt;execute();
      if($this-&gt;isFirstCall())
      {
         $enable = "
         &lt;script type=\"text/javascript\"&gt;
         SyntaxHighlighter.config.clipboardSwf = '/js/syntaxhighlighter/clipboard.swf';
         SyntaxHighlighter.config.strings.viewSource = 'Voir source';
         SyntaxHighlighter.config.strings.copyToClipboard = 'Copier dans le presse-papier';
         SyntaxHighlighter.config.strings.copyToClipboardConfirmation = 'Le code a été copié dans le presse-papier';
         SyntaxHighlighter.config.strings.print = 'Imprimer';
         SyntaxHighlighter.config.strings.help = 'A propos';
         SyntaxHighlighter.config.strings.expandSource = '+ Montrer la source';
         SyntaxHighlighter.all();
         &lt;/script&gt;
         ";
         $response = $this-&gt;getContext()-&gt;getResponse();
         $response-&gt;setContent(str_ireplace('&lt;/head&gt;', $enable.'&lt;/head&gt;',$response-&gt;getContent()));
      }
   }
}
</pre>
<p>Rien d&#8217;exceptionnel c&#8217;était juste pour tester la coloration syntaxique &#8230; ça marche bien hein?</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.mazenod.fr/2009/03/code-highlightment-ou-la-coloration-syntaxique-en-quelques-clics/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>sfGuard extension gestion d&#039;une arborescence</title>
		<link>http://blog.mazenod.fr/2007/08/sfguard-extension-gestion-d-une-arborescence/</link>
		<comments>http://blog.mazenod.fr/2007/08/sfguard-extension-gestion-d-une-arborescence/#comments</comments>
		<pubDate>Mon, 13 Aug 2007 18:21:14 +0000</pubDate>
		<dc:creator>mazenovi</dc:creator>
				<category><![CDATA[dev]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[symfony]]></category>

		<guid isPermaLink="false">http://blog.mazenod.fr/?p=109</guid>
		<description><![CDATA[
			
				
			
		
Une fois les étapes de création du projet, je commencerai à m&#8217;intéresser à l&#8217;objet User.
symfony propel-generate-crud back user User
Maintenant un petit jeu de données sur le modèle proposé par Askeet (le salted SHA1 me plait bien!!)

User:
  mazenovi:
    username:   mazenovi
    prenom: Vincent
    nom:  [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblog.mazenod.fr%2F2007%2F08%2Fsfguard-extension-gestion-d-une-arborescence%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.mazenod.fr%2F2007%2F08%2Fsfguard-extension-gestion-d-une-arborescence%2F&amp;style=normal&amp;b=2" height="61" width="50" title="sfGuard extension gestion d&#039;une arborescence" alt=" sfGuard extension gestion d&#039;une arborescence" /><br />
			</a>
		</div>
<p>Une fois les étapes de <a href="2007/05/commencer-un-projet-symfony/">création du projet</a>, je commencerai à m&#8217;intéresser à l&#8217;objet User.</p>
<pre name="code" class="php:nogutter:nocontrols">symfony propel-generate-crud back user User</pre>
<p>Maintenant un petit jeu de données sur le modèle proposé par Askeet (le salted SHA1 me plait bien!!)</p>
<pre name="code" class="php:nogutter:nocontrols">
User:
  mazenovi:
    username:   mazenovi
    prenom: Vincent
    nom:  Mazenod
    password: mazenovi
    email: mazenovi@caramail.com
    blog: http://blog.onfamp.net
    homepage: http://vmazenod.free.fr
    presentation: un petit mot pour dire que
  r1bzh:
    username: r1bzh
    password: r1bzh
  ld:
    username: ld
    password:
</pre>
<p>Pour que ca marche il faut écrire la méthode setPassword dans lib/model/User.php</p>
<pre name="code" class="php:nogutter:nocontrols">
<?
class User extends BaseUser
{
  public function setPassword($password)
  {
    $salt = md5(rand(100000, 999999).$this->getUsername().$this->getEmail());
    $this->setSalt($salt);
    $this->setSha1Password(sha1($salt.$password));
  }
}
</pre>
<p>on écrit le script de chargement</p>
<pre name="code" class="php:nogutter:nocontrols">
<?php

define('SF_ROOT_DIR',    realpath(dirname(__FILE__).'/..'));
define('SF_APP',         'back');
define('SF_ENVIRONMENT', 'dev');
define('SF_DEBUG',       true);

require_once(SF_ROOT_DIR.DIRECTORY_SEPARATOR.'apps'.DIRECTORY_SEPARATOR.SF_APP.DIRECTORY_SEPARATOR.'config'.DIRECTORY_SEPARATOR.'config.php');

// initialize database manager
$databaseManager = new sfDatabaseManager();
$databaseManager->initialize();
$data = new sfPropelData();
$data->loadData(sfConfig::get('sf_data_dir').DIRECTORY_SEPARATOR.'fixtures');
?>
</pre>
<p>on l&#8217;exécute</p>
<pre name="code" class="php:nogutter:nocontrols">
php batch/load_data.php
</pre>
<p>Reste à gérer l&#8217;authentification.<br />
On commence par ajouter une action login au controleur</p>
<pre name="code" class="php:nogutter:nocontrols">
public function executeLogin()
  {
    if ($this->getRequest()->getMethod() != sfRequest::POST)
    {
      return sfView::SUCCESS;
    }
    else
    {
      return $this->redirect('@homepage');
    }
  }
</pre>
<p>Ensuite la vue correspondante loginSuccess.php</p>
<pre name="code" class="php:nogutter:nocontrols">
<style>
  .form_error{
    color: purple;
    font-size: 12px;
  }
  #form_login{
    text-align: center;
  }
</style>

<?php echo form_tag('user/login',Array('id'=>'form_login')) ?>
<?php use_helper('Validation') ?>
<table>
<tr>
<td>nom d'utilisateur</td>
<td>
      <?php echo form_error('username')?>
      <?php echo input_tag('username', $sf_params->get('username')) ?>
    </td>
</tr>
<tr>
<td>password</td>
<td>
      <?php echo form_error('password')?>
      <?php echo input_password_tag('password') ?>
    </td>
</tr>
<tr>
<th colspan="2">
      <?php echo input_hidden_tag('referer', $sf_request->getAttribute('referer')) ?>
      <?php echo submit_tag('sign in') ?>
    </th>
</tr>
</table>
</form>
</pre>
<p>Maintenant la validation du formulaire d&#8217;uathentification apps/back/modules/user/validate/login.yml</p>
<pre name="code" class="php:nogutter:nocontrols">
methods:
  post: [username, password]

names:
  username:
    required:     true
    required_msg: le nom d'utilisateur est obligatoire
    validators:   [usernameValidator, userValidator]

  password:
    required:     true
    required_msg: le mot de passe est obligatoire

usernameValidator:
    class:        sfStringValidator
    param:
      min:        2
      min_error:  le mote de passe doit comporter plus de 2 caractères

userValidator:
    class:         myLoginValidator
    param:
      password:    password
      login_error: nom d'utilisateur ou mot de passe invalide
</pre>
<p>Une fois fait reste à écrire le Helper de validation apps/back/lib/myLoginValidator.class.php</p>
<pre name="code" class="php:nogutter:nocontrols">
<?php

class myLoginValidator extends sfValidator
{
  public function initialize($context, $parameters = null)
  {
    parent::initialize($context);
    $this->setParameter('login_error', 'Invalid input');
    $this->getParameterHolder()->add($parameters);
    return true;
  }

  public function execute(&#038;$value, &#038;$error)
  {
    $password_param = $this->getParameter('password');
    $password = $this->getContext()->getRequest()->getParameter($password_param);
    $login = $value;
    $c = new Criteria();
    $c->add(UserPeer::USERNAME, $login);
    $user = UserPeer::doSelectOne($c);
    if ($user)
    {
      if (sha1($user->getSalt().$password) == $user->getSha1Password())
      {
        $this->getContext()->getUser()->signIn($user);
        return true;
      }
    }
    $error = $this->getParameter('login_error');
    return false;
  }
}
</pre>
<p>Reste encore à écrire les méthodes signIn et signOut du sf User dans apps/back/lib/myUser.class.php</p>
<pre name="code" class="php:nogutter:nocontrols">
<?php

class myUser extends sfBasicSecurityUser
{
  public function signIn($user)
  {
    $this->setAuthenticated(true);
    $this->setAttribute('nom', $user->getNom());
    $this->setAttribute('prenom', $user->getPrenom());
    $this->setAttribute('username', $user->getUsername());
  }

  public function signOut()
  {
    $this->getAttributeHolder()->clear();
    $this->clearCredentials();
    $this->setAuthenticated(false);

  }
  public function getUsername()
  {
    return $this->getAttribute('username');
  }

  public function getPrenom()
  {
    return $this->getAttribute('prenom');
  }

  public function getNom()
  {
    return $this->getAttribute('nom');
  }
  public function __toString(){
    return $this->getUsername();
  }
}
</pre>
<p>vider le cache de symfony</p>
<pre name="code" class="php:nogutter:nocontrols">
symfony cc
</pre>
<p>et faire un teste sur http://mydomain/user/login</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.mazenod.fr/2007/08/sfguard-extension-gestion-d-une-arborescence/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>pecl/fileinfo &amp; rmdir onwamp &#8230;</title>
		<link>http://blog.mazenod.fr/2007/07/pecl-fileinfo-rmdir-onwamp/</link>
		<comments>http://blog.mazenod.fr/2007/07/pecl-fileinfo-rmdir-onwamp/#comments</comments>
		<pubDate>Wed, 04 Jul 2007 07:17:49 +0000</pubDate>
		<dc:creator>mazenovi</dc:creator>
				<category><![CDATA[dev]]></category>
		<category><![CDATA[install]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[windows]]></category>

		<guid isPermaLink="false">http://blog.mazenod.fr/?p=105</guid>
		<description><![CDATA[
			
				
			
		
Attendu que l&#8217;installation des extension PECL via pear ne fonctionne pas sous windows voici la marche à suivre pour installer l&#8217;une d&#8217;entre elle : fileinfo. FileInfo permet notamment de réupérer le type mime d&#8217;un fichier.
Normalement (c&#8217;est en tout ca sle cas dans wamp), la dll fileinfo.dll se trouve dans le répertoire des extenions PHP (&#171;&#160;c:\wamp\php\ext&#160;&#187; [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblog.mazenod.fr%2F2007%2F07%2Fpecl-fileinfo-rmdir-onwamp%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.mazenod.fr%2F2007%2F07%2Fpecl-fileinfo-rmdir-onwamp%2F&amp;style=normal&amp;b=2" height="61" width="50" title="pecl/fileinfo &amp; rmdir onwamp ..." alt=" pecl/fileinfo &amp; rmdir onwamp ..." /><br />
			</a>
		</div>
<p>Attendu que l&#8217;installation des extension PECL via pear ne fonctionne pas sous windows voici la marche à suivre pour installer l&#8217;une d&#8217;entre elle : fileinfo. FileInfo permet notamment de réupérer le type mime d&#8217;un fichier.<br />
Normalement (c&#8217;est en tout ca sle cas dans wamp), la dll fileinfo.dll se trouve dans le répertoire des extenions PHP (&laquo;&nbsp;c:\wamp\php\ext&nbsp;&raquo; chez moi).<br />
Il suffit donc de rajouter dans le php.ini du php apache (dans &laquo;&nbsp;c:\wamp\apache2\bin\php.ini)</p>
<pre name="code" class="php:nogutter:nocontrols">extension=php_fileinfo.dll</pre>
<p>jusque là pas RAS on est d&#8217;accord. c&#8217;est après que le folklore commence. Pour reconnaitre les type mimes, les fonctions fileinfo utilises un fichier texte magic.mime situé dans le répertoire extras de PHP (&laquo;&nbsp;c:\wamp\php\extras\&nbsp;&raquo; chez moi). Grosso modo ce fichier contient des séquences de caractères, dites magiques, qui caractérise tel ou tel type mime. Pour que ce fichier soit correctement utilisé il faut enlever touts les &laquo;&nbsp;!&nbsp;&raquo; contenu dans le fichier magic.mime et y faire référence dans les fonctions fileinfo via son path absolu windows sans l&#8217;extension. Typiquement</p>
<pre name="code" class="php:nogutter:nocontrols">finfo_open(FILEINFO_MIME, 'C:\wamp\php\extras\magic');</pre>
<p>source : <a style="text-decoration: none;" href="http://www.developpez.net/forums/archive/index.php/t-169754.html">http://www.developpez.net/forums/archive/index.php/t-169754.html</a><br />
fileinfo.dll : <a style="text-decoration: none;" href="http://pecl4win.php.net/list.php">http://pecl4win.php.net/list.php</a><br />
le coup du ! : <a style="text-decoration: none;" href="http://pecl.php.net/bugs/bug.php?id=9166">http://pecl.php.net/bugs/bug.php?id=9166</a></p>
<p>Voilà comme hier c&#8217;était best of windows j&#8217;ai eu également la joir de constater que la fonction rmdir de php ne fonctionne pas sous win32! On peut utiliser unlink pour supprimer des fichiers sans souci, mais impossible de supprimer un dossier même vide. Pour cause de l&#8217;utilisateur web n&#8217;a pas les permissions, et la partition NTFS ne se montrera pas compréhensive&#8230; Dans la série solution au scotch, je n&#8217;ai trouvé que celle là sur <a style="text-decoration: none;" href="http://fr3.php.net/manual/fr/function.rmdir.php">http://fr3.php.net/manual/fr/function.rmdir.php</a> qui dit :</p>
<pre name="code" class="php:nogutter:nocontrols">Save some time, if you want to clean a directory or delete it and you're on windows.

Use This:

            chdir ($file_system_path);
            exec ("del *.* /s /q");

You can use other DEL syntax, or any other shell util.
You may have to allow the service to interact with the desktop, as that's my current setting and I'm not changing it to test this.</pre>
<p>donc soit on se fait une raison et on utilise les commandes DOS :-/ soit on autorise wampapache à intergair avec le bureau dans les propriétés du service &#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.mazenod.fr/2007/07/pecl-fileinfo-rmdir-onwamp/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>symfony mysql et utf-8</title>
		<link>http://blog.mazenod.fr/2007/06/symfony-mysql-et-utf-8/</link>
		<comments>http://blog.mazenod.fr/2007/06/symfony-mysql-et-utf-8/#comments</comments>
		<pubDate>Tue, 12 Jun 2007 15:16:09 +0000</pubDate>
		<dc:creator>mazenovi</dc:creator>
				<category><![CDATA[bricolage]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[symfony]]></category>

		<guid isPermaLink="false">http://blog.mazenod.fr/?p=103</guid>
		<description><![CDATA[
			
				
			
		
Il est bien claire qu&#8217; utf-8 est le charset préférable pour tous sites web.
Quand on a des données stockées dans une base de données, type mysql, mieux vaut aussi adopter ce charset.
Mais même avec les en-têtes HTML qui vont bien on obtient pas toujours le résultat escompté.
A l&#8217;époque r1bzh m&#8217;avait filé cette commande php a [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblog.mazenod.fr%2F2007%2F06%2Fsymfony-mysql-et-utf-8%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.mazenod.fr%2F2007%2F06%2Fsymfony-mysql-et-utf-8%2F&amp;style=normal&amp;b=2" height="61" width="50" title="symfony mysql et utf 8" alt=" symfony mysql et utf 8" /><br />
			</a>
		</div>
<p>Il est bien claire qu&#8217; utf-8 est le charset préférable pour tous sites web.<br />
Quand on a des données stockées dans une base de données, type mysql, mieux vaut aussi adopter ce charset.<br />
Mais même avec les en-têtes HTML qui vont bien on obtient pas toujours le résultat escompté.<br />
A l&#8217;époque r1bzh m&#8217;avait filé cette commande php a envoyé au serveur de BDD avant tout</p>
<pre name="code" class="php:nogutter:nocontrols">
mysql_query("SET CHARACTER SET 'utf8'");
</pre>
<p>Cette commande resoud tous les problèmes de manière quasi magique &#8230;<br />
Mais quid du cas symfony?<br />
Après être tombé sur ce snippet, qui n&#8217;a pas eu le résultat escompté pour moi, j&#8217;ai lu les commenatires et me suis rendu compte qu&#8217;il suffisait d&#8217;ajouter la ligne suivante dans le databases.yml</p>
<pre name="code" class="php:nogutter:nocontrols">
      encoding: utf8
</pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.mazenod.fr/2007/06/symfony-mysql-et-utf-8/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>commencer un projet symfony</title>
		<link>http://blog.mazenod.fr/2007/05/commencer-un-projet-symfony/</link>
		<comments>http://blog.mazenod.fr/2007/05/commencer-un-projet-symfony/#comments</comments>
		<pubDate>Wed, 02 May 2007 16:13:31 +0000</pubDate>
		<dc:creator>mazenovi</dc:creator>
				<category><![CDATA[dev]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[symfony]]></category>

		<guid isPermaLink="false">http://blog.mazenod.fr/?p=100</guid>
		<description><![CDATA[
			
				
			
		
Générer le MCD sous DBDesigner
Lister les actions, les vues et les méthodes dynamiques et statiques engendrées.
créer un dossier du nom &#171;&#160;onfamp.net&#160;&#187; du projet dans l&#8217;arborescence web
créer un vhost dans le httpd.conf d&#8217;Apache, servant le répertoire créé, avec un alias vers la bibliothèque symfony


   ServerName onfamp.net
   DocumentRoot "c:/wamp/www/onfamp.net/web"
   DirectoryIndex index.php
 [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblog.mazenod.fr%2F2007%2F05%2Fcommencer-un-projet-symfony%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.mazenod.fr%2F2007%2F05%2Fcommencer-un-projet-symfony%2F&amp;style=normal&amp;b=2" height="61" width="50" title="commencer un projet symfony" alt=" commencer un projet symfony" /><br />
			</a>
		</div>
<p>Générer le MCD sous DBDesigner<br />
Lister les actions, les vues et les méthodes dynamiques et statiques engendrées.<br />
créer un dossier du nom &laquo;&nbsp;onfamp.net&nbsp;&raquo; du projet dans l&#8217;arborescence web<br />
créer un vhost dans le httpd.conf d&#8217;Apache, servant le répertoire créé, avec un alias vers la bibliothèque symfony</p>
<pre name="code" class="php:nogutter:nocontrols">
<virtualHost *:80>
   ServerName onfamp.net
   DocumentRoot "c:/wamp/www/onfamp.net/web"
   DirectoryIndex index.php
   Alias /sf "c:/wamp/php/PEAR/data/symfony/web/sf"
  <directory "c:/wamp/www/onfamp.net/web">
       AllowOverride All
   </directory>
</virtualHost>
</pre>
<p>créer la base de données &laquo;&nbsp;onfamp_net&nbsp;&raquo;<br />
créer un utilisateur ayant les droits d&#8217;écriture sur cette base de données<br />
créer effectivement le projet</p>
<pre name="code" class="php:nogutter:nocontrols">
symfony init-project onfamp.net
</pre>
<p>créer la partie public</p>
<pre name="code" class="php:nogutter:nocontrols">
symfony app front
</pre>
<p>créer la partie privée</p>
<pre name="code" class="php:nogutter:nocontrols">
symfony app back
</pre>
<p>créer un répertoire schema dans data et y copier le xml généré par DBDesigner<br />
renommer ce fichier en db.xml<br />
copier dbd2propel.xsl dans le même répertoire<br />
copier ce script dans le répertoire batch du projet<br />
convertir le MCD DBD en schema.xml</p>
<pre name="code" class="php:nogutter:nocontrols">
php batch\convertdb.php
</pre>
<p>pour que les futurs objets puissent interroger la base de données, éditer config/databases.yml</p>
<pre name="code" class="php:nogutter:nocontrols">
all:
  propel:
    class:          sfPropelDatabase
    param:
      phptype:  mysql
      host:     localhost
      database: onfamp_net
      username: myuser
      password: mypassword
</pre>
<p>renseigner les paramètres de connexion MySQL dans config/propel.ini</p>
<pre name="code" class="php:nogutter:nocontrols">
propel.database.url = mysql://myuser:mypassword@localhost/onfamp_net
</pre>
<p>convertir schema.xml en schema.yml</p>
<pre name="code" class="php:nogutter:nocontrols">
symfony propel-convert-xml
</pre>
<p>virer le schema.xml</p>
<pre name="code" class="php:nogutter:nocontrols">
del config\schema.xml
</pre>
<p>construire les models correspondant au MCD</p>
<pre name="code" class="php:nogutter:nocontrols">
symfony propel-build-model
</pre>
<p>construire le SQL nécessaire à la création des tables du MCD</p>
<pre name="code" class="php:nogutter:nocontrols">
symfony propel-build-sql
</pre>
<p>exécuter ce code SQL</p>
<pre name="code" class="php:nogutter:nocontrols">
symfony propel-insert-sql
</pre>
<p>initialiser son premier module en backoffice user User</p>
<pre name="code" class="php:nogutter:nocontrols">
symfony propel-generate-crud back user User
</pre>
<p>reste éventuellement à installer un FCK editor</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.mazenod.fr/2007/05/commencer-un-projet-symfony/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

