<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0"><channel><title>AngeChierchia.com </title><link>http://blog.angechierchia.com</link><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/AngeChierchia" /><description>Front &amp; Back end Web Designer</description><language>en</language><lastBuildDate>Sat, 18 Feb 2012 05:36:52 PST</lastBuildDate><generator>http://wordpress.org/?v=</generator><sy:updatePeriod xmlns:sy="http://purl.org/rss/1.0/modules/syndication/">hourly</sy:updatePeriod><sy:updateFrequency xmlns:sy="http://purl.org/rss/1.0/modules/syndication/">1</sy:updateFrequency><xhtml:meta xmlns:xhtml="http://www.w3.org/1999/xhtml" name="robots" content="noindex" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/AngeChierchia" /><feedburner:info uri="angechierchia" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><creativeCommons:license>http://creativecommons.org/licenses/by-nc-nd/3.0/</creativeCommons:license><image><link>http://creativecommons.org/licenses/by-nc-nd/3.0/</link><url>http://creativecommons.org/images/public/somerights20.gif</url><title>Some Rights Reserved</title></image><feedburner:emailServiceId>AngeChierchia</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><feedburner:feedFlare href="http://add.my.yahoo.com/rss?url=http%3A%2F%2Ffeeds.feedburner.com%2FAngeChierchia" src="http://us.i1.yimg.com/us.yimg.com/i/us/my/addtomyyahoo4.gif">Subscribe with My Yahoo!</feedburner:feedFlare><feedburner:feedFlare href="http://www.newsgator.com/ngs/subscriber/subext.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2FAngeChierchia" src="http://www.newsgator.com/images/ngsub1.gif">Subscribe with NewsGator</feedburner:feedFlare><feedburner:feedFlare href="http://feeds.my.aol.com/add.jsp?url=http%3A%2F%2Ffeeds.feedburner.com%2FAngeChierchia" src="http://o.aolcdn.com/favorites.my.aol.com/webmaster/ffclient/webroot/locale/en-US/images/myAOLButtonSmall.gif">Subscribe with My AOL</feedburner:feedFlare><feedburner:feedFlare href="http://www.bloglines.com/sub/http://feeds.feedburner.com/AngeChierchia" src="http://www.bloglines.com/images/sub_modern11.gif">Subscribe with Bloglines</feedburner:feedFlare><feedburner:feedFlare href="http://www.netvibes.com/subscribe.php?url=http%3A%2F%2Ffeeds.feedburner.com%2FAngeChierchia" src="http://www.netvibes.com/img/add2netvibes.gif">Subscribe with Netvibes</feedburner:feedFlare><feedburner:feedFlare href="http://fusion.google.com/add?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2FAngeChierchia" src="http://buttons.googlesyndication.com/fusion/add.gif">Subscribe with Google</feedburner:feedFlare><feedburner:feedFlare href="http://www.pageflakes.com/subscribe.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2FAngeChierchia" src="http://www.pageflakes.com/ImageFile.ashx?instanceId=Static_4&amp;fileName=ATP_blu_91x17.gif">Subscribe with Pageflakes</feedburner:feedFlare><feedburner:feedFlare href="http://www.plusmo.com/add?url=http%3A%2F%2Ffeeds.feedburner.com%2FAngeChierchia" src="http://plusmo.com/res/graphics/fbplusmo.gif">Subscribe with Plusmo</feedburner:feedFlare><feedburner:feedFlare href="http://www.thefreedictionary.com/_/hp/AddRSS.aspx?http%3A%2F%2Ffeeds.feedburner.com%2FAngeChierchia" src="http://img.tfd.com/hp/addToTheFreeDictionary.gif">Subscribe with The Free Dictionary</feedburner:feedFlare><feedburner:feedFlare href="http://www.bitty.com/manual/?contenttype=rssfeed&amp;contentvalue=http%3A%2F%2Ffeeds.feedburner.com%2FAngeChierchia" src="http://www.bitty.com/img/bittychicklet_91x17.gif">Subscribe with Bitty Browser</feedburner:feedFlare><feedburner:feedFlare href="http://www.live.com/?add=http%3A%2F%2Ffeeds.feedburner.com%2FAngeChierchia" src="http://tkfiles.storage.msn.com/x1piYkpqHC_35nIp1gLE68-wvzLZO8iXl_JMledmJQXP-XTBOLfmQv4zhj4MhcWEJh_GtoBIiAl1Mjh-ndp9k47If7hTaFno0mxW9_i3p_5qQw">Subscribe with Live.com</feedburner:feedFlare><feedburner:feedFlare href="http://mix.excite.eu/add?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2FAngeChierchia" src="http://image.excite.co.uk/mix/addtomix.gif">Subscribe with Excite MIX</feedburner:feedFlare><feedburner:feedFlare href="http://www.webwag.com/wwgthis.php?url=http%3A%2F%2Ffeeds.feedburner.com%2FAngeChierchia" src="http://www.webwag.com/images/wwgthis.gif">Subscribe with Webwag</feedburner:feedFlare><feedburner:feedFlare href="http://www.podcastready.com/oneclick_bookmark.php?url=http%3A%2F%2Ffeeds.feedburner.com%2FAngeChierchia" src="http://www.podcastready.com/images/podcastready_button.gif">Subscribe with Podcast Ready</feedburner:feedFlare><feedburner:feedFlare href="http://www.wikio.com/subscribe?url=http%3A%2F%2Ffeeds.feedburner.com%2FAngeChierchia" src="http://www.wikio.com/shared/img/add2wikio.gif">Subscribe with Wikio</feedburner:feedFlare><feedburner:feedFlare href="http://www.dailyrotation.com/index.php?feed=http%3A%2F%2Ffeeds.feedburner.com%2FAngeChierchia" src="http://www.dailyrotation.com/rss-dr2.gif">Subscribe with Daily Rotation</feedburner:feedFlare><item><title>Avancements du projet « Thèmes à monter soi-même »</title><link>http://feedproxy.google.com/~r/AngeChierchia/~3/xLUXvvayVik/</link><category>Vis ma vie</category><category>CSS</category><category>HTML</category><category>ressources</category><category>Webdesign</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Ange Chierchia</dc:creator><pubDate>Sat, 18 Feb 2012 05:28:06 PST</pubDate><guid isPermaLink="false">http://blog.angechierchia.com/?p=1425</guid><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[<p>Mi-octobre je lançais l&#8217;idée de proposer des templates HTML5/CSS3 à télécharger gratuitement ici sur le blog, je ne reviendrai pas sur <a
title="Des templates HTML5/CSS3 gratuits, ça vous intéresse ?" href="http://blog.angechierchia.com/xhtml-css/template-html5-css3-gratuit/">les raisons qui m&#8217;ont poussées à entamer cette démarche</a>, ici j&#8217;ai envie de vous parler de comment ce présente l&#8217;enfant.</p><p><span
id="more-1425"></span></p><p>A l&#8217;origine j&#8217;avais prévu de mettre ces thèmes à disposition dès le mois de janvier, me disant que deux mois et demi auraient suffit pour proposer déjà un premier thème, d&#8217;ailleurs celui-ci est prêt, en tout cas en ce qui concerne la maquette Photoshop. Concernant l&#8217;intégration de celui-ci, c&#8217;est <a
title="Nicolas Candelon sur Twitter" href="http://twitter.com/Rhadax">Nicolas Candelon</a> qui s&#8217;en est occupé et s&#8217;il m&#8217;a permis de prendre un peu d&#8217;avance sur mon retard, il faut tout de même que je regarde si tout colle bien (oui, j&#8217;y pense Nico <img
src='http://blog.angechierchia.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> ).</p><div
id="attachment_1426" class="wp-caption aligncenter" style="width: 695px"><img
class="size-full wp-image-1426 " title="preview-theme-curriculum" src="http://blog.angechierchia.com/wp-content/uploads/preview-theme-curriculum.jpg" alt="" width="685" height="250" /><p
class="wp-caption-text">Le premier thème à paraître : &quot;Curriculum&quot;, conçu pour les sites one-page de type CV.</p></div><p>Pendant que je terminais la maquette Photoshop, j&#8217;ai réalisé que la structure actuelle du blog ne convenait plus pour mettre en avant les thèmes proposés gratuitement, il a donc fallu que je retravaille la chose. C&#8217;est là qu&#8217;est intervenu Nicolas Candelon, qui cherchait à ce faire la main. J&#8217;avais besoin d&#8217;aide, il avait besoin de pratiquer l&#8217;intégration : chacun est gagnant. Je lui ai donc proposé d&#8217;intégrer <em>Curriculum</em>, pendant que je me penchais sur mon problème.</p><p>À la mi-décembre, la maquette du blog est terminé, je m&#8217;apprête à passer à l&#8217;intégration, tout est parfaitement dans les temps.</p><div
id="attachment_1432" class="wp-caption aligncenter" style="width: 1034px"><img
class="size-large wp-image-1432 " title="blog-2012" src="http://blog.angechierchia.com/wp-content/uploads/blog-2012-1024x928.png" alt="" width="1024" height="928" /><p
class="wp-caption-text">Le blog, version 2012, en cours développement.</p></div><p>Et puis, un mail d&#8217;une certaine Stéphanie Guillaume, redac-chef du magazine Web Design arrive dans ma boîte mail, me proposant d&#8217;écrire  un tutoriel + interview pour le prochain hors série Photoshop pour les Webdesigners&#8230;</p><p>La deadline était au 2 janvier, mais pourquoi refuser ?! J&#8217;ai donc laissé tout ça de côté pour me concentrer sur ce tutoriel. Vous pouvez d&#8217;ailleurs le trouver chez votre marchant de journaux, il est bourré de tutoriels super intéressants.</p><div
id="attachment_1435" class="wp-caption aligncenter" style="width: 970px"><img
class="size-full wp-image-1435" title="article-webdesign-mag" src="http://blog.angechierchia.com/wp-content/uploads/article-webdesign-mag.jpg" alt="" width="960" height="717" /><p
class="wp-caption-text">Webdesign Magazine HS n°13</p></div><p>Parallèlement à ça, mes compères et moi travaillions toujours sur notre projet Webdesign Friday, cherchant à lui donner un nouvel élan pour 2012.</p><p>Pas mal de boulot donc.</p><p>La bonne nouvelle, c&#8217;est que maintenant tout c&#8217;est relativement calmé, l&#8217;intégration du blog avance très bien. Tout ça devrait donc être en ligne d&#8217;ici fin mars (oui, je me prend une belle marge, on ne sait jamais) !</p> <img src="http://feeds.feedburner.com/~r/AngeChierchia/~4/xLUXvvayVik" height="1" width="1"/>]]></content:encoded><description>Mi-octobre je lançais l&amp;#8217;idée de proposer des templates HTML5/CSS3 à télécharger gratuitement ici sur le blog, je ne reviendrai pas sur les raisons qui m&amp;#8217;ont poussées à entamer cette démarche, ici j&amp;#8217;ai envie de vous parler de comment ce présente l&amp;#8217;enfant. A l&amp;#8217;origine j&amp;#8217;avais prévu de mettre ces thèmes à disposition dès le mois de [...]</description><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blog.angechierchia.com/ma-vie/avancements-du-projet-themes-a-monter-soi-meme/feed/</wfw:commentRss><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">0</slash:comments><feedburner:origLink>http://blog.angechierchia.com/ma-vie/avancements-du-projet-themes-a-monter-soi-meme/</feedburner:origLink></item><item><title>Créer son propre « framework » PHP, pourquoi ?</title><link>http://feedproxy.google.com/~r/AngeChierchia/~3/4e4GC9PohAw/</link><category>PHP/MySQL</category><category>framework</category><category>PHP</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Ange Chierchia</dc:creator><pubDate>Sun, 11 Dec 2011 23:15:50 PST</pubDate><guid isPermaLink="false">http://blog.angechierchia.com/?p=1372</guid><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[<p><img
width="633" height="120" src="http://blog.angechierchia.com/wp-content/uploads/framework-perso-php.jpg" class="attachment-post-thumbnail wp-post-image" alt="framework-perso-php" title="framework-perso-php" /></p>Cela fait maintenant presque deux ans que je suis entré dans la vie active en tant que développeur et designer Web. Et en tant que tel, je suis souvent (comprenez : tout le temps) amené à faire quasiment les mêmes choses, bien que chaque projet soit différent.
Personnellement j'aime passer du temps à peaufiner un design. je déteste réécrire les mêmes fonctions pour chaque projet. Alors oui, il a les framework, mais pourquoi utiliser un bazooka lorsqu'on doit abattre une mouche ?<span
id="more-1372"></span><p
class="author_note">Attention, l'article est un chouilla trop long (beaucoup de lignes de code).</p> Oui utiliser une CMS déjà tout fait c'est bien, oui utiliser un framework en PHP Objet c'est bien. Seulement parfois, utiliser une arme de destruction massive n'est pas la bonne méthode à appliquer pour régler les choses les plus simples.
Ces dernier mois, au fil des projets qui le permettaient, j'ai pu me construire ma propre bibliothèque de fonctions, en essayant de l'améliorer à chaque itérations, tout en restant le plus générique possible pour permettre une très bonne portabilité de projet en projet. Bien sûr je n'ai pas hésité à piquer des idées dans les frameworks PHP, mais plutôt que de me trimballer toute la clique, j'ai maintenant un petit "framework" qui me permet de faire juste ce dont j'ai besoin. Cela m'a aussi permis de monter facilement notre propre CMS, lui aussi très basique.
Aujourd'hui j'ai donc envie de partager avec vous quelques unes de mes fonctions, car ça fait un petit moment que je n'ai pas publié un peut de code PHP dans mes pages.<h2>Mes fonctions de <abbr
title="Create, Read, Update, Delete">CRUD</abbr></h2> Etape obligatoire lorsqu'on souhaite agir sur des informations stockées en base de données, les célèbres fonctions INSERT, SELECT, UPDATE et DELETE. Après plusieurs itérations je suis arrivé à des fonctions quasiment utilisable par n'importe quel projet, même si je pense qu'elles ne sont pas encore parfaites, pour le moment elles me suffisent. Cependant, si vous avez de quoi les améliorer n'hésitez pas à me donner votre avis !<h3>Ajouter un enregistrement dans une table</h3> Après pas mal de projet dans lesquels j'avais une fonction d'ajout pour chaque type de contenu (page, article, etc.) enregistrés dans des tables différentes, j'ai essayé de trouver un moyen simple d'ajouter n'importe quelle données dans n'importe quelle table. Je suis donc passé de plusieurs fonction plus ou moins lourde à une bête fonction d'une quinzaine de ligne avec laquelle je peux faire ce que je veux, simplement en lui passant un tableau des données à ajouter, et le nom de la table dans laquelle faire cet INSERT.<pre>/***
 *	insert des données dans la table en paramètre
 *	@datas	tableau des données à insérer dont la clé et le nom du champs dans la table
 *	@table	table dans laquelle insérer les données
 */
