<?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>#symfony #ispcp #iphone #php #cornemuse</description>
	<lastBuildDate>Mon, 05 Apr 2010 17:35:26 +0000</lastBuildDate>
	
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<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[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.
C&#8217;est sans aucun doute le plus sexy de tous les environnements de développement PHP pour windows [...]]]></description>
			<content:encoded><![CDATA[<p>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="" 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="" 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="" 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="" 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="" 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" name="code">
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" name="code">
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" name="code">
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>.</pre>
<p>L'avantage c'est que vous disposez d'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[Design Pattern MVC
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é [...]]]></description>
			<content:encoded><![CDATA[<h2>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="" 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="" 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="" 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="" 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="" 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="" 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="" /></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="" /></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" name="code">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>9</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[     Le propos de cet article est de disposer d&#8217;un environnement de développement complet et portable pour le framework PHP symfony. Les paths sont ceux utilisés par la Framakey Unbuntu Remix, dont j&#8217;ai déjà parlé &#8211; je suppose dans toute la suite de ce post que vous voyez votre clé sur [...]]]></description>
			<content:encoded><![CDATA[<p>     <span>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><a href="http://blog.mazenod.fr/wp-content/uploads/2009/10/setup_xampp_1.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/10/setup_xampp_1-300x151.jpg" alt="setup_xampp_1" width="300" height="151" /></a><a href="http://blog.mazenod.fr/wp-content/uploads/2009/10/setup_xampp_2.jpg" rel="lightbox[519]"><img class="size-medium wp-image-672 aligncenter" title="setup_xampp_2" src="http://blog.mazenod.fr/wp-content/uploads/2009/10/setup_xampp_2-300x151.jpg" alt="setup_xampp_2" width="300" height="151" /></a><a href="http://blog.mazenod.fr/wp-content/uploads/2009/10/setup_xampp_3.jpg" rel="lightbox[519]"><img class="size-medium wp-image-673 aligncenter" title="setup_xampp_3" src="http://blog.mazenod.fr/wp-content/uploads/2009/10/setup_xampp_3-300x151.jpg" alt="setup_xampp_3" width="300" height="151" /></a><a href="http://blog.mazenod.fr/wp-content/uploads/2009/10/setup_xampp_4.jpg" rel="lightbox[519]"><img class="size-medium wp-image-674 aligncenter" title="setup_xampp_4" src="http://blog.mazenod.fr/wp-content/uploads/2009/10/setup_xampp_4-300x151.jpg" alt="setup_xampp_4" width="300" height="151" /></a><a href="http://blog.mazenod.fr/wp-content/uploads/2009/10/setup_xampp_5.jpg" rel="lightbox[519]"><img class="size-medium wp-image-675 aligncenter" title="setup_xampp_5" src="http://blog.mazenod.fr/wp-content/uploads/2009/10/setup_xampp_5-300x151.jpg" alt="setup_xampp_5" width="300" height="151" /></a><a href="http://blog.mazenod.fr/wp-content/uploads/2009/10/setup_xampp_6.jpg" rel="lightbox[519]"><img class="size-medium wp-image-676 aligncenter" title="setup_xampp_6" src="http://blog.mazenod.fr/wp-content/uploads/2009/10/setup_xampp_6-300x151.jpg" alt="setup_xampp_6" width="300" height="151" /></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/10/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/10/localhost_xampp.png" alt="localhost_xampp" 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/10/environnement_1.jpg" rel="lightbox[519]"><img class="size-medium wp-image-679 aligncenter" title="environnement_1" src="http://blog.mazenod.fr/wp-content/uploads/2009/10/environnement_1-300x226.jpg" alt="environnement_1" width="300" height="226" /></a><a href="http://blog.mazenod.fr/wp-content/uploads/2009/10/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/10/environnement_2-300x226.jpg" alt="environnement_2" width="300" height="226" /></a><a href="http://blog.mazenod.fr/wp-content/uploads/2009/10/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/10/environnement_3-259x300.jpg" alt="environnement_3" width="259" height="300" /></a><a href="http://blog.mazenod.fr/wp-content/uploads/2009/10/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/10/environnement_4-271x300.jpg" alt="environnement_4" width="271" height="300" /></a><a href="http://blog.mazenod.fr/wp-content/uploads/2009/10/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/10/environnement_5-300x115.jpg" alt="environnement_5" 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" name="code">php -v</pre>
<p>si vous voyez apparaître quelque chose du genre</p>
<pre class="bash:nogutter" name="code">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" name="code">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" name="code">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" name="code">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" name="code">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" name="code">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" name="code"># ${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" name="code">      ..\..\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/10/PHPedit.jpg" rel="lightbox[519]"><img class="size-medium wp-image-689 aligncenter" title="PHPedit" src="http://blog.mazenod.fr/wp-content/uploads/2009/10/PHPedit-300x217.jpg" alt="PHPedit" width="300" height="217" /></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="" width="1.5" height="1.5" /></span></div>
]]></content:encoded>
			<wfw:commentRss>http://blog.mazenod.fr/2009/11/environnement-de-developpement-portable-pour-symfony-framakey/feed/</wfw:commentRss>
		<slash:comments>0</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[<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=';-)' class='wp-smiley' /> .</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&#8217;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[<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[<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[<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[<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>
		<item>
		<title>Symfony TinyMCE &amp; FCKeditor</title>
		<link>http://blog.mazenod.fr/2007/05/symfony-tinymce-fckeditor/</link>
		<comments>http://blog.mazenod.fr/2007/05/symfony-tinymce-fckeditor/#comments</comments>
		<pubDate>Wed, 02 May 2007 09:05:44 +0000</pubDate>
		<dc:creator>mazenovi</dc:creator>
				<category><![CDATA[dev]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[symfony]]></category>
		<category><![CDATA[WYSIWYG]]></category>

		<guid isPermaLink="false">http://blog.mazenod.fr/?p=95</guid>
		<description><![CDATA[Installation de TinyMCE
Télécharger l&#8217;archive sur http://tinymce.moxiecode.com/
déplacer le dossier tinymce/jscripts/tiny_mce dans le dossier web/js de votre dossier symfony.
modifier le fichier config/settings.yml
all:
  .settings:
    rich_text_js_dir: js/tiny_mce
Pour utiliser tinyMCE dans un textarea il suffit de spécifier  l&#8217;option rich=true
une textarea sans éditeur
 '30x30')) ?&#62;
une textarea avec tinyMCE
true,'size' =&#62; '30x30')) ?&#62;
Vous n&#8217;irez pas plus loin avec [...]]]></description>
			<content:encoded><![CDATA[<p>Installation de TinyMCE<br />
Télécharger l&#8217;archive sur http://tinymce.moxiecode.com/<br />
déplacer le dossier tinymce/jscripts/tiny_mce dans le dossier web/js de votre dossier symfony.<br />
modifier le fichier config/settings.yml</p>
<pre name="code" class="php:nogutter:nocontrols">all:
  .settings:
    rich_text_js_dir: js/tiny_mce</pre>
<p>Pour utiliser tinyMCE dans un textarea il suffit de spécifier  l&#8217;option rich=true<br />
une textarea sans éditeur</p>
<pre name="code" class="php:nogutter:nocontrols"> '30x30')) ?&gt;</pre>
<p>une textarea avec tinyMCE</p>
<pre name="code" class="php:nogutter:nocontrols">true,'size' =&gt; '30x30')) ?&gt;</pre>
<p>Vous n&#8217;irez pas plus loin avec TinyMCE car l&#8217;upload de fichiers par exemple est un module payant :-/<br />
Heureusement FCKeditor qui lui est libre est configurable avec symfony. Il faut donc pour cela<br />
Télécharger l&#8217;archive sur http://www.fckeditor.net/<br />
déplacer le dossier fckeditor dans web/js<br />
modifier le fichier config/settings.yml</p>
<pre name="code" class="php:nogutter:nocontrols">all:
  .settings:
    rich_text_fck_js_dir: js/fckeditor</pre>
<p>Pour utiliser FCKeditor dans un textarea il suffit de spécifier  l&#8217;option rich=fck</p>
<pre name="code" class="php:nogutter:nocontrols">'fck','size' =&gt; '30x30')) ?&gt;</pre>
<p>Pour utiliser une barre d&#8217;outil spécifique (&laquo;&nbsp;Basic&nbsp;&raquo; dans l&#8217;exemple)</p>
<pre name="code" class="php:nogutter:nocontrols">'fck','tool'=&gt;'Basic','size' =&gt; '30x30')) ?&gt;</pre>
<p>Pour utiliser l&#8217;upload de fichier, éditer web/js/fckeditor/fckconfig.js et rempalcer &laquo;&nbsp;asp&nbsp;&raquo; par &laquo;&nbsp;php&nbsp;&raquo; dans les deux lignes suivantes</p>
<pre name="code" class="php:nogutter:nocontrols">var _FileBrowserLanguage    = 'php' ;    // asp | aspx | cfm | lasso | perl | php | py
var _QuickUploadLanguage    = 'php' ;    // asp | aspx | cfm | lasso | php</pre>
<p>dans web/js/fckeditor/editor/filemanager/browser/default/connectors/php/config.php<br />
et web/js/fckeditor/editor/filemanager/upload/php/config.php il faut activé l&#8217;upload explicitement en spécifiant</p>
<pre name="code" class="php:nogutter:nocontrols">$Config['Enabled'] = true ;</pre>
<p>Jusque là on a pas trop sué &#8230;<br />
Mais on est pas au top : tous les utiliusateurs partagent un seul et même répertoire de fichier pour FCK /userfiles/ &#8230;<br />
Ce qui serait mieux c&#8217;est que les utilisateurs accèdent à un répertoire du genre /userfiles/$username. Pour ça il faudra passer par une variable de session.<br />
Imaginons qu&#8217;au moment de se loguer le nom d&#8217;utilisateur est stocké dans la session dans un espace de nom suscriber. Ca s&#8217;écrit à peu près comme ça dans symfony</p>
<pre name="code" class="php:nogutter:nocontrols">$this-&gt;setAttribute('username', $user-&gt;getUsername(), 'subscriber');</pre>
<p>Pour voir un peu comment est structurée une session symfony il suffit de faire afficher la variable $_SESSION dans un tempalte de test. On se rend alors compte qu&#8217;on retrouve notre nom d&#8217;utilisateur dans</p>
<pre name="code" class="php:nogutter:nocontrols">$_SESSION['symfony/user/sfUser/attributes']['subscriber']['username']</pre>
<p>La seule solution pour customizer le réperoire du filemanager dynamiquement est de hacker le fichier web/js/fckeditor/editor/filemanager/browser/default/connectors/php/connector.php.<br />
tout en haut du fichier ouvir un session de même nom que celle ouverte par symfony</p>
<p>En effet par défaut PHP ouvrira une session nommée PHPSESSID alors que symfony stocke toutes ces variables dans une session nommée symfony par défaut (modifiable dans apps/myapp/config/factories.yml). le paramètre de session_name foit donc être le même que dans factories.yml pour que cela fonctionne (croyez moi ca se mérite de découvrir des trucs pareil !!)<br />
Juste après</p>
<pre name="code" class="php:nogutter:nocontrols">// Get the "UserFiles" path.
$GLOBALS["UserFilesPath"] = '' ;</pre>
<p>ajouter</p>
<pre name="code" class="php:nogutter:nocontrols">$Config['UserFilesPath'] = '/userfiles/'.$_SESSION['symfony/user/sfUser/attributes']['subscriber']['username'];</pre>
<p>Et là c&#8217;est la grande classe!!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.mazenod.fr/2007/05/symfony-tinymce-fckeditor/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>symfony class_implements() &amp; iconv() sur un BSD</title>
		<link>http://blog.mazenod.fr/2007/04/symfony-class_implements-iconv-sur-un-bsd/</link>
		<comments>http://blog.mazenod.fr/2007/04/symfony-class_implements-iconv-sur-un-bsd/#comments</comments>
		<pubDate>Fri, 13 Apr 2007 11:51:34 +0000</pubDate>
		<dc:creator>mazenovi</dc:creator>
				<category><![CDATA[dev]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[unix]]></category>

		<guid isPermaLink="false">http://blog.mazenod.fr/?p=87</guid>
		<description><![CDATA[Call to undefined function iconv()
Call to undefined function class_implements()
SI vous avez ces messages au court de vos développements symfony c&#8217;est que PHP5 n&#8217;est pas compilé avec les bons flags:
Pour iconv() extension iconv
portinstall php5-iconv
Pour class_implements() extension spl
portinstall php5-spl
]]></description>
			<content:encoded><![CDATA[<p>Call to undefined function iconv()<br />
Call to undefined function class_implements()</p>
<p>SI vous avez ces messages au court de vos développements symfony c&#8217;est que PHP5 n&#8217;est pas compilé avec les bons flags:<br />
Pour iconv() extension iconv</p>
<pre name="code" class="php:nogutter:nocontrols">portinstall php5-iconv</pre>
<p>Pour class_implements() extension spl</p>
<pre name="code" class="php:nogutter:nocontrols">portinstall php5-spl</pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.mazenod.fr/2007/04/symfony-class_implements-iconv-sur-un-bsd/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
