<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
  <channel>
    <title>Blog de Jérémy Barthe</title>
    <description>Blog d&#039;un développeur Web à Montpellier, spécialisé en PHP et dans les frameworks notamment Symfony, adepte du javascript, de la librairie jQuery, d&#039;ajax et des bonnes pratiques d&#039;XHTML / CSS.</description>
    <link>http://jeremybarthe.com</link>
    <pubDate>Tue, 07 Sep 2010 21:16:22 +0200</pubDate>
    <lastBuildDate>Tue, 07 Sep 2010 21:16:22 +0200</lastBuildDate>
    <language>fr</language>
    
        <item>
      <title>[Brève] Nouvelle version, propulsée par Symfony</title>
      <link>http://jeremybarthe.com/2009/03/18/fr/nouvelle-version-propulsee-par-symfony-framework</link>
      <guid>http://jeremybarthe.com/2009/03/18/fr/nouvelle-version-propulsee-par-symfony-framework</guid>
      <comments>http://jeremybarthe.com/2009/03/18/fr/nouvelle-version-propulsee-par-symfony-framework#comments</comments>
            <author>Jérémy Barthe &lt;contact@jeremybarthe.com&gt;</author>
      <pubDate>Wed, 18 Mar 2009 23:29:00 +0100</pubDate>
      <description><![CDATA[<p>Après plusieurs semaines la tête dans le guidon pendant mes fins de soirées ou insomnies, ce blog tourne enfin avec un moteur maison codé en Symfony. Il s'agit de ma première réelle application avec Symfony &amp; Doctrine, je n'avais auparavant que lu la doc et fait des tests sur les tutoriaux Askeet puis Jobeet. Je vais essayer de tirer petit à petit des articles de ce développement, mais si vous avez déjà des interrogations, n'hésitez pas à me les laisser par commentaires.</p>
<p>Bref comme vous vous en doutez ce blog va s'orienter de plus en plus vers Symfony puisque je fais en sorte qu'il prenne place dans ma vie professionnelle.</p>
<p>Côté ligne éditoriale, je veux renforcer le côté articles, ils sont et resteront rares, j'essaie de les détailler suffisamment et ceci me prends beaucoup de temps. D'où le fait que j'ai ajouté un système de brèves qui me permet de sortir du cadre des articles, avec <a href="http://jeremybarthe.com/2009/02/18/fr/meler-css-et-photographies">cette dernière par exemple</a>.</p>
<p>Pour le flux RSS principal, pas de souci, puisque c'est feedburner qui s'en occupe, pour les autres et notamment celui des commentaires, je vous conseille d'aller jeter un oeil en bas de la page <a href="http://jeremybarthe.com/fr/a-propos">à propos</a>.</p>
<p>Côté design, celui-ci est beaucoup plus simple que le précédent, plus épurée, il repose essentiellement sur une mise en avant des contenus, ce qui pêchait auparavant (surtout en terme de largeur pour l'affichage des articles). Dans les originalités on trouve surtout un code couleur par catégorie (bleu pour PHP, rouge pour CSS, vert pour le Javascript et gris foncé pour Webdesign) et on retrouve les titres positionnés à gauche du contenu des articles.</p>
<p>Et côté bonne nouvelle, le précédent design sera prochainement disponible en téléchargement sous la forme d'un template libre ou wordpress.</p>
<p>Avec la récente acquisition d'un Canon 50D et d'un 17-40 j'ai pas mal de photos à trier, retoucher et mettre en ligne sur mon Flickr, et je reviens dès que possible avec des articles !</p>
<p><small>(il se peut que des bugs aient échappés à mon attention, n'hésitez pas à me les signaler en commentaire)</small></p>
]]></description>
    </item>
        <item>
      <title>[Article] Gestion d&#039;erreurs PHP au niveau du SGBD</title>
      <link>http://jeremybarthe.com/fr/php/gestion-des-erreurs-php-au-niveau-du-sgbd</link>
      <guid>http://jeremybarthe.com/fr/php/gestion-des-erreurs-php-au-niveau-du-sgbd</guid>
      <comments>http://jeremybarthe.com/fr/php/gestion-des-erreurs-php-au-niveau-du-sgbd#comments</comments>
            <category><![CDATA[PHP]]></category>
            <author>Jérémy Barthe &lt;contact@jeremybarthe.com&gt;</author>
      <pubDate>Thu, 16 Jun 2005 03:17:00 +0200</pubDate>
      <description><![CDATA[<p class="information"><strong>Attention :</strong> cet article a été rédigé en 2005, le contenu ou les éléments abordées peuvent être obsolète.</p>
<p><em>Remarque : L'exemple suivant est traité avec PHP 5 et SQLite (<a href="http://fr.wikipedia.org/wiki/SQLite" hreflang="fr">def. wikipédia</a>).</em></p>
<p><strong>Nature de l'exemple :</strong> Prenons un exemple simple, vous traitez des projets et des employés. Vous gérez un système permettant d'assigner des employés sur un ou plusieurs projets (jusque la rien de compliqué). La contrainte est la suivante : il ne peut y avoir plus de quatre employés assignés à un projet.</p>
<h3>Accéder à une base de donnée SQLite via PHP</h3>
<p>Vous avez deux possibilités pour accéder à une base de donnée SQLite, la méthode procédurale (qui est à éviter si vous coder en PHP 5) et la méthode objet, méthode que je vais présenter.</p>
<p><em>Remarque : Votre base de donnée doit forcément se trouver avec un droit d'accès 777.</em></p>
<h5>Méthode procédurale :</h5>
<pre class="php">$db = sqlite_open(&quot;db/gestionProjet.db&quot;);</pre>
<p> </p>
<h5>Méthode objet :</h5>
<pre class="php">$sqlite = new SQLiteDatabase(&quot;db/gestionProjet.db&quot;);</pre>
<p><em>Information : Il est possible de faire passer deux paramètres de plus, le mode d'accès qui pour le moment est ignoré des bibliothèques de SQLite (valeur par défaut 0666), et un message d'erreur affiché dans le cas où la base n'arrive pas à être ouverte.</em></p>
<h3>Résolution de la contrainte (ancienne méthode)</h3>
<p>Avant, nous aurions simplement exécuté une requête allant compter le nombre de participants actuel au projet, si le chiffre était inférieur à quatre, alors nous aurions laissé faire la requête d'insertion d'un participant, dans le cas contraire nous aurions directement affiché un message d'erreur.</p>
<p><em>Information : La table qui contient les employés participants à des projets s'appelle participer et le champ de cette table qui fait lien avec un projet s'appelle partProjet.</em></p>
<p>Voici le code :</p>
<pre class="php">$nb = $sqlite-&gt;singleQuery(&quot;select count(*) from participer where partProjet=&quot;.$_POST['projet'].&quot;&quot;);
if ($nb &lt; 4) {
     // Requête d'insertion
} else {
     // Message d'erreur (cause : il faut moins de quatre participants pour un projet)
}</pre>
<h3>Résolution de la contrainte (utilisation d'un déclencheur)</h3>
<p>Gràce à SQLite, il est possible de mettre en place un déclencheur (trigger), il est spécifié pour ce dernier dans quelle condition et sur quelle table il sera appelé automatiquement. La condition spécifie si l'action se fera lors d'une insertion (insert), d'une modification (update) ou d'une suppression (delete) ensuite il faut préciser sur quelle table se fera cette vérification. Par la suite automatiquement, lors d'une insertion sur la table spécifié, par exemple, un traitement viendra s'exécuter.</p>
<p>On peut de plus accéder aux données de la requête qui a amené au traitement du déclencheur.</p>
<ul>
<li>Lors d'une insertion, on utilisera le mot clé <em>new</em> avant le champ que l'on cherche à récupérer.</li>
<li>Lors d'une modification, on utilisera <em>old</em> pour accéder à la valeur qui va être remplacée, et <em>new</em> pour accéder à la valeur de remplacement.</li>
<li>Lors d'une suppression, on utilisera <em>old</em> pour accéder à la valeur qui va être supprimée.</li>
</ul>
<p><em>Information : Je ne connais pas trop le langage SQL de SQLite qui permet de faire les déclencheurs, j'ai appris qu'il était fortement semblable au PL SQL de Oracle. Pour ma part j'ai repris un exemple pour m'inspirer de mes déclencheurs.</em></p>
<p>Il faut ensuite mettre en place un déclencheur de ce style :</p>
<pre class="sql">create trigger verifNbreParticipants before insert on participer for each row
begin
select case
when (select count(*) from participer where partProjet=new.partProjet)&gt;=4 then raise (fail, 'Erreur nombre participants')
end;
end;</pre>
<p><em>Information : Exécutez simplement une requête à la base de donnée contenant ce déclencheur pour l'activer.</em></p>
<p>A partir de la, refaites votre insertion, jusqu'à ce qu'il y ai quatre participants pour un projet. Vous verrez apparaître une belle erreur en haut de votre navigateur :</p>
<pre class="php">Warning: SQLiteDatabase::query() [function.query]: Erreur nombre participants</pre>
<p>On reconnaît tout de même le message d'erreur que l'on a prévu dans le déclencheur :</p>
<pre class="php">raise (fail, 'Erreur nombre participants')</pre>
<h3>Redéfinition des messages d'erreurs en PHP</h3>
<p>On ne va pas laisser cette vieille erreur en haut du navigateur quand même ?! La méthode <em>set_error_handler()</em> nous permet de redéfinir les messages d'erreurs de PHP. Il suffit de lui passer en paramètre le nom de la fonction qui prendra en charge les messages d'erreurs.</p>
<p><em>Information : Vous trouverez plus d'information sur cette fonction et sur les paramètres spécifiés ci-dessous, <a href="http://www.nexen.net/docs/php/annotee/function.set-error-handler.php?lien=handler" hreflang="fr">ici</a>.</em></p>
<p>Créons une fonction de gestion des erreurs :</p>
<pre class="php">function gestionErreur($errno, $errstr, $errfile, $errline) {
     if (ereg(&quot;Erreur nombre participants&quot;, $errstr)) {
          $erreur = &quot;Il ne peut pas y avoir plus de quatre développeurs sur un même projet.&quot;;
     }
}</pre>
<p>A partir de la vous pouvez faire afficher cette erreur à l'endroit où vous voulez et avec votre propre mise en page, comme ceci :<br />
<img src="/uploads/skillexchange/Divers/gestionErreur.jpg" alt="" width="401" class="border" /></p>
<h3>Conclusion</h3>
<p>Ce style de programmation permet de bien séparer les tàches et les traitements.<br />
Verdict : je langi vraiment que ce soit implémenté sous MySQL.</p>
]]></description>
    </item>
        <item>
      <title>[Article] Faire son propre moteur de template</title>
      <link>http://jeremybarthe.com/fr/php/faire-son-propre-moteur-de-template</link>
      <guid>http://jeremybarthe.com/fr/php/faire-son-propre-moteur-de-template</guid>
      <comments>http://jeremybarthe.com/fr/php/faire-son-propre-moteur-de-template#comments</comments>
            <category><![CDATA[PHP]]></category>
            <author>Jérémy Barthe &lt;contact@jeremybarthe.com&gt;</author>
      <pubDate>Thu, 14 Apr 2005 17:53:00 +0200</pubDate>
      <description><![CDATA[<p>On est loin des <a href="http://smarty.php.net/">Smarty</a> ou autre <a href="http://www.templeet.org/index.fr.html">templeet</a>, mais l'idée de programmer son propre moteur de template peut être interessante, d'autant plus lorsque votre projet PHP est simple et ne demande donc pas l'utilisation des fonctions complexes de tels moteurs de templates. Vous gagnerez ainsi en rapidité d'execution et en consomation de ressource serveur.</p>
<h4>Mais tout d'abord, qu'est ce qu'un moteur de template ?</h4>
<p>Le moteur de template est un moyen élégant de séparer la forme, de la programmation <i>(le fond)</i>. D'un côté vous aurez votre programmation PHP / ASP / etc. <i>(dans notre cas PHP)</i> et de l'autre vos différents fichiers templates correspondants à un modèle de mise en page.<br />
La conception du projet d'une part, et la conception des pages d'autre part seront grandement facilité.<br />
Immaginez une page PHP sans <i>echo "";</i> ^^<br />
Dans la même optique, fini les <i>"</i> au milieu du HTML :)<br />
Quelques exemples parmis bien d'autres qui vous facilitent la vie lors de l'utilisation d'un moteur de template. </p>
<h4>Rôle du moteur de template</h4>
<p>Le moteur de template va simplement afficher la page que vous souhaitez, en d'autre terme, vous passerez en paramètre le nom du fichier à afficher et le moteur de template se charge du reste.<br />
Vous avez en plus de cela la possibilité de faire afficher la valeur de retour d'une variable, chose pratique sinon vos pages aurez été statique :) Il vous faudra donc choisir un formalisme de notation des variables pour votre moteur de template. Dans l'exemple suivant, le voici : <i>{variable}</i>. La variable <i>{variable}</i> devra donc être remplacée par une valeur. Ce procédé se fait dans votre programmation PHP, juste avant d'afficher le contenu d'un fichier template. </p>
<h4>Les données de la classe de votre moteur de template</h4>
<p>En premier lieu votre fichier devra comporter l'entête de la classe, c'est à dire :</p>
<pre class="php">&lt;?php
class template {}
?&gt;</pre>
<p>Les données vous aideront sans doute à comprendre ce qu'il faut stocker pour que le moteur de template fonctionne, les voici : </p>
<pre class="php">private $repertoireTemplate;
private $contenuAAfficher;
private $variablesAssigneesCle;
private $variablesAssigneesValeur;</pre>
<p><b>$repertoireTemplate</b> contient le chemin vers le répertoire contenant vos fichiers template.<br />
<b>$contenuAAfficher</b> représente le contenu de votre fichier template à afficher.<br />
<b>$variablesAssigneesCle</b> c'est le nom de la variable du moteur de template à remplacer, dans notre cas ci-dessus <i>({variable})</i>, il faudrait donc mettre en clé "variable".<br />
<b>$variablesAssigneesValeur;</b> représente les valeurs de remplacement des variables du moteur de template. </p>
<h4>Le contructeur de la classe</h4>
<pre class="php">function __construct($repertoire) {
     $this-&gt;repertoireTemplate = $repertoire;
     $this-&gt;contenuAAfficher = &quot;&quot;;
     $this-&gt;variablesAssigneesCle = array();
     $this-&gt;variablesAssigneesValeur = array();
}</pre>
<p>Ce constructeur reçoit qu'un paramètre, le chemin vers le répertoire de vos fichiers templates.<br />
Vous allez maintenant voir à quoi ressemble l'entête de votre fichier PHP :</p>
<pre class="php">&lt;?php
require(&quot;template.class.php&quot;); // moteur de template
$tpl = new template(&quot;templates/&quot;);
?&gt;</pre>
<h4>Assigner une valeur PHP à une variable du moteur de template</h4>
<p>La fonction suivante vous permettra d'assigner une clé à une valeur, la clé est le nom de votre variable dans le moteur de template, tandis que la valeur peut être une variable PHP, le résultat d'une requête, une simple chaîne de caractère.</p>
<pre class="php">function ajouteAccolade($val) {
     return &quot;{&quot;.$val.&quot;}&quot;;
}

function assigner($cle, $valeur) {
     $cle = $this-&gt;ajouteAccolade($cle);
     array_push($this-&gt;variablesAssigneesCle, $cle);
     array_push($this-&gt;variablesAssigneesValeur, $valeur);
}</pre>
<p>La fonction <i>ajouteAccolade($val)</i> est en lien avec la notation des variables que nous avons choisi. Si vous souhaitez la changer, c'est ici que ça se passe :)<br />
<i>assigner($cle, $valeur)</i> quant à elle rajoute au tableau de clé et de valeur, les valeurs passées en paramètres. C'est à partir de ce tableau de clé et de valeur que nous ferons ensuite le changement des variables du moteur de template, juste avant d'afficher le contenu. Pour l'exemple (dans votre fichier PHP) : </p>
<pre class="php">$test = &quot;Gnome&quot;;
$tpl-&gt;assigner(&quot;test&quot;, $test);</pre>
<h4>Afficher le contenu d'un fichier template et remplacer les variables par des valeurs</h4>
<p>Voici le code de la fonction :</p>
<pre class="php">function ajouterTemplate($fichier) {
$this-&gt;contenuAAfficher = file_get_contents($this-&gt;repertoireTemplate.$fichier);
}

function afficher($fichier) {
     $this-&gt;ajouterTemplate($fichier);
     $this-&gt;contenuAAfficher = str_replace($this-&gt;variablesAssigneesCle, $this-&gt;variablesAssigneesValeur, $this-&gt;contenuAAfficher);
     echo $this-&gt;contenuAAfficher;
     $this-&gt;contenuAAfficher = &quot;&quot;;
     $this-&gt;variablesAssigneesCle = array();
     $this-&gt;variablesAssigneesValeur = array();
}</pre>
<p>La fonction <i>ajouterTemplate($fichier)</i> récupére tout le contenu du fichier template. <i>afficher($fichier)</i> quant à elle remplace les valeurs des clés par les valeurs des valeurs ^^ et  affiche le résultat. Il faut penser à réinitialiser les variables à vide, sinon votre texte va se cumuler et je ne traiterai pas ce modèle de template ici. Certains en effet permettent d'enregistrer le contenu de plusieurs fichiers templates et de les afficher tous à la fin.<br />
Toujours avec la même simplicité, voila comment faire afficher le contenu d'un fichier template dans votre navigateur. Tout d'abord il vous faut éditer votre premier fichier template :</p>
<pre class="html">Hello World! 
(Ca fait geek ça) 
{test} applets are nice!</pre>
<p>Vous enregistrerez ce dernier dans votre répertoire de templates sous un nom quelconque.<br />
Du côté PHP, voici ce que ça donne :</p>
<pre class="php">&lt;?php
require(&quot;template.class.php&quot;); // moteur de template
$tpl = new template(&quot;templates/&quot;);
$test = &quot;Gnome&quot;;
$tpl-&gt;assigner(&quot;test&quot;, $test);
$tpl-&gt;afficher(&quot;nomdufichiertemplate.tpl&quot;);
?&gt;</pre>
<p>{test} va être remplacé par Gnome dans notre exemple, ce qui donnera au final :</p>
<pre class="html">Hello World!
(Ca fait geek ça)
Gnome applets are nice!</pre>
<h4>Code complet du moteur de template</h4>
<pre class="php">
&lt;?php

class template {
	private $repertoireTemplate;
	private $contenuAAfficher;
	private $variablesAssigneesCle;
	private $variablesAssigneesValeur;

	function __construct($repertoire) {
		$this-&gt;repertoireTemplate = $repertoire;
		$this-&gt;contenuAAfficher = &quot;&quot;;
		$this-&gt;variablesAssigneesCle = array();
		$this-&gt;variablesAssigneesValeur = array();
	}

	function ajouterTemplate($fichier) {
		$this-&gt;contenuAAfficher = file_get_contents($this-&gt;repertoireTemplate.$fichier);
	}

	function assigner($cle, $valeur) {
		$cle = $this-&gt;ajouteAccolade($cle);
		array_push($this-&gt;variablesAssigneesCle, $cle);
		array_push($this-&gt;variablesAssigneesValeur, $valeur);
	}

	function ajouteAccolade($val) {
		return &quot;{&quot;.$val.&quot;}&quot;;
	}

	function afficher($fichier) {

		$this-&gt;ajouterTemplate($fichier);
		$this-&gt;contenuAAfficher = str_replace($this-&gt;variablesAssigneesCle, $this-&gt;variablesAssigneesValeur, $this-&gt;contenuAAfficher);
		echo $this-&gt;contenuAAfficher;
		$this-&gt;contenuAAfficher = &quot;&quot;;
		$this-&gt;variablesAssigneesCle = array();
		$this-&gt;variablesAssigneesValeur = array();
	}

	function setRepertoireTemplate($repertoire) {
		$this-&gt;repertoireTemplate = $repertoire;
	}
}

?&gt;</pre>
<h4>Conclusion</h4>
<p>Les moteurs de templates du style Smarty ou Templeet, vous permettront évidemment de faire beaucoup plus, puiqu'il vous sera possible d'intégrer un code ressemblant au PHP directement dans vos fichiers templates, ce qui vous permettra par exemple d'effectuer une boucle foreach ou un if. Ces moteurs de template compilent un fichier PHP à partir des informations renseignées dans le fichier template. Ils conservent donc une trace et permettent un système de cache. </p>
<p>Donc le moteur de template que je viens de vous présenter là est beaucoup moins complet, mais ne fait que 45 lignes de codes lol :) </p>
<p><i>Pour information, cette technique n'est peut être pas la meilleure, ou peut être déjà connue, je ne sais pas, mais bon, on fait partager, ce qu'on peut faire partager :) <br />j'espère que cet article n'est pas trop décousu et qu'il vous aidera.</i></p>
]]></description>
    </item>
        
  </channel>
</rss>