function add($datas, $table){
	$bdd = db(); //on ouvre la connexion à la base de données
	foreach($datas as $key =&gt; $value){
		$keys[] = $key;
		$values[] = $value;
	}
	$strSQL = "INSERT INTO ".$table." (";
	foreach($keys as $ky =&gt; $k){ $strSQL .= $k . ","; }
	$strSQL = substr($strSQL,0,-1) . ") VALUES(";
	foreach($values as $vl =&gt; $v){ $strSQL .= "?,"; }
	$strSQL = substr($strSQL,0,-1) . ")";
	$query = $bdd-&gt;prepare($strSQL);
	if($query-&gt;execute($values)) return $bdd-&gt;lastInsertId();
	else return false;
}</pre><strong>Comment utiliser la fonction ?</strong> Après avoir vérifiées, échappées, etc., les informations soumisent à mon formulaire, il me suffit de créer un tableau dont les clés seront les noms des champs que je veux renseigner pendant mon INSERT. <em><span
style="text-decoration: underline;">Exemple :</span> je veux renseigner le nom, l'adresse email et le commentaire dans la table "comments".</em><pre>$datas = array(
	'nom' =&gt; $nom,
	'email' =&gt; $email,
	'commentaire' =&gt; $commentaire
);
if(add($datas,'comments')) {
	return "cool";
} else return "pas cool";</pre>Si tout c'est bien passé, la fonction <code>add()</code> me renvoie l'ID de l'enregistrement créé.<h3>Mettre à jour les informations d'un enregistrement</h3> Là aussi, c'est une fonction vraiment très simple. comme ma fonction add(), ma fonction update() requiert un tableau des données et le nom de la table à modifier. Seul petit changement, on doit aussi fournir l'ID de l'enregistrement à modifier.<pre>/***
 *	met à jour les données de l'ID dans la table en paramètre
 *	@id	identifiant de la ligne à modifier
 *	@datas 	tableau des données à insérer dont la clé et le nom du champs dans la table
 *	@table 	table dans laquelle insérer les données
 */
function update($id, $datas, $table){
	$bdd = db();
	foreach($datas as $key =&gt; $value){
		$keys[] = $key;
		$values[] = $value;
	}
	$strSQL = "UPDATE ".$table." SET ";
	foreach($datas as $key =&gt; $value){
		$strSQL .= $key . " = ?,";
	} $strSQL = substr($strSQL,0,-1) . " WHERE id = ?";
	$values[] = $id;
	$query = $bdd-&gt;prepare($strSQL);
	if($query-&gt;execute($values)) return true;
	else return false;
}</pre><h3>Supprimer un enregistrement</h3> Rien de bien compliqué là non plus, on supprime l'enregistrement dont l'ID est passé en paramètre dans la table elle aussi en paramètre.<pre>/***
 *	supprime les données correspondant à l'ID dans la table en paramètre
 *	@id		identifiant de la ligne à supprimer
 *	@table	table sur laquelle on applique la suppression
 */
function delete($id, $table){
	$bdd = db();
	$strSQL = "DELETE FROM ".$table." WHERE id = ?";
	$query = $bdd-&gt;prepare($strSQL);
	//print_r(array($id));
	if($query-&gt;execute(array($id))) return true;
	else return false;
}</pre><h3>Retourner une liste d'enregistrements</h3> Cette dernière est l'une des fonctions que j'ai eu le plus de mal à rendre générique tout en me permettant de faire beaucoup de choses avec, comme par exemple préparer le terrain pour l'utiliser dans le cadre des données scindées sur plusieurs pages.
Ici ma fonction me permet de récupérer à la fois les enregistrements de ma requête, le total d'enregistrements que retournerai ma requête si aucun paramètre LIMIT n'était renseigné, la requête exécutée (pour les tests en phase de développement) ou les erreurs possibles quant à l'exécution de cette requête.<pre>/***
 * 	retourne le resultat d'un select
 *	@columns 	colonnes à selectionner pour la requête (ex: array('champ1','champ2') ou '*')
 *	@table 		nom de la table sur laquelle faire la requête
 *	@where 		champs sur lequels appliquer des conditions ( ex: array( 'champ1 =' =&gt; 'valeur', 'champ2 LIKE' =&gt; 'valeur%') )
 *	@concats 	[ AND | OR ]
 *	@order 		champs sur lequels appliquer le tri, et l'ordre pour chaque champs (ex: array('champ1' =&gt; 'ASC','champ2' =&gt; 'DESC') )
 *	@limit 		limit[0] =&gt; debut de la liste, limit[1] =&gt; nombre d'éléments dans la liste retournée (ex: array('0','20') )
 *
 *	return @retour	: tableau contenant la requête executée, les éventuelles erreurs et le resultat de la requête
 */
function get($columns = null, $table = null, $where = null, $concats = "AND", $order = null, $limit = null){
	$bdd = db();
	$retour = array(); //variable de type tableau, retournée par la fonction
	$rows = "";
	$clause = "";
	$sort = "";
	$limitStr = "";
	if(!is_null($columns) &amp;&amp; !is_null($table)){
		// si $rows est un tableau ou égale à * tout va bien.
		if(is_array($columns)){
			foreach($columns as $column) { $rows .= $column .', '; }
			$rows = substr($rows,0,-2);
		} elseif($columns == '*'){
			$rows = '*';
		} else {
			$retour['erreur'] = "Les champs selectionné doivent être appelé depuis une variable Tableau";
		}
		if(!in_array(strtolower($concats),array('and','or'))){
			$retour['erreur'] = "&lt;strong&gt;".$concats."&lt;/strong&gt; n'est pas une valeur autorisée pour concaténer des conditions. Utilisez 'OR' ou 'AND'.";
		}
		/*
		si @where est renseigné, on filtre les résultats grâce au tableau @where construit comme suit :
			array ('colname operateur' =&gt; 'valeur');
			ex: array('page_id =' =&gt; 5);
		sinon, on ne filtre pas les résultats
		*/
		if(!is_null($where) &amp;&amp; is_array($where)){
			foreach($where as $k =&gt; $v){
				$clause .= $k." ? ".$concats." ";
				$values[] = $v;
			}
			$clause = " WHERE ".substr($clause,0,(-(strlen($concats)+2)));
		} elseif(!is_null($where) &amp;&amp; !is_array($where)){
			$retour['erreur'] = "La clause WHERE doit être construite via une variable Tableau";
		} else {
			$clause = "";
		}
		//si $order est un tableau et n'est pas null
		if(!is_null($order) &amp;&amp; is_array($order)){
			foreach($order as $k =&gt; $v){ $sort .= $k." ".$v.", "; }
			$sort = " ORDER BY ".substr($sort,0,-2);
		} elseif(!is_null($order) &amp;&amp; !is_array($order)) {
			$retour['erreur'] = "ORDER BY doit être construit via une variable Tableau";
		} else {
			$sort = "";
		}
		if(!is_null($limit) &amp;&amp; is_array($limit) &amp;&amp; is_numeric($limit[0]) &amp;&amp; is_numeric($limit[1])){
			$debut = $limit[0];
			$nbRows = $limit[1];
			$limitStr = " LIMIT " . $debut . "," . $nbRows;
		} elseif(!is_null($limit) &amp;&amp; !is_array($limit)){
			$retour['erreur'] = "LIMIT doit être construit via un tableau de deux entiers";
		} else {
			$limitStr = "";
		}
		// on construit la requête
		$strSQL = "SELECT ".$rows." FROM ".$table.$clause.$sort.$limitStr;
		if(empty($retour['erreur'])){
			$query = $bdd-&gt;prepare($strSQL);
			$query-&gt;execute(@$values);
			$retour['requete'] = $strSQL;
			$retour['reponse'] = $query-&gt;fetchAll(PDO::FETCH_ASSOC);
			$sqlTotal = "SELECT COUNT(*) as total FROM ".$table.$clause.$sort;
			$q = $bdd-&gt;prepare($sqlTotal);
			$q-&gt;execute(@$values);
			$tot = $q-&gt;fetchAll(PDO::FETCH_ASSOC);
			$retour['total'] = $tot[0]['total'];
		}
	} else {
		$retour['erreur'] = "Impossible de créer la requete, les champs à selectionner et la table sont vide";
	}
	return $retour;
}</pre><strong>Comment utiliser la fonction ?</strong> <em><span
style="text-decoration: underline;">Exemple :</span> Je veux récupérer les cinq articles les plus récents écrits par nighcrawl dont le titre contient le mot "framework" publié depuis la date à laquelle la requête est exécutée.</em><pre>$champs = array('id','titre','nom','contenu');
$conditions = array(
	'nom =' =&gt; 'nighcrawl',
	'date &lt; =' =&gt; date('Y-m-d H:i:s'),
	'titre LIKE' =&gt; '%framework%'
);
$trier = array('date' =&gt; 'DESC');
$limite = array(0, 5);
$resultat = get($champs,'articles',$conditions,"AND",$trier,$limite);
if(isset($resultat['reponse'])){
	foreach($resultat['reponse'] as $row){
		echo "&lt;article&gt;
		&lt;header&gt;
			&lt;h1&gt;".$row['titre']."&lt;/h1&gt;
		&lt;/header&gt;
		&lt;div&gt;".$row['contenu']."&lt;/div&gt;
		&lt;footer&gt;Auteur : ".$row['nom']."&lt;/footer&gt;
		&lt;/article&gt;";
	}
}
else echo $resultat['erreur'];</pre><h2>Mettre en place un système de pagination</h2> Je m'arrêterai ici parce que l'article est déjà pas mal long, et si vous êtes arrivé jusqu'ici je vous dis chapeau. Personnellement je me serai déjà arrêté :). On fini donc avec une fonction très utile pour générer rapidement des liens de pagination afin de répartir les données d'une requête sur plusieurs pages. Voici donc la belle fonction :<pre>/***
 *	génère des liens de pagination : numeros de pages, 'suivants', 'précédents'
 *	@total	nombre total d'enregistremnts à paginer
 *	@nbpp	nombre d'enregistrements à afficher par page
 *	@link	chaine qui servira à construire les liens vers les différentes pages
 */
function pagination($total, $nbpp, $link){
	echo"&lt;div class='pagination'&gt;";
		/** Pagination **/
		//calcul du nombre de pages
		$nbLiens = ceil($total/$nbpp);
		if($nbLiens &gt; 1){
			/** précédents **/
			if(isset($_GET['d']) &amp;&amp; $_GET['d'] &gt; 0){
				echo "&lt;a href='".$link.($_GET['d']-$nbpp)."'&gt;« Précédents&lt;/a&gt;";
			} else {
				echo "&lt;span&gt;« Précédents&lt;/span&gt;";
			}
			/** pages ***/
			for($i = 0; $i &lt; $nbLiens; $i++){
				if($_GET['d'] == ($i*$nbpp)){
					echo "&lt;span class='active_pagi'&gt;".($i+1)."";
				} else {
					echo "&lt;a href='".$link.($i*$nbpp)."'&gt;".($i+1)."&lt;/a&gt;";
				}
			}
			/** suivants **/
			if(isset($_GET['d']) &amp;&amp; $_GET['d'] &gt;= 0 &amp;&amp; $_GET['d'] &lt; ($total-$nbpp)){
				echo "&lt;a href='".$link.($_GET['d']+$nbpp)."'&gt;Suivants »&lt;/a&gt;";
			} else {
				echo "&lt;span&gt;Suivants »&lt;/span&gt;";
			}
		}
	echo "&lt;/div&gt;";
}</pre>La pagination va s'effectuée en deux temps, d'abord l'appel de la fonction get(), puis l'appel de la fonction pagination(). Si on réutilise l'exemple précédent :<pre>$nbpp = 5; //5 articles par page
$limite = array(intval($_GET['d']),$nbpp);
$resultat = get($champs,'articles',$conditions,"AND",$trier,$limite);
if(isset($resultat['reponse'])){
	foreach ($resultat as $row) {
		//affichage des articles
		...
	}
	pagination($resultat['total'],$nbpp,'index.php?parametre=valeur&amp;d=');
} else echo $resultat['erreur'];</pre><h2>Fin !</h2> Merci de m'avoir lu jusqu'au bout. Je vous libère ici ! En espérant que ces quelques fonctions puissent vous être utiles. Elles ne sont pas parfaites et certaines pourraient être encore améliorées, alors si vous avez des idées, n'hésitez pas à les partager dans les commentaires.<img src="http://feeds.feedburner.com/~r/AngeChierchia/~4/4e4GC9PohAw" height="1" width="1"/>]]></content:encoded><description>&lt;p&gt;&lt;img
width="633" height="120" src="http://blog.angechierchia.com/wp-content/uploads/framework-perso-php.jpg" class="attachment-post-thumbnail wp-post-image" alt="framework-perso-php" title="framework-perso-php" /&gt;&lt;/p&gt;Cela fait maintenant presque deux ans que je suis entré dans la vie active en tant que développeur et designer Web. Et en tant que tel, je suis souvent (comprenez : tout le temps) amené à faire quasiment les mêmes choses, bien que chaque projet soit différent.
Personnellement j'aime passer du temps à peaufiner un design. je déteste réécrire les mêmes fonctions pour chaque projet. Alors oui, il a les framework, mais pourquoi utiliser un bazooka lorsqu'on doit abattre une mouche ?&lt;span
id="more-1372"&gt;&lt;/span&gt;&lt;p
class="author_note"&gt;Attention, l'article est un chouilla trop long (beaucoup de lignes de code).&lt;/p&gt; Oui utiliser une CMS déjà tout fait c'est bien, oui utiliser un framework en PHP Objet c'est bien. Seulement parfois, utiliser une arme de destruction massive n'est pas la bonne méthode à appliquer pour régler les choses les plus simples.
Ces dernier mois, au fil des projets qui le permettaient, j'ai pu me construire ma propre bibliothèque de fonctions, en essayant de l'améliorer à chaque itérations, tout en restant le plus générique possible pour permettre une très bonne portabilité de projet en projet. Bien sûr je n'ai pas hésité à piquer des idées dans les frameworks PHP, mais plutôt que de me trimballer toute la clique, j'ai maintenant un petit "framework" qui me permet de faire juste ce dont j'ai besoin. Cela m'a aussi permis de monter facilement notre propre CMS, lui aussi très basique.
Aujourd'hui j'ai donc envie de partager avec vous quelques unes de mes fonctions, car ça fait un petit moment que je n'ai pas publié un peut de code PHP dans mes pages.&lt;h2&gt;Mes fonctions de &lt;abbr
title="Create, Read, Update, Delete"&gt;CRUD&lt;/abbr&gt;&lt;/h2&gt; Etape obligatoire lorsqu'on souhaite agir sur des informations stockées en base de données, les célèbres fonctions INSERT, SELECT, UPDATE et DELETE. Après plusieurs itérations je suis arrivé à des fonctions quasiment utilisable par n'importe quel projet, même si je pense qu'elles ne sont pas encore parfaites, pour le moment elles me suffisent. Cependant, si vous avez de quoi les améliorer n'hésitez pas à me donner votre avis !&lt;h3&gt;Ajouter un enregistrement dans une table&lt;/h3&gt; Après pas mal de projet dans lesquels j'avais une fonction d'ajout pour chaque type de contenu (page, article, etc.) enregistrés dans des tables différentes, j'ai essayé de trouver un moyen simple d'ajouter n'importe quelle données dans n'importe quelle table. Je suis donc passé de plusieurs fonction plus ou moins lourde à une bête fonction d'une quinzaine de ligne avec laquelle je peux faire ce que je veux, simplement en lui passant un tableau des données à ajouter, et le nom de la table dans laquelle faire cet INSERT.&lt;pre&gt;/***
 *	insert des données dans la table en paramètre
 *	@datas	tableau des données à insérer dont la clé et le nom du champs dans la table
 *	@table	table dans laquelle insérer les données
 */
function add($datas, $table){
	$bdd = db(); //on ouvre la connexion à la base de données
	foreach($datas as $key =&amp;gt; $value){
		$keys[] = $key;
		$values[] = $value;
	}
	$strSQL = "INSERT INTO ".$table." (";
	foreach($keys as $ky =&amp;gt; $k){ $strSQL .= $k . ","; }
	$strSQL = substr($strSQL,0,-1) . ") VALUES(";
	foreach($values as $vl =&amp;gt; $v){ $strSQL .= "?,"; }
	$strSQL = substr($strSQL,0,-1) . ")";
	$query = $bdd-&amp;gt;prepare($strSQL);
	if($query-&amp;gt;execute($values)) return $bdd-&amp;gt;lastInsertId();
	else return false;
}&lt;/pre&gt;&lt;strong&gt;Comment utiliser la fonction ?&lt;/strong&gt; Après avoir vérifiées, échappées, etc., les informations soumisent à mon formulaire, il me suffit de créer un tableau dont les clés seront les noms des champs que je veux renseigner pendant mon INSERT. &lt;em&gt;&lt;span
style="text-decoration: underline;"&gt;Exemple :&lt;/span&gt; je veux renseigner le nom, l'adresse email et le commentaire dans la table "comments".&lt;/em&gt;&lt;pre&gt;$datas = array(
	'nom' =&amp;gt; $nom,
	'email' =&amp;gt; $email,
	'commentaire' =&amp;gt; $commentaire
);
if(add($datas,'comments')) {
	return "cool";
} else return "pas cool";&lt;/pre&gt;Si tout c'est bien passé, la fonction &lt;code&gt;add()&lt;/code&gt; me renvoie l'ID de l'enregistrement créé.&lt;h3&gt;Mettre à jour les informations d'un enregistrement&lt;/h3&gt; Là aussi, c'est une fonction vraiment très simple. comme ma fonction add(), ma fonction update() requiert un tableau des données et le nom de la table à modifier. Seul petit changement, on doit aussi fournir l'ID de l'enregistrement à modifier.&lt;pre&gt;/***
 *	met à jour les données de l'ID dans la table en paramètre
 *	@id	identifiant de la ligne à modifier
 *	@datas 	tableau des données à insérer dont la clé et le nom du champs dans la table
 *	@table 	table dans laquelle insérer les données
 */
function update($id, $datas, $table){
	$bdd = db();
	foreach($datas as $key =&amp;gt; $value){
		$keys[] = $key;
		$values[] = $value;
	}
	$strSQL = "UPDATE ".$table." SET ";
	foreach($datas as $key =&amp;gt; $value){
		$strSQL .= $key . " = ?,";
	} $strSQL = substr($strSQL,0,-1) . " WHERE id = ?";
	$values[] = $id;
	$query = $bdd-&amp;gt;prepare($strSQL);
	if($query-&amp;gt;execute($values)) return true;
	else return false;
}&lt;/pre&gt;&lt;h3&gt;Supprimer un enregistrement&lt;/h3&gt; Rien de bien compliqué là non plus, on supprime l'enregistrement dont l'ID est passé en paramètre dans la table elle aussi en paramètre.&lt;pre&gt;/***
 *	supprime les données correspondant à l'ID dans la table en paramètre
 *	@id		identifiant de la ligne à supprimer
 *	@table	table sur laquelle on applique la suppression
 */
function delete($id, $table){
	$bdd = db();
	$strSQL = "DELETE FROM ".$table." WHERE id = ?";
	$query = $bdd-&amp;gt;prepare($strSQL);
	//print_r(array($id));
	if($query-&amp;gt;execute(array($id))) return true;
	else return false;
}&lt;/pre&gt;&lt;h3&gt;Retourner une liste d'enregistrements&lt;/h3&gt; Cette dernière est l'une des fonctions que j'ai eu le plus de mal à rendre générique tout en me permettant de faire beaucoup de choses avec, comme par exemple préparer le terrain pour l'utiliser dans le cadre des données scindées sur plusieurs pages.
Ici ma fonction me permet de récupérer à la fois les enregistrements de ma requête, le total d'enregistrements que retournerai ma requête si aucun paramètre LIMIT n'était renseigné, la requête exécutée (pour les tests en phase de développement) ou les erreurs possibles quant à l'exécution de cette requête.&lt;pre&gt;/***
 * 	retourne le resultat d'un select
 *	@columns 	colonnes à selectionner pour la requête (ex: array('champ1','champ2') ou '*')
 *	@table 		nom de la table sur laquelle faire la requête
 *	@where 		champs sur lequels appliquer des conditions ( ex: array( 'champ1 =' =&amp;gt; 'valeur', 'champ2 LIKE' =&amp;gt; 'valeur%') )
 *	@concats 	[ AND | OR ]
 *	@order 		champs sur lequels appliquer le tri, et l'ordre pour chaque champs (ex: array('champ1' =&amp;gt; 'ASC','champ2' =&amp;gt; 'DESC') )
 *	@limit 		limit[0] =&amp;gt; debut de la liste, limit[1] =&amp;gt; nombre d'éléments dans la liste retournée (ex: array('0','20') )
 *
 *	return @retour	: tableau contenant la requête executée, les éventuelles erreurs et le resultat de la requête
 */
function get($columns = null, $table = null, $where = null, $concats = "AND", $order = null, $limit = null){
	$bdd = db();
	$retour = array(); //variable de type tableau, retournée par la fonction
	$rows = "";
	$clause = "";
	$sort = "";
	$limitStr = "";
	if(!is_null($columns) &amp;amp;&amp;amp; !is_null($table)){
		// si $rows est un tableau ou égale à * tout va bien.
		if(is_array($columns)){
			foreach($columns as $column) { $rows .= $column .', '; }
			$rows = substr($rows,0,-2);
		} elseif($columns == '*'){
			$rows = '*';
		} else {
			$retour['erreur'] = "Les champs selectionné doivent être appelé depuis une variable Tableau";
		}
		if(!in_array(strtolower($concats),array('and','or'))){
			$retour['erreur'] = "&amp;lt;strong&amp;gt;".$concats."&amp;lt;/strong&amp;gt; n'est pas une valeur autorisée pour concaténer des conditions. Utilisez 'OR' ou 'AND'.";
		}
		/*
		si @where est renseigné, on filtre les résultats grâce au tableau @where construit comme suit :
			array ('colname operateur' =&amp;gt; 'valeur');
			ex: array('page_id =' =&amp;gt; 5);
		sinon, on ne filtre pas les résultats
		*/
		if(!is_null($where) &amp;amp;&amp;amp; is_array($where)){
			foreach($where as $k =&amp;gt; $v){
				$clause .= $k." ? ".$concats." ";
				$values[] = $v;
			}
			$clause = " WHERE ".substr($clause,0,(-(strlen($concats)+2)));
		} elseif(!is_null($where) &amp;amp;&amp;amp; !is_array($where)){
			$retour['erreur'] = "La clause WHERE doit être construite via une variable Tableau";
		} else {
			$clause = "";
		}
		//si $order est un tableau et n'est pas null
		if(!is_null($order) &amp;amp;&amp;amp; is_array($order)){
			foreach($order as $k =&amp;gt; $v){ $sort .= $k." ".$v.", "; }
			$sort = " ORDER BY ".substr($sort,0,-2);
		} elseif(!is_null($order) &amp;amp;&amp;amp; !is_array($order)) {
			$retour['erreur'] = "ORDER BY doit être construit via une variable Tableau";
		} else {
			$sort = "";
		}
		if(!is_null($limit) &amp;amp;&amp;amp; is_array($limit) &amp;amp;&amp;amp; is_numeric($limit[0]) &amp;amp;&amp;amp; is_numeric($limit[1])){
			$debut = $limit[0];
			$nbRows = $limit[1];
			$limitStr = " LIMIT " . $debut . "," . $nbRows;
		} elseif(!is_null($limit) &amp;amp;&amp;amp; !is_array($limit)){
			$retour['erreur'] = "LIMIT doit être construit via un tableau de deux entiers";
		} else {
			$limitStr = "";
		}
		// on construit la requête
		$strSQL = "SELECT ".$rows." FROM ".$table.$clause.$sort.$limitStr;
		if(empty($retour['erreur'])){
			$query = $bdd-&amp;gt;prepare($strSQL);
			$query-&amp;gt;execute(@$values);
			$retour['requete'] = $strSQL;
			$retour['reponse'] = $query-&amp;gt;fetchAll(PDO::FETCH_ASSOC);
			$sqlTotal = "SELECT COUNT(*) as total FROM ".$table.$clause.$sort;
			$q = $bdd-&amp;gt;prepare($sqlTotal);
			$q-&amp;gt;execute(@$values);
			$tot = $q-&amp;gt;fetchAll(PDO::FETCH_ASSOC);
			$retour['total'] = $tot[0]['total'];
		}
	} else {
		$retour['erreur'] = "Impossible de créer la requete, les champs à selectionner et la table sont vide";
	}
	return $retour;
}&lt;/pre&gt;&lt;strong&gt;Comment utiliser la fonction ?&lt;/strong&gt; &lt;em&gt;&lt;span
style="text-decoration: underline;"&gt;Exemple :&lt;/span&gt; Je veux récupérer les cinq articles les plus récents écrits par nighcrawl dont le titre contient le mot "framework" publié depuis la date à laquelle la requête est exécutée.&lt;/em&gt;&lt;pre&gt;$champs = array('id','titre','nom','contenu');
$conditions = array(
	'nom =' =&amp;gt; 'nighcrawl',
	'date &amp;lt; =' =&amp;gt; date('Y-m-d H:i:s'),
	'titre LIKE' =&amp;gt; '%framework%'
);
$trier = array('date' =&amp;gt; 'DESC');
$limite = array(0, 5);
$resultat = get($champs,'articles',$conditions,"AND",$trier,$limite);
if(isset($resultat['reponse'])){
	foreach($resultat['reponse'] as $row){
		echo "&amp;lt;article&amp;gt;
		&amp;lt;header&amp;gt;
			&amp;lt;h1&amp;gt;".$row['titre']."&amp;lt;/h1&amp;gt;
		&amp;lt;/header&amp;gt;
		&amp;lt;div&amp;gt;".$row['contenu']."&amp;lt;/div&amp;gt;
		&amp;lt;footer&amp;gt;Auteur : ".$row['nom']."&amp;lt;/footer&amp;gt;
		&amp;lt;/article&amp;gt;";
	}
}
else echo $resultat['erreur'];&lt;/pre&gt;&lt;h2&gt;Mettre en place un système de pagination&lt;/h2&gt; Je m'arrêterai ici parce que l'article est déjà pas mal long, et si vous êtes arrivé jusqu'ici je vous dis chapeau. Personnellement je me serai déjà arrêté :). On fini donc avec une fonction très utile pour générer rapidement des liens de pagination afin de répartir les données d'une requête sur plusieurs pages. Voici donc la belle fonction :&lt;pre&gt;/***
 *	génère des liens de pagination : numeros de pages, 'suivants', 'précédents'
 *	@total	nombre total d'enregistremnts à paginer
 *	@nbpp	nombre d'enregistrements à afficher par page
 *	@link	chaine qui servira à construire les liens vers les différentes pages
 */
function pagination($total, $nbpp, $link){
	echo"&amp;lt;div class='pagination'&amp;gt;";
		/** Pagination **/
		//calcul du nombre de pages
		$nbLiens = ceil($total/$nbpp);
		if($nbLiens &amp;gt; 1){
			/** précédents **/
			if(isset($_GET['d']) &amp;amp;&amp;amp; $_GET['d'] &amp;gt; 0){
				echo "&amp;lt;a href='".$link.($_GET['d']-$nbpp)."'&amp;gt;« Précédents&amp;lt;/a&amp;gt;";
			} else {
				echo "&amp;lt;span&amp;gt;« Précédents&amp;lt;/span&amp;gt;";
			}
			/** pages ***/
			for($i = 0; $i &amp;lt; $nbLiens; $i++){
				if($_GET['d'] == ($i*$nbpp)){
					echo "&amp;lt;span class='active_pagi'&amp;gt;".($i+1)."";
				} else {
					echo "&amp;lt;a href='".$link.($i*$nbpp)."'&amp;gt;".($i+1)."&amp;lt;/a&amp;gt;";
				}
			}
			/** suivants **/
			if(isset($_GET['d']) &amp;amp;&amp;amp; $_GET['d'] &amp;gt;= 0 &amp;amp;&amp;amp; $_GET['d'] &amp;lt; ($total-$nbpp)){
				echo "&amp;lt;a href='".$link.($_GET['d']+$nbpp)."'&amp;gt;Suivants »&amp;lt;/a&amp;gt;";
			} else {
				echo "&amp;lt;span&amp;gt;Suivants »&amp;lt;/span&amp;gt;";
			}
		}
	echo "&amp;lt;/div&amp;gt;";
}&lt;/pre&gt;La pagination va s'effectuée en deux temps, d'abord l'appel de la fonction get(), puis l'appel de la fonction pagination(). Si on réutilise l'exemple précédent :&lt;pre&gt;$nbpp = 5; //5 articles par page
$limite = array(intval($_GET['d']),$nbpp);
$resultat = get($champs,'articles',$conditions,"AND",$trier,$limite);
if(isset($resultat['reponse'])){
	foreach ($resultat as $row) {
		//affichage des articles
		...
	}
	pagination($resultat['total'],$nbpp,'index.php?parametre=valeur&amp;amp;d=');
} else echo $resultat['erreur'];&lt;/pre&gt;&lt;h2&gt;Fin !&lt;/h2&gt; Merci de m'avoir lu jusqu'au bout. Je vous libère ici ! En espérant que ces quelques fonctions puissent vous être utiles. Elles ne sont pas parfaites et certaines pourraient être encore améliorées, alors si vous avez des idées, n'hésitez pas à les partager dans les commentaires.</description><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blog.angechierchia.com/php-mysql/creer-son-framework-php/feed/</wfw:commentRss><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">2</slash:comments><feedburner:origLink>http://blog.angechierchia.com/php-mysql/creer-son-framework-php/</feedburner:origLink></item><item><title>Humane JS : vos notifications utilisateur en JavaScript</title><link>http://feedproxy.google.com/~r/AngeChierchia/~3/Mo9tRcFaRDE/</link><category>Ajax/JavaScript</category><category>Javascript</category><category>notifications</category><category>ressources</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Ange Chierchia</dc:creator><pubDate>Sat, 10 Dec 2011 09:00:37 PST</pubDate><guid isPermaLink="false">http://blog.angechierchia.com/?p=1412</guid><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[<p>Humane est une petite librairie JavaScript permettant d&#8217;afficher simplement des notifications à l&#8217;écran. Pas besoin d&#8217;un framework comme jQuery ou Mootools. Les animations sont réalisées en CSS3 quand le navigateur le permet ou bien via JavaScript si le navigateur ne les supporte pas.</p> <img src="http://feeds.feedburner.com/~r/AngeChierchia/~4/Mo9tRcFaRDE" height="1" width="1"/>]]></content:encoded><description>Humane est une petite librairie JavaScript permettant d&amp;#8217;afficher simplement des notifications à l&amp;#8217;écran. Pas besoin d&amp;#8217;un framework comme jQuery ou Mootools. Les animations sont réalisées en CSS3 quand le navigateur le permet ou bien via JavaScript si le navigateur ne les supporte pas.</description><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blog.angechierchia.com/ajax-javascript/humane-js-vos-notifications-utilisateur-en-javascript/feed/</wfw:commentRss><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">0</slash:comments><feedburner:origLink>http://blog.angechierchia.com/ajax-javascript/humane-js-vos-notifications-utilisateur-en-javascript/</feedburner:origLink></item><item><title>Moteurs de templates : fausse bonne idée ?</title><link>http://feedproxy.google.com/~r/AngeChierchia/~3/sl_VJesIR0k/</link><category>PHP/MySQL</category><category>CodeIgniter</category><category>framework</category><category>PHP</category><category>template</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Ange Chierchia</dc:creator><pubDate>Mon, 31 Oct 2011 01:24:56 PDT</pubDate><guid isPermaLink="false">http://blog.angechierchia.com/?p=1338</guid><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[<p><span
class="author_note">Aujourd&#8217;hui, j&#8217;inaugure le &laquo;&nbsp;Guest blogging&nbsp;&raquo; avec un article vraiment très intéressant de <a
title="Nicolas Torres, élève ingénieur passionné de Web design" href="http://ntorres.me" target="_blank">Nicolas Torres</a> sur l&#8217;intérêt mais aussi et surtout les &laquo;&nbsp;pièges&nbsp;&raquo; à éviter lorsqu&#8217;on utilise un moteur de templates (comme Smarty par exemple).</span></p><p><span
id="more-1338"></span></p><p>PHP se suffit à lui-même pour effectuer du <em>templating</em>, en déclarant toutes les variables dans un fichiers de traitement, et en les appelant dans un fichier d&#8217;affichage inclus à la fin du traitement. Pourquoi les développeurs utilisent-ils alors une surcouche ?</p><h2>Mauvaises excuses</h2><p>J&#8217;ai souvent entendu &laquo;&nbsp;pour que celui qui s&#8217;occupe de l&#8217;affichage n&#8217;aie pas besoin de connaissances en PHP&nbsp;&raquo; ou &laquo;&nbsp;pour appliquer simplement un cache par fichier &laquo;&nbsp;parsé&nbsp;&raquo; (inclus et interprété)&nbsp;&raquo;.</p><p>Effectivement la plupart de ces moteurs recréent une syntaxe simplifiée qui raccourcis le temps de codage et permettent une meilleur lisibilité du code telle que :</p><pre lang="php">{variable}</pre><p>au lieu de :</p><pre lang="php" escaped="true">&lt;?php echo $variable; ?&gt;</pre><h2>La faiblesse d&#8217;un tel procédé</h2><p>&laquo;&nbsp;Parser&nbsp;&raquo;, c&#8217;est consommer. Pour pouvoir interpréter correctement la syntaxe il faut utiliser des procédés de réécriture qui pèsent au chargement. Heureusement, lorsque le script est bien conçu, on n&#8217;effectue cette réécriture (compilation) qu&#8217;une seule fois après chaque modification du fichier <em>template</em>. Cela dit pour celui sur qui ça tombe, un mauvais &laquo;&nbsp;parseur&nbsp;&raquo; peut entraîner un lourd ralentissement pour une simple page.</p><p>Les programmeurs aimant bien s&#8217;inventer leur propre syntaxe et l&#8217;optimiser pour leur utilisation, ils sont parfois trop gourmands et confèrent à celle-ci bien plus de portée qu&#8217;elle ne devrait en posséder.</p><p>En effet certains ont tendance à vouloir appliquer des fonctions (<code>date()</code>, <code>htmlspecialchars_decode()</code>, <code>nl2br()</code>) au moment de l&#8217;appel de la variable. Hors il s&#8217;agit de traitement, et le traitement des données <strong>doit </strong>s&#8217;effectuer <strong>avant </strong>l&#8217;affichage.</p><p>Plus la syntaxe est développée, moins elle a d&#8217;intérêt, puisque son seul but est de <strong>diminuer le temps de codage</strong> et de <strong>gagner en lisibilité</strong>. J&#8217;ai souvent vu des moteurs utiliser une syntaxe XML telle que :</p><pre lang="php" escaped="true">&lt;foreach nom="nom_du_bloc"&gt;
    &lt;var nom="variable" /&gt;
&lt;/foreach&gt;</pre><p>qui possède un rapport performance/confort relativement faible par rapport à la syntaxe native :</p><pre lang="php" escaped="true">&lt;?php foreach ($nom_du_bloc as $row) : ?&gt;
    &lt;?php echo $row['variable']; ?&gt;
&lt;?php endforeach; ?&gt;</pre><p>A noter que la syntaxe PHP permet bien plus de souplesse dans la déclaration d&#8217;une boucle (concaténation, et &laquo;&nbsp;variable double&nbsp;&raquo; (<code>$$variable</code>) autorisées).</p><p>De plus, le cache peut être totalement indépendant. Il n&#8217;est donc pas nécessaire de passer par un moteur de <em>templates </em>pour pouvoir en appliquer un.</p><h2>Les bonnes pratiques</h2><p>On utilise un tel outil pour <strong>séparer le traitement de l&#8217;affichage</strong>, et optionnellement pour <strong>minimiser son code</strong> et le rendre <strong>plus clair</strong>.</p><p>Plusieurs approches sont alors pertinentes face à la question des performances. C&#8217;est certain, regrouper ses variables dans une &laquo;&nbsp;boîte noire&nbsp;&raquo;, loin des variables servant uniquement au traitement, est dans une certaine mesure très agréable. Mais avant de se jeter sur un moteur de <em>templates</em>, rélféchissez<em> </em>à quelle quantité de performance vous êtes prêt à céder.</p><h3>Un moteur sans syntaxe personnalisée</h3><p>C&#8217;est la solution la moins onéreuse. Le fameux framework <a
style="color: #ff1493;" href="http://codeigniter.com/">CodeIgniter</a> y a établi son camp. Pour gagner en confort, il est conseillé de trouver une solution pour séparer ses variables d&#8217;affichage à celles de traitement. L&#8217;une d&#8217;entre elles est de stocker ses variables dans un objet et inclure le fichier <em>template </em>dans une méthode en utilisant la fonction <a
style="color: #ff1493;" href="http://php.net/manual/fr/function.extract.php"><em>extract()</em></a>.</p><h3>Un moteur à syntaxe</h3><p>Prudence. Assurez-vous d&#8217;avoir une syntaxe suffisamment légère, et peu de fonctionnalités. Un moteur mettant à disposition l&#8217;appel de fonctions dans sa syntaxe doit être scrupuleusement analysé avant d&#8217;être employé. Le minimum nécessaire ? Appel de variables, boucles (appel de blocs) et conditions. Vérifiez que <code>preg_replace()</code>, <code>preg_replace_callback()</code> et <code>preg_match_all()</code> sont utilisées avec parcimonie car ils consomment des quantités astronomiques de performances.</p><h2>Conclusion</h2><p>Je ne me veux pas exhaustif sinon <strong>préventif </strong>quant à l&#8217;optimisation des performances. Avouez qu&#8217;écrire autant de code aussi complexe et moins souple que PHP pour perdre en performance est dénué de sens. Il est préconisé de chercher l&#8217;équilibre entre la performance et le confort, et enfin de garder en tête que le traitement n&#8217;est pas du ressort de l&#8217;affichage.</p> <img src="http://feeds.feedburner.com/~r/AngeChierchia/~4/sl_VJesIR0k" height="1" width="1"/>]]></content:encoded><description>Aujourd&amp;#8217;hui, j&amp;#8217;inaugure le &amp;#171;&amp;#160;Guest blogging&amp;#160;&amp;#187; avec un article vraiment très intéressant de Nicolas Torres sur l&amp;#8217;intérêt mais aussi et surtout les &amp;#171;&amp;#160;pièges&amp;#160;&amp;#187; à éviter lorsqu&amp;#8217;on utilise un moteur de templates (comme Smarty par exemple). PHP se suffit à lui-même pour effectuer du templating, en déclarant toutes les variables dans un fichiers de traitement, et en les [...]</description><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blog.angechierchia.com/php-mysql/reflexion-sur-les-moteurs-de-templates/feed/</wfw:commentRss><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">4</slash:comments><feedburner:origLink>http://blog.angechierchia.com/php-mysql/reflexion-sur-les-moteurs-de-templates/</feedburner:origLink></item><item><title>Des templates HTML5/CSS3 gratuits, ça vous intéresse ?</title><link>http://feedproxy.google.com/~r/AngeChierchia/~3/vLHQGLf9hlc/</link><category>XHTML/CSS</category><category>CSS</category><category>HTML</category><category>responsive</category><category>ressources</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Ange Chierchia</dc:creator><pubDate>Sat, 15 Oct 2011 07:54:00 PDT</pubDate><guid isPermaLink="false">http://blog.angechierchia.com/?p=1325</guid><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[<p>Ça viens de me tomber sur le bout du nez à l&#8217;instant. Malgré un cursus de développeur Web, j&#8217;ai toujours été attiré par le design Web, et encore plus ces deux dernières années, à tel point que je manque quelques fois de motivations quand vient le moment du développement pur est dur, préférant m&#8217;attarder sur le design dans Photoshop et son intégration HTML CSS. Mon poste actuel ne me permet pas de passer tout mon temps à concevoir des maquettes fonctionnelles, ergonomiques et jolies, et c&#8217;est dommage.<span
id="more-1325"></span></p><p>Ces derniers mois (cette dernière année ?), mon gros side-project a été de concevoir la charte graphique du <a
title="La communauté des Webdesigners Francophones" href="http://wdfriday.com" target="_blank">Webdesign Friday</a> et son intégration — aidé par Matthieu Bué, Clément Roy, Christophe Béghin et Nicolas Birckel notamment, le tout supervisé par l&#8217;ami Francis Chouquet — et quand on bosse sur un projet aussi énorme et surtout avec des gens comme eux, ça te fais prendre conscience de ce que tu aimes vraiment dans la conception de site Web. Moi c&#8217;est tout cette partie brainstorming, recherche de pistes graphiques, design et intégration, qui m&#8217;a vraiment plu.</p><p>Aussi, ces dernières années on a vu de nombreux sites proposant des templates de site Web &laquo;&nbsp;prêts-à-porter&nbsp;&raquo;, notamment les thèmes payants pour le CMS WordPress – n&#8217;hésitez d&#8217;ailleurs surtout pas à aller jeter un oeil chez <a
title="Peaxl | Parent &amp; Child WordPress themes, the stylish way" href="http://peaxl.com" target="_blank">Peaxl</a> (ça parle anglais mais c&#8217;est des p&#8217;tits francophones qui gèrent la boutique ! )</p><p>Ok, WordPress c&#8217;est cool, mais trouver de bons templates qui se soient pas spécifiques à un CMS, j&#8217;ai l&#8217;impression que c&#8217;est un mission impossible dès que tu sort du très populaire ThemeForest&#8230; Et encore, les templates qu&#8217;ils vendent se ressemblent tous à bien y regarder. Un peu comme sur Dribbble, où lorsque tu sort des plates-bandes, t&#8217;es bof.</p><h3>Mon idée</h3><p>Proposer des templates conçus en<strong> HTML5 </strong>et<strong> CSS3</strong>,<strong> adaptatifs et <span
style="text-decoration: underline;">gratuits</span></strong>.</p><p>Pourquoi gratuit ? Tout simplement parce que je ne souhaite pas entreprendre cette démarche pour m&#8217;en mettre plein les poches, je ne courrai pas non plus dernière le nombre de téléchargement des templates proposés.</p><p>Cette démarche, bien qu&#8217;elle soit là pour vous rendre service, est purement et simplement égoïste. L&#8217;argent ne m&#8217;intéresse pas ici, j&#8217;ai déjà un salaire, ce que je veux c&#8217;est simplement pouvoir pratiquer, expérimenter et m&#8217;améliorer pendant que je vous rend service.</p><p>Que pensez vous de ma démarche ? Quel type de template souhaiteriez vous voir, Pour quelle utilisation ? Portfolio, carte electronique, Curriculum Vitae, etc&#8230;?</p><p>J&#8217;attend vos retours sur le sujet !</p> <img src="http://feeds.feedburner.com/~r/AngeChierchia/~4/vLHQGLf9hlc" height="1" width="1"/>]]></content:encoded><description>Ça viens de me tomber sur le bout du nez à l&amp;#8217;instant. Malgré un cursus de développeur Web, j&amp;#8217;ai toujours été attiré par le design Web, et encore plus ces deux dernières années, à tel point que je manque quelques fois de motivations quand vient le moment du développement pur est dur, préférant m&amp;#8217;attarder sur [...]</description><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blog.angechierchia.com/xhtml-css/template-html5-css3-gratuit/feed/</wfw:commentRss><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">8</slash:comments><feedburner:origLink>http://blog.angechierchia.com/xhtml-css/template-html5-css3-gratuit/</feedburner:origLink></item><item><title>#wdfr S02E01 – Responsive Web Design</title><link>http://feedproxy.google.com/~r/AngeChierchia/~3/oeVOj-RnDjE/</link><category>Webdesign</category><category>responsive</category><category>wdfr</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Ange Chierchia</dc:creator><pubDate>Wed, 12 Oct 2011 06:30:53 PDT</pubDate><guid isPermaLink="false">http://blog.angechierchia.com/?p=1321</guid><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[<p>Le vendredi 2 septembre, on avait évoqué le responsive web design. Aujourd&#8217;hui, le compte rendu de la session a été publié sur le blog du Webdesign Friday.  Cliquez sur le titre du billet pour lire le compte rendu !</p> <img src="http://feeds.feedburner.com/~r/AngeChierchia/~4/oeVOj-RnDjE" height="1" width="1"/>]]></content:encoded><description>Le vendredi 2 septembre, on avait évoqué le responsive web design. Aujourd&amp;#8217;hui, le compte rendu de la session a été publié sur le blog du Webdesign Friday.  Cliquez sur le titre du billet pour lire le compte rendu !</description><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blog.angechierchia.com/webdesign/compte-rendu-wdfr-responsive-webdesign/feed/</wfw:commentRss><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">0</slash:comments><feedburner:origLink>http://blog.angechierchia.com/webdesign/compte-rendu-wdfr-responsive-webdesign/</feedburner:origLink></item><item><title>css3button.net – Vos boutons en CSS3, tout simplement</title><link>http://feedproxy.google.com/~r/AngeChierchia/~3/vi6LdIRPouo/</link><category>Webdesign</category><category>bouton</category><category>CSS</category><category>interface</category><category>ressources</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Ange Chierchia</dc:creator><pubDate>Fri, 16 Sep 2011 11:53:01 PDT</pubDate><guid isPermaLink="false">http://blog.angechierchia.com/?p=1316</guid><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[<p>Encore une petite trouvaille en cette fin de semaine (je vais finir par en faire une habitude si ça continue) : au programme aujourd&#8217;hui une ressource bien sympa pour créer nos joli bouton d&#8217;interface, comme les fameux boutons &laquo;&nbsp;Submit&nbsp;&raquo; de nos bon amis les formulaires Web.</p><p>On le sait tous, préparer nos images pour nos boutons de formulaire, que l&#8217;on va potentiellement utiliser un peu partout sur un site, c&#8217;est chiant. CSS3 nous sauve un peu la vie, les jolis boutons qu&#8217;on claque dans nos maquettes, c&#8217;est parfois pas la joie à intégrer.</p><p>Alors pourquoi ne pas créer ces boutons, fourrés aux dégradés et autres joyeusetés top-tendance,  directement avec CSS3, sans passer pas Photoshop ? Vous avez demandé un générateur qui vous mâche  les déclarations CSS? tant mieux!</p> <img src="http://feeds.feedburner.com/~r/AngeChierchia/~4/vi6LdIRPouo" height="1" width="1"/>]]></content:encoded><description>Encore une petite trouvaille en cette fin de semaine (je vais finir par en faire une habitude si ça continue) : au programme aujourd&amp;#8217;hui une ressource bien sympa pour créer nos joli bouton d&amp;#8217;interface, comme les fameux boutons &amp;#171;&amp;#160;Submit&amp;#160;&amp;#187; de nos bon amis les formulaires Web. On le sait tous, préparer nos images pour nos [...]</description><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blog.angechierchia.com/webdesign/css3button-net-%e2%80%93-vos-boutons-en-css3-tout-simplement/feed/</wfw:commentRss><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">0</slash:comments><feedburner:origLink>http://blog.angechierchia.com/webdesign/css3button-net-%e2%80%93-vos-boutons-en-css3-tout-simplement/</feedburner:origLink></item><item><title>FitVids.JS – adaptez vos vidéos à la taille de fenêtre</title><link>http://feedproxy.google.com/~r/AngeChierchia/~3/pyawXJJkqmU/</link><category>Ajax/JavaScript</category><category>jQuery</category><category>plugin</category><category>responsive</category><category>Webdesign</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Ange Chierchia</dc:creator><pubDate>Sat, 10 Sep 2011 05:53:17 PDT</pubDate><guid isPermaLink="false">http://blog.angechierchia.com/?p=1305</guid><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[<p>Vendredi dernier, on a parlé du Responsive Web design (RWD) pendant le #wdfr sur Twitter, vous aurez d&#8217;ailleurs un résumé de la sessions du 2 septembre sur le blog du WDfriday, une fois celui-ci en ligne.</p><p>Aujourd&#8217;hui, voilà pour vous une nouvelle ressource pour pouvoir servir vos vidéos YouTube, Dailymotion, Vimeo, etc. avec une largeur &laquo;&nbsp;responsive&nbsp;&raquo;, s&#8217;adaptant à la taille de la fenêtre. Vous n&#8217;avez plus d&#8217;excuse pour passer au <abbr
title="Responsive Web Design">RWD</abbr> !</p> <img src="http://feeds.feedburner.com/~r/AngeChierchia/~4/pyawXJJkqmU" height="1" width="1"/>]]></content:encoded><description>Vendredi dernier, on a parlé du Responsive Web design (RWD) pendant le #wdfr sur Twitter, vous aurez d&amp;#8217;ailleurs un résumé de la sessions du 2 septembre sur le blog du WDfriday, une fois celui-ci en ligne. Aujourd&amp;#8217;hui, voilà pour vous une nouvelle ressource pour pouvoir servir vos vidéos YouTube, Dailymotion, Vimeo, etc. avec une largeur [...]</description><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blog.angechierchia.com/ajax-javascript/responsive-design-adaptez-vos-videos/feed/</wfw:commentRss><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">0</slash:comments><feedburner:origLink>http://blog.angechierchia.com/ajax-javascript/responsive-design-adaptez-vos-videos/</feedburner:origLink></item><item><title>spin.js – votre loader full CSS</title><link>http://feedproxy.google.com/~r/AngeChierchia/~3/zXxtngKGtmo/</link><category>XHTML/CSS</category><category>CSS</category><category>ressources</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Ange Chierchia</dc:creator><pubDate>Sat, 03 Sep 2011 08:31:56 PDT</pubDate><guid isPermaLink="false">http://blog.angechierchia.com/?p=1300</guid><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[<p>Si vous servez du contenu via AJAX sur votre site, vous avez surement mis en place un loader au format GIF afin de montrer qu&#8217;un contenu est entrain d&#8217;être chargé et qu&#8217;il faut patienter quelques instant avant qu&#8217;il ne s&#8217;affiche. Et si je vous disais que ce petit &laquo;&nbsp;sablier&nbsp;&raquo; pouvait être remplacé par du simple CSS3, vous me croiriez? Non, alors cliquez voir sur ce lien et vous serez surpris <img
src='http://blog.angechierchia.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /></p> <img src="http://feeds.feedburner.com/~r/AngeChierchia/~4/zXxtngKGtmo" height="1" width="1"/>]]></content:encoded><description>Si vous servez du contenu via AJAX sur votre site, vous avez surement mis en place un loader au format GIF afin de montrer qu&amp;#8217;un contenu est entrain d&amp;#8217;être chargé et qu&amp;#8217;il faut patienter quelques instant avant qu&amp;#8217;il ne s&amp;#8217;affiche. Et si je vous disais que ce petit &amp;#171;&amp;#160;sablier&amp;#160;&amp;#187; pouvait être remplacé par du simple [...]</description><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blog.angechierchia.com/xhtml-css/spin-js-%e2%80%93-votre-loader-full-css/feed/</wfw:commentRss><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">0</slash:comments><feedburner:origLink>http://blog.angechierchia.com/xhtml-css/spin-js-%e2%80%93-votre-loader-full-css/</feedburner:origLink></item><item><title>FlexSlider — vos diaporamas « responsive »</title><link>http://feedproxy.google.com/~r/AngeChierchia/~3/Auf_b14ngrc/</link><category>Webdesign</category><category>jQuery</category><category>plugin</category><category>responsive</category><category>slider</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Ange Chierchia</dc:creator><pubDate>Wed, 31 Aug 2011 09:56:06 PDT</pubDate><guid isPermaLink="false">http://blog.angechierchia.com/?p=1293</guid><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[<p>Aujourd&#8217;hui, avec HTML5, CSS3 et les Media Queries, on fait de très jolies choses côté webdesign. Mais le must-have, hormis les rubans et autres joyeuseté bien rétro, c&#8217;est un design complètement &laquo;&nbsp;responsive&nbsp;&raquo;, adaptatif, afin de servir une mise en page différente de l&#8217;informations suivant le support (desktop, mobile, tablette, etc&#8230;).</p><p>La petite trouvaille d&#8217;aujourd&#8217;hui, est un diaporama utilisant le principe du responsive design! Vous pourrez donc vous la péter en gardant vos sliders dans les versions pour mobiles. #youpi!</p> <img src="http://feeds.feedburner.com/~r/AngeChierchia/~4/Auf_b14ngrc" height="1" width="1"/>]]></content:encoded><description>Aujourd&amp;#8217;hui, avec HTML5, CSS3 et les Media Queries, on fait de très jolies choses côté webdesign. Mais le must-have, hormis les rubans et autres joyeuseté bien rétro, c&amp;#8217;est un design complètement &amp;#171;&amp;#160;responsive&amp;#160;&amp;#187;, adaptatif, afin de servir une mise en page différente de l&amp;#8217;informations suivant le support (desktop, mobile, tablette, etc&amp;#8230;). La petite trouvaille d&amp;#8217;aujourd&amp;#8217;hui, est [...]</description><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blog.angechierchia.com/webdesign/flexslider-%e2%80%94-vos-diaporamas-responsive/feed/</wfw:commentRss><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">0</slash:comments><feedburner:origLink>http://blog.angechierchia.com/webdesign/flexslider-%e2%80%94-vos-diaporamas-responsive/</feedburner:origLink></item></channel></rss>

