<?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>slDesign &#187; Tutoriels</title>
	<atom:link href="http://sldesign.openwab.com/category/tutos/feed/" rel="self" type="application/rss+xml" />
	<link>http://sldesign.openwab.com</link>
	<description>Web, Dév &#38; More...</description>
	<lastBuildDate>Wed, 13 Oct 2010 10:09:06 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.4</generator>
		<item>
		<title>Tutoriel WordPress : Introduction &#224; la cr&#233;ation d&#8217;un th&#232;me WordPress personnalis&#233;</title>
		<link>http://sldesign.openwab.com/2010/10/04/tutoriel-wordpress-introduction-la-cration-dun-thme-wordpress-personnalis/</link>
		<comments>http://sldesign.openwab.com/2010/10/04/tutoriel-wordpress-introduction-la-cration-dun-thme-wordpress-personnalis/#comments</comments>
		<pubDate>Mon, 04 Oct 2010 10:32:50 +0000</pubDate>
		<dc:creator>Steve Leherpeux</dc:creator>
				<category><![CDATA[Tutoriels]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[Thème]]></category>
		<category><![CDATA[Tutoriel]]></category>
		<category><![CDATA[Widgets]]></category>
		<category><![CDATA[Wordpress Poedit]]></category>
		<category><![CDATA[Wordpress template]]></category>
		<category><![CDATA[Wordpress Thème]]></category>

		<guid isPermaLink="false">http://sldesign.openwab.com/2010/10/04/tutoriel-wordpress-introduction-la-cration-dun-thme-wordpress-personnalis/</guid>
		<description><![CDATA[Depuis quelques temps maintenant que je travaille sur WordPress comme base de mes développements Web, j’ai appris à utiliser ce moteur de blog, installer des extension et même en développer. WordPress est certes un outil puissant utilisable comme moteur de Blog mais également comme base à la réalisation de sites Web Dynamiques ou de sites [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fsldesign.openwab.com%2F2010%2F10%2F04%2Ftutoriel-wordpress-introduction-la-cration-dun-thme-wordpress-personnalis%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fsldesign.openwab.com%2F2010%2F10%2F04%2Ftutoriel-wordpress-introduction-la-cration-dun-thme-wordpress-personnalis%2F&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p><img style="display: inline; margin-left: 0px; margin-right: 0px; border-width: 0px;" title="splash_screen" src="http://sldesign.openwab.com/wp-content/uploads/2010/10/splash_screen.jpg" border="0" alt="splash_screen" width="244" height="244" align="left" /> Depuis quelques temps maintenant que je travaille sur WordPress comme base de mes développements Web, j’ai appris à utiliser ce moteur de blog, installer des extension et même en développer.</p>
<p>WordPress est certes un outil puissant utilisable comme moteur de Blog mais également comme base à la réalisation de sites Web Dynamiques ou de sites vitrines. Tous les blog WordPress sont réalisés sur la même base et pourtant, ils sont presque tous différents.</p>
<p>Je vous propose de partager avec moi une étape primordial qui fera de votre Blog un Blog unique, la création d’un thème personnalisé.</p>
<p>Infos :</p>
<p>Version du document : 0.1</p>
<hr class="clear_all" />
<h2>Sommaire :</h2>
<ul>
<li>Page 1 &#8211; <a title="Introduction" href="2010/10/04/tutoriel-wordpress-introduction-la-cration-dun-thme-wordpress-personnalis/1">Introduction</a></li>
<li>Page 2 &#8211; <a href="2010/10/04/tutoriel-wordpress-introduction-la-cration-dun-thme-wordpress-personnalis/2/">Préparation</a></li>
<li>Page 3 &#8211; <a href="2010/10/04/tutoriel-wordpress-introduction-la-cration-dun-thme-wordpress-personnalis/3/">Création d&#8217;un thème</a></li>
<li>Page 4 &#8211; <a href="2010/10/04/tutoriel-wordpress-introduction-la-cration-dun-thme-wordpress-personnalis/4/">Edition avancée</a></li>
<li>Page 5 &#8211; <a href="2010/10/04/tutoriel-wordpress-introduction-la-cration-dun-thme-wordpress-personnalis/5/">Affichage des pages</a></li>
<li>Page 6 &#8211; <a href="2010/10/04/tutoriel-wordpress-introduction-la-cration-dun-thme-wordpress-personnalis/6/">Sidebar</a></li>
<li>Page 7 &#8211; <a href="2010/10/04/tutoriel-wordpress-introduction-la-cration-dun-thme-wordpress-personnalis/7/">Administration du thème</a></li>
<li>Page 8 &#8211; <a href="2010/10/04/tutoriel-wordpress-introduction-la-cration-dun-thme-wordpress-personnalis/8/">Personnalisation du thème</a></li>
<li>Page 9 &#8211; <a href="2010/10/04/tutoriel-wordpress-introduction-la-cration-dun-thme-wordpress-personnalis/9/">Intégration de Widget</a></li>
<li>Page 10 &#8211; <a href="2010/10/04/tutoriel-wordpress-introduction-la-cration-dun-thme-wordpress-personnalis/10/">Conclusion</a></li>
</ul>
<p><span id="more-1018"></span></p>
<h2>I – Introduction</h2>
<h3>1°) Objet du tutoriel</h3>
<p>Cet article à pour objectif de vous apprendre à développer un thème complet pour WordPress. A la fin de ce didacticiel, vous serez (normalement) en mesure de réaliser un Template 100% personnalisable.</p>
<p>Cet article est amené à évolué, il sera mis à jour en fonction des commentaires et améliorations apportées à ce dernier.</p>
<p>Ce tutoriel est une<strong> introduction</strong> à la création de thème WordPress.</p>
<h4>Ce que n’est pas ce didacticiel :</h4>
<p>Ce didacticiel n’a pas pour vocation de vous apprendre à développer en CSS, HTML, PHP. Ces langages sont utilisés et vous devez donc les maîtriser.</p>
<p>Ce n’est pas une introduction à WordPress. Vous devez connaitre ce moteur de Blog, savoir l’installer et installer des extensions.</p>
<p>Cet article n’abordera pas en détail l’intégration graphique au sein de WordPress.</p>
<h3>2°) Pré-requis</h3>
<ul>
<li>PHP : Bonnes connaissances requises</li>
<li>CSS : Très bonne connaissance</li>
<li>JavaScript : Très bonne connaissances</li>
<li>WordPress : Bonne connaissance</li>
</ul>
<h3>3°) Editeur de code et outils de programmation</h3>
<h4>Editeur de Code HTML / PHP / JavaScript / CSS</h4>
<p>Certes, il vous est possible de suivre ce tutoriel avec un simple éditeur de texte… mais je vous conseille d’utiliser un puissant éditeur de code pouvant supporter les langages suivants :</p>
<ul>
<li>PHP</li>
<li>HTML</li>
<li>CSS</li>
<li>JavaScript / jQuery</li>
</ul>
<p>Pour ma part, j’utilise Aptana Studio disponible à l’adresse suivante <a title="http://www.aptana.com/ [Nouvelle fenêtre]" href="http://www.aptana.com/" target="_blank">http://www.aptana.com/</a> et qui intègre un ensemble d’outils vous permettant de développer des sites Web dynamiques HTML / PHP / JAVASCRIPT.</p>
<p>Un éditeur vous permettra d’accéder à différentes fonctions qui me semblent indispensables :</p>
<ul>
<li>Coloration syntaxique</li>
<li>Indentation</li>
<li>Numérotation de lignes</li>
<li>Recherche de documentation</li>
</ul>
<h4>Firefox et extensions pour développeurs</h4>
<p>Firefox est bien plus qu’un navigateur Web… il permet également d’accéder à de nombreux outils utiles aux développeurs.</p>
<p><strong>Extension Web Développer pour Firefox :</strong> Cette extension ajoute un menu à Firefox vous permettant d’avoir accès à différents outils :</p>
<ul>
<li>Gestion des cookies</li>
<li>Manipulation et affichage des feuilles de style css</li>
<li>Informations sur les images</li>
<li>Informations sur les formulaires</li>
<li>Outils de validation HTML / CSS (W3C)</li>
</ul>
<p>Site web de l’extension : <a title="http://chrispederick.com/work/web-developer/ [Nouvele fenêtre]" href="http://chrispederick.com/work/web-developer/" target="_blank">http://chrispederick.com/work/web-developer/</a></p>
<p><a href="http://sldesign.openwab.com/wp-content/uploads/2010/10/1.3.1wptwebfirefoxtoolbar.jpg"><img style="display: inline; border-width: 0px;" title="1.3.1-wpt-web-firefox-toolbar" src="http://sldesign.openwab.com/wp-content/uploads/2010/10/1.3.1wptwebfirefoxtoolbar_thumb.jpg" border="0" alt="1.3.1-wpt-web-firefox-toolbar" width="478" height="16" /></a></p>
<p><strong>Extension Firebug :</strong></p>
<p>Firebug est une extension primordial pour le développement de sites Web. Contrairement à la barre de développement “Web Développer” cette extension est orientée &#8216;client&#8217;; il est ainsi possible d’analyser le code généré côté client par JavaScript.</p>
<p><a href="http://sldesign.openwab.com/wp-content/uploads/2010/10/1.3.2wptfirebugfirefoxextension.jpg"><img style="display: inline; border-width: 0px;" title="1.3.2-wpt-firebug-firefox-extension" src="http://sldesign.openwab.com/wp-content/uploads/2010/10/1.3.2wptfirebugfirefoxextension_thumb.jpg" border="0" alt="1.3.2-wpt-firebug-firefox-extension" width="488" height="59" /></a></p>
<h3>4°) Ressources et documentations</h3>
<p>Voici une liste de liens utiles ; je vous encourage vivement à les consulter avant de commencer et de les avoirs dans vos favoris :</p>
<p><a title="http://codex.wordpress.org/Developer_Documentation" href="http://codex.wordpress.org/Developer_Documentation">http://codex.wordpress.org/Developer_Documentation</a> – Documentation WordPress à l’attention des développeurs</p>
<p><a title="http://codex.wordpress.org/Theme_Development" href="http://codex.wordpress.org/Theme_Development" target="_blank">http://codex.wordpress.org/Theme_Development</a> – Documentation spécifique aux développement de thèmes</p>
<p>Il est important de bien appréhender les notions techniques de WordPress et notamment cette page : <a title="Documentation API WordPress [Nouvelle fenêtre]" href="http://codex.wordpress.org/Plugin_API" target="_blank">http://codex.wordpress.org/Plugin_API</a> ; cette dernière vous apportera de nombreuses information sur l’API WordPress qui est à la base des développement autour du moteur de Blog.</p>
<h3>5°) Introduction à l’API WordPress</h3>
<p>Sans entrer dans les détails, je vais vous présenter en quelques lignes l’API WordPress. Une API vous permet d’interagir avec WordPress. Vous entendrez parler de HOOK</p>
<p>Il existe deux types de HOOK :</p>
<ul>
<li>Les filtres</li>
<li>Les actions</li>
</ul>
<p><strong>Les filtres</strong> sont des événements que WordPress lancent afin de modifier des textes de différents types avant de les insérer dans la base de données ou de les afficher à l’écran</p>
<p><strong>Les actions</strong> sont des événement que WordPress lance à des moments spécifique de leur exécution.</p>
<p>Ces éléments ne sont pas directement utilisés dans les thèmes mais principalement dans les plugins et widgets qui y sont intégrés</p>
<p>Les <a title="Documentation WordPress LOOP [Nouvelle fenêtre]" href="http://codex.wordpress.org/The_Loop" target="_blank">LOOPS</a> sont utilisés par WordPress pour afficher chacun de vos articles.</p>
<p>La syntaxe de base est la suivante :</p>
<pre class="brush:php">&lt;?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?&gt;</pre>
<h3>6°) Informations utiles</h3>
<p>WordPress est installé en local chez moi sur un serveur LAMPP. OS Windows. J’utilise l’éditeur de Code Aptana Studio. Le rendu est réalisé sur Firefox. Il sera donc nécessaire de rendre ce code compatible avec d’autres navigateurs WEB.</p>
<p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save"><img src="http://sldesign.openwab.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a> </p>]]></content:encoded>
			<wfw:commentRss>http://sldesign.openwab.com/2010/10/04/tutoriel-wordpress-introduction-la-cration-dun-thme-wordpress-personnalis/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Tutoriel HTML 5 : R&#233;aliser une lecteur vid&#233;o personnalis&#233;</title>
		<link>http://sldesign.openwab.com/2010/09/14/tutoriel-html-5-raliser-une-lecteur-vido-personnalis/</link>
		<comments>http://sldesign.openwab.com/2010/09/14/tutoriel-html-5-raliser-une-lecteur-vido-personnalis/#comments</comments>
		<pubDate>Tue, 14 Sep 2010 11:43:19 +0000</pubDate>
		<dc:creator>Steve Leherpeux</dc:creator>
				<category><![CDATA[HTML / CSS]]></category>
		<category><![CDATA[Tutoriels]]></category>
		<category><![CDATA[CSS3]]></category>
		<category><![CDATA[HTML5]]></category>
		<category><![CDATA[Vidéo]]></category>

		<guid isPermaLink="false">http://sldesign.openwab.com/2010/09/14/tutoriel-html-5-raliser-une-lecteur-vido-personnalis/</guid>
		<description><![CDATA[Depuis la sortie de HTML5 il est possible d&#8217;insérer et de manipuler de nombreux médias dans vos pages WEB, vous pouvez entre autre insérer un lecteur vidéo. C’est un réel plus pour les développeurs Web. Nous allons donc voir comment intégrer un lecteur vidéo et comment le personnaliser afin d’obtenir le même design quelque soit [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fsldesign.openwab.com%2F2010%2F09%2F14%2Ftutoriel-html-5-raliser-une-lecteur-vido-personnalis%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fsldesign.openwab.com%2F2010%2F09%2F14%2Ftutoriel-html-5-raliser-une-lecteur-vido-personnalis%2F&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; margin-left: 0px; border-left-width: 0px; margin-right: 0px" title="lecteur-html5-splash-screen" border="0" alt="lecteur-html5-splash-screen" align="left" src="http://sldesign.openwab.com/wp-content/uploads/2010/09/lecteurhtml5splashscreen.jpg" width="276" height="219" /> Depuis la sortie de HTML5 il est possible d&#8217;insérer et de manipuler de nombreux médias dans vos pages WEB, vous pouvez entre autre insérer un lecteur vidéo. C’est un réel plus pour les développeurs Web.</p>
<p>Nous allons donc voir comment intégrer un lecteur vidéo et comment le personnaliser afin d’obtenir le même design quelque soit le navigateur.</p>
<p><strong>Information sur le document :</strong> </p>
<ul>
<li>Version : 0.1 </li>
<li>Date de publication : 14-09-2010 </li>
<li>Date de révision : NC </li>
</ul>
<p> <span id="more-950"></span><br />
<h2>Introduction</h2>
<p>Avant de commencer vous trouverez sur le site du &quot;W3C l&#8217;ensemble des informations portant sur la balise l&#8217;intégration de vidéo. Ces informations sont disponibles à l&#8217;adresse suivante : <a title="Site W3C - Spécification de la balise video [Ouverture dans une nouvelle fenêtre]" href="http://www.w3.org/TR/2008/WD-html5-20080610/video.html#video" target="_blank">http://www.w3.org/TR/2008/WD-html5-20080610/video.html#video</a> </p>
<p>Je tiens également à vous rappeler que l&#8217;intégration de vidéo via la balise &#8216;&lt;video&gt;&lt;/video&gt; n&#8217;est pas supporté par l&#8217;ensemble des navigateurs&#8230; et plus encore compliqué, les navigateurs ne supportent pas tous le même format de vidéo&#8230; </p>
<h3>Théorie&#8230;</h3>
<p>L&#8217;intégration de vidéo en HTML 5 se fait avec la balise &quot;&lt;video&gt;&quot;. Cette balise supporte différents attributs : </p>
<ul>
<li><strong>src :</strong>La source de la vidéo </li>
<li><strong>poster :</strong> La source d&#8217;une image qui sera affichée si le navigateur ne supporte pas la balise &quot;video&quot; </li>
<li><strong>autoplay :</strong>Démarrage automatique de la vidéo [Défaut = false] </li>
<li><strong>start :</strong> Début de la vidéo </li>
<li><strong>loopstart :</strong> Début de la lecture en boucle </li>
<li><strong>loopend :</strong> Fin de la lecture en boucle </li>
<li><strong>end :</strong> La vidéo est à la fin </li>
<li><strong>playcount :</strong> Nombre de fois à lire </li>
<li><strong>controls :</strong> Affiche ou non les contrôles </li>
<li><strong>width :</strong> Largeur du lecteur </li>
<li><strong>zq</strong> hauteur du lecteur </li>
</ul>
<p>Les attributs src, autoplay, start, loopstart, loopend, end, playcount, et sont des attributs commun à tous les éléments de type &quot;Médias&quot;. </p>
<h2>Les étapes</h2>
<h3>Etape 1 &#8211; Création du document de base</h3>
<p>Nous utiliserons ici une simple page Web : </p>
<pre class="brush:html">&lt;!DOCTYPE html&gt;
&lt;head&gt;
&lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=UTF-8&quot;&gt;
&lt;title&gt;Mon lecteur Vidéo HTML5&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;!-- Contenu Ici --&gt;
&lt;/body&gt;
&lt;/html&gt;
		</pre>
<h3>Etape 2 &#8211; Intégration de la vidéo</h3>
<p>Nous allons intégrer une vidéo simple dans un premier temps. Saisissez le code ci-dessous dans votre page WEB : </p>
<pre class="brush:html;first-line:8">&lt;video width=&quot;854&quot; height=&quot;480&quot; src=&quot;http://mirror.bigbuckbunny.de/peach/bigbuckbunny_movies/big_buck_bunny_480p_stereo.ogg&quot;&gt;
&lt;/video&gt;
		</pre>
<p>Le résultat est le suivant : </p>
<p><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="1.1-base-lecteur" border="0" alt="1.1-base-lecteur" src="http://sldesign.openwab.com/wp-content/uploads/2010/09/1.1baselecteur.jpg" width="629" height="386" /> </p>
<p>Si vous cliquez avec le bouton droit de votre souris sur le lecteur, vous verrez apparaître un menu contextuel</p>
<p><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="1.2-firefox-contextuel-menu" border="0" alt="1.2-firefox-contextuel-menu" src="http://sldesign.openwab.com/wp-content/uploads/2010/09/1.2firefoxcontextuelmenu.jpg" width="398" height="299" /> </p>
<h3>Etape 3 &#8211; Etendre le lecteur</h3>
<p>Nous allons maintenant étendre notre lecteur avec les attributs de base.</p>
<pre class="brush:html;first-line:8">	&lt;video
	width=&quot;854&quot;
	height=&quot;480&quot;
	src=&quot;http://mirror.bigbuckbunny.de/peach/bigbuckbunny_movies/big_buck_bunny_480p_stereo.ogg&quot;
	autoplay
	poster=&quot;img/poster.jpg&quot;
	controls &gt;
    &lt;/video&gt;
	</pre>
<p>Nous avons ici simplement ajouter les contrôles et une image et activé l&#8217;autoplay</p>
<p><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="1.3-lecteur-avancé" border="0" alt="1.3-lecteur-avancé" src="http://sldesign.openwab.com/wp-content/uploads/2010/09/1.3lecteuravanc.jpg" width="641" height="401" /> </p>
<h2>Création d’un lecteur vidéo HTML personnalisé:</h2>
<p>Comme vous venez de le voir l&#8217;intégration du player est très simple mais limitée. En effet, le design de votre player dépend du navigateur et ce dernier n’est pas forcement adapté au design de votre site. Heureusement, nous allons pouvoir utiliser javascript ; en effet, les navigateurs sont gérés côté client donc, c&#8217;est votre navigateur qui intègre ce player. Nous allons donc pouvoir utiliser javascript pour agrémenter notre player.</p>
<p>&#160;</p>
<p><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Player par défaut des différents navigateurs" border="0" alt="Player par défaut des différents navigateurs" src="http://sldesign.openwab.com/wp-content/uploads/2010/09/videosplayerbrowsers.jpg" width="640" height="323" /> </p>
<p>Je vais dans cet article utiliser la bibliothèque jQuery que j&#8217;ai intégrée depuis Google Api. et j’ai également intégré la bibliothèque <a title="Site Web jQuery-ui [Nouvelle fenêtre]" href="http://jqueryui.com/" target="_blank">jQuery-ui</a>. Je vais également créer un Plugin <a title="Site Web jQuery [Nouvelle fenêtre]" href="http://jquery.com/" target="_blank">jQuery</a>. Le code ci-dessous vous montre l&#8217;initialisation jQuery ainsi que la liaison avec mon plugin.</p>
<p>J&#8217;ai également ajouté un dossier &quot;themes&quot; ainsi qu&#8217;un dossier &quot;themes/default/&quot; qui vont héberger nos fichiers de styles. Vous trouverez ci-dessous la structure de notre projet : </p>
<pre class="brush:html">&lt;!DOCTYPE html&gt;
&lt;head&gt;
	&lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=UTF-8&quot;&gt;
	&lt;title&gt;owPlayer - HTML 5 Web video Player&lt;/title&gt;
	&lt;link href=&quot;themes/default/jquery-ui.css&quot; type=&quot;text/css&quot; rel=&quot;stylesheet&quot;/&gt;
	&lt;link href=&quot;themes/default/style.css&quot; type=&quot;text/css&quot; rel=&quot;stylesheet&quot;/&gt;
	&lt;script type=&quot;text/javascript&quot; src=&quot;http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js&quot;&gt;&lt;/script&gt;
	&lt;script type=&quot;text/javascript&quot; src=&quot;jquery-ui.min.js&quot;&gt;&lt;/script&gt;
	&lt;script type=&quot;text/javascript&quot; src=&quot;owPlayer.js&quot;&gt;&lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>
<p class="info">Ce tutoriel n&#8217;a pas pour but de vous expliquer le développement d &#8216;un plugin jQuery. Malgré tout, j’ai essayé de commenter le plus précisément possible le code de cette extension. Si vous ne vous sentez pas à l&#8217;aise avec jQuery et le développement de plugin, voici quelques ressources :&#160; <br />- Tutoriel sur l’édition de plugin jQuery [<a title="Tutoriel Français sur la création de Plugin jQuery" href="http://www.lesintegristes.net/2008/01/14/jquery-codez-branche/" target="_blank">Lien</a>] </p>
<p>- Tutoriel en Anglais [<a title="Tutoriel sur la création de plugin jquery en anglais" href="http://www.sitepoint.com/blogs/2009/07/22/how-to-develop-a-jquery-plugin/" target="_blank">lien</a>] </p>
<p></p>
<p>&#160;<img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="1.4-structure-fichiers" border="0" alt="1.4-structure-fichiers" src="http://sldesign.openwab.com/wp-content/uploads/2010/09/1.4structurefichiers.jpg" width="182" height="166" /> </p>
<p>&#160;</p>
<h3>Théorie</h3>
<p>Avant de commencer, il est utile de comprendre le fonctionnement et les attributs d’un lecteur vidéo HTML 5. Le lecteur HTML dépend de l’interface “Media Element”. Vous trouverez l’ensemble des informations relative à cette interface à l’adresse suivante : <a title="Documentation HTML 5 - W3C - media-element" href="http://www.w3.org/TR/2010/WD-html5-20100624/video.html#media-element" target="_blank">http://www.w3.org/TR/2010/WD-html5-20100624/video.html#media-element</a></p>
<p>Lorsque vous initialisez l’élément ‘&lt;video&gt;’ vous avez accès à différents attributs. </p>
<p><strong>Les éléments</strong> </p>
<ul>
<li><strong>readyState&#160; :</strong> Status de la video (Prete ou pas) </li>
<li><strong>seeking :</strong> Retourne un intervalle de temps ; ceci permet de gérer un statut d’avancement </li>
<li><strong>currentTime :</strong> Retourne la position actuelle </li>
<li><strong>startTime :</strong> Retourne la position de départ </li>
<li><strong>duration :</strong> Durée de la vidéo </li>
<li><strong>paused : </strong>Status de la vidéo en pause </li>
<li><strong>defaultPlaybackRate :</strong> Vitesse de lecture par défaut </li>
<li><strong>playbackRate :</strong> Vitesse de lecture </li>
<li><strong>TimeRange played :</strong> Retourne la durée jouée &#8211; intervalle </li>
<li><strong>TimeRange seekable :</strong> Temps restant &#8211; intervalle </li>
<li><strong>ended :</strong> Retourne vrai si la fin de la vidéo est atteinte </li>
<li><strong>autoplay :</strong> Lecture automatique </li>
<li><strong>loop :</strong> Relire la video </li>
<li><strong>play :</strong> Jouer la vidéo </li>
<li><strong>pause : </strong>Mettre la vidéo en pause </li>
<li><strong>controls :</strong> Affiche les contrôles </li>
<li><strong>volume :</strong> Volume du player </li>
<li><strong>muted :</strong> Eteindre le son </li>
</ul>
<p>Comme vous le voyez, nous disposons de différents attributs que nous allons pouvoir utiliser pour réaliser notre player. Javascript et dans notre cas jQuery vont nous permettre d’accéder et de manipuler nos données.</p>
<h3>Etape par étape : </h3>
<h4>Etape 1 &#8211; Initialisation du plugin jQuery</h4>
<p>La première étape consiste à initialiser notre plugin jQuery. J&#8217;ai decidé d&#8217;appeler ce plugin owPlayer </p>
<p class="info">Penser utiliser un nom unique à votre plugin afin d&#8217;assurer la compatibilité avec d&#8217;autres plugin </p>
<p>Le code ci-dessous vous montre l&#8217;initialisation du plugin : </p>
<pre class="brush:javascript">(function($) {

	$.fn.owPlayer = function(uri, options) {

		// Initialisation des options par defaut
		var defaults = {};

		// On étend les options avec les valeurs par défaut
		var options = $.extend(defaults, options);

		this.each(function(){
			$owPlayer = $(this);

		});
	};
})(jQuery);</pre>
<p>Ce code nous permet simplement d&#8217;initialiser notre plugin. Pour le moment la variable &#8216;default&#8217; permettant de définir nos options par défaut est vide mais nous le compléterons ultérieurement. </p>
<h4>Etape 2 &#8211; Chargement des feuilles de style </h4>
<p>Notre extension va nous permettre de changer de thème en le spécifiant simplement dans les options ; nous devons donc charger les feuilles de style dynamiquement. </p>
<pre class="brush:javascript;first-line:22">//Chargement des éléments de style
var cssThemeFile = options.theme;
$('&lt;link href=&quot;themes/'+options.theme+'/style.css&quot; type=&quot;text/css&quot; rel=&quot;stylesheet&quot;/&gt;').appendTo('head');
$('&lt;link href=&quot;themes/'+options.theme+'/jquery-ui.css&quot; type=&quot;text/css&quot; rel=&quot;stylesheet&quot;/&gt;').appendTo('head');</pre>
<h4>Etape 3 &#8211; Construction du wrapper et des contrôles</h4>
<p>Cette étape consiste simplement à construire notre interface. Nous aurions pû réaliser cette étape directement dans notre page HTML mais j&#8217;ai opté pour une génération interne à mon plugin. </p>
<p>Le code ci-dessous nous permet de créer un conteneur principal : </p>
<pre class="brush:javascript;first-line:">//Création du conteneur principal
$owPlayerWrapper = '&lt;div class=&quot;owPlayerWrapper&quot;&gt;&lt;/div&gt;';
$owPlayer.wrap($owPlayerWrapper);
$('.owPlayerWrapper').width(options.width);</pre>
<p>Le code ci-dessous nous permet de réaliser notre conteneur qui accueillera nos contrôles: </p>
<pre class="brush:javascript;first-line:33">//Création du panel de contôles
$owPlayerControls = '';
$owPlayerControls += '&lt;div class=&quot;owPlayerControls ui-widget-header&quot;&gt;&lt;/div&gt;';
$owPlayer.after($owPlayerControls);</pre>
<p>Ce code permet d&#8217;insérer un conteneur juste derrière notre balise &quot;&lt;video&gt; </p>
<p>Reste à insérer nos contrôles (boutons et autres éléments) à l&#8217;intérieur de ce conteneur </p>
<pre class="brush:javascript;first-line:42">// Création des contrôles
var $owPlayerControls = '';
$owPlayerControls += '&lt;a class=&quot;owPlayerControl owPlayerBtPlay ui-icon ui-icon-play&quot; href=&quot;#&quot; title=&quot;Play/Pause&quot;&gt;Play / Pause&lt;/a&gt;';
$owPlayerControls += '&lt;div class=&quot;owPlayerControl owPlayerSeeker&quot;&gt;&lt;/div&gt;';
$owPlayerControls += '&lt;div class=&quot;owPlayerControl owPlayerTimer&quot;&gt;00:00&lt;/div&gt;';
$owPlayerControls += '&lt;div class=&quot;owPlayerSoundBox&quot;&gt;&lt;a class=&quot;owPlayerControl owPlayerBtSound ui-icon ui-icon-volume-on&quot; href=&quot;#&quot; title=&quot;Mute&quot;&gt;Mute / Unmute&lt;/a&gt;';
$owPlayerControls += '&lt;a class=&quot;owPlayerControl owPlayerBtSoundTrigger ui-icon ui-icon-signal&quot; href=&quot;#&quot; title=&quot;Volume&quot;&gt;Volume&lt;/a&gt;';
$owPlayerControls += '&lt;div class=&quot;owPlayerControl owPlayerSoundSlider&quot;&gt;&lt;/div&gt;&lt;/div&gt;';
$($owPlayerControls).appendTo('.owPlayerControlsContener');</pre>
<p>Voici la liste de ces contrôles et leurs rôles : </p>
<ul>
<li><strong>owPlayerBtPlay :</strong> Bouton lecture / pause </li>
<li><strong>owPlayerSeeker :</strong> Il s&#8217;agit de la barre d&#8217;avancement </li>
<li><strong>owPlayerTimer :</strong> Le timer &quot;00:00&quot; </li>
<li><strong>owPlayerSoundBox : </strong>Conteneur pour la gestion du son </li>
<li><strong>owPlayerBtSound : </strong>Son on/off </li>
<li><strong>owPlayerSoundTrigger : </strong>Bouton déco pour l&#8217;affichage du slider pour le son </li>
<li><strong>owPlayerSoundSlider : </strong>Slider pour le son </li>
</ul>
<h4>Etape 4 &#8211; Bouton Play / Pause</h4>
<p>Maintenant que nous venons de réaliser nos différents contrôles, il faut leur assigner des fonctions. </p>
<p>Commencons par le bouton &quot;owPlayerBtPlay&quot; ; ce bouton va nous permettre de jouer l&#8217;animation ou de la mettre sur pause. Nous l&#8217;avons vu plus haut, ce qui déclanche la video est l&#8217;action &quot;play&quot;. </p>
<pre class="brush:javascript;first-line:53">	/** Bt Play */
		$('.owPlayerBtPlay').click(function() {
			if ($owPlayer.attr('paused') == false) {
				$owPlayer[0].pause();
				$(this).removeClass('ui-icon-play').addClass('ui-icon-pause');
			} else {
				$owPlayer[0].play();
				$(this).removeClass('ui-icon-pause').addClass('ui-icon-play');
			}
		});</pre>
<p>Quelques informations : Ce code permet de vérifier si le lecteur est en pause ou non. Le cas échéant, si le lecteur est en pause, on déclanche la lecture. </p>
<h4>Etape 5 &#8211; Gestion du son</h4>
<p>Nous allons maintenant nous occuper du son, nous avons deux éléments importants : </p>
<ul>
<li>Le bouton On / Off </li>
<li>Le slider permettant de régler le volume </li>
</ul>
<p>Dans un premier temps, occupons nous du bouton permettant d&#8217;activer / désactiver le son : </p>
<pre class="brush:javascript;first-line:114">	/** Bouton pour le son */
		//@TODO Récupérer la valeur du son lors du Mute pour le récupérer lors de l'unmute
		$('.owPlayerBtSound').click(function(){
			if($owPlayer.attr('muted') == true){
				//Activation du son - le slider passe à 50
				$('.owPlayerSoundSlider').slider('value', '50');
				$(this).removeClass('ui-icon-volume-off').addClass('ui-icon-volume-on');
			}else{
				//Desactivation du son
				$owPlayer.attr('muted', true);
				$('.owPlayerSoundSlider').slider('value', '0');
				$(this).removeClass('ui-icon-volume-on').addClass('ui-icon-volume-off');
			}
		});</pre>
<p>Cette action permet d&#8217;eteindre ou d&#8217;activer le son à travers le slider que nous verrons par la suite. </p>
<p>Le slider nous permet de gérer le volume du son. Pour réaliser ce slider, j&#8217;utilise l&#8217;extension “<a title="Documentation jQuery-ui slider [Nouvelle fenêtre]" href="http://jqueryui.com/demos/slider/" target="_blank">jQuery-ui &quot;slider()</a>&quot; </p>
<pre class="brush:javascript;first-line:130">	/** Slider pour le son */
	//Cache le slider à l'initialisation
	$('.owPlayerSoundSlider').hide();

	//Action pour afficher le slider
	$('.owPlayerSoundBox').hover(function() {
		$('.owPlayerSoundSlider').show();
	}, function() {
		$('.owPlayerSoundSlider').hide();
	});

	//Action du slider
	$('.owPlayerSoundSlider').slider( {
		orientation : &quot;vertical&quot;,
		value:0.50,
		range:&quot;min&quot;,
		max:1,
		step:0.05,
		animate:true,
		slide : function(e, ui) {
			$owPlayer.attr('muted', false);
			video_volume = ui.value;
			$owPlayer.attr('volume', ui.value);
		}
	});</pre>
<p>Il s&#8217;agit ici simplement de lier notre slider à l&#8217;attribut &quot;volume&quot; du player. </p>
<h4>Etape 6 &#8211; Gestion du seeker</h4>
<p>Deux éléments encore. Le timer qui nous permet d&#8217;afficher le temps écoulé et le slider nous permettant de naviguer au sein même de la vidéo </p>
<p>Gestion du timer : Il s&#8217;agit ici de récupérer le temps et la position de lecture ; nous devons pour cela utiliser un &quot;écouteur&quot; </p>
<pre class="brush:javascript;first-line:">	//Durée totale de la vidéo
		var video_duration = $owPlayer.attr('duration');

		//Fonction de convertion pour le timer
		var gTimeFormat=function(seconds){
			var m=Math.floor(seconds/60)&lt;10?&quot;0&quot;+Math.floor(seconds/60):Math.floor(seconds/60);
			var s=Math.floor(seconds-(m*60))&lt;10?&quot;0&quot;+Math.floor(seconds-(m*60)):Math.floor(seconds-(m*60));
			return m+&quot;:&quot;+s;
		};

		/** Gestion du Timer */
		var seekUpdate = function() {
			var currenttime = $owPlayer.attr('currentTime');
			if(!seeksliding) $('.owPlayerSeeker').slider('value', currenttime);
			$('.owPlayerTimer').text(gTimeFormat(currenttime));
		};

		//Mise à jour des informations
		$owPlayer.bind('timeupdate', seekUpdate);	

		//Affichage du texte
		$('.owPlayerTimer').text(' / '+gTimeFormat(video_duration));</pre>
<p>La fonction jQuery &quot;Bind&quot; permet de mettre en continu le timer de notre lecteur. Au par avant, j&#8217;ai juste créé une fonction &quot;gTimeFormat&quot; qui permet de convertir notre temps en minutes/secondes </p>
<p>Dernière étape, le slider pour la navigation au sein même de la vidéo. </p>
<pre class="brush:javascript;first-line:85">	/** Slider pour le seeker */

		//Initialise la variable du slider
		var seeksliding;

		var createSeek = function() {
			if($owPlayer.attr('readyState')) {
				var video_duration = $owPlayer.attr('duration');
				$('.owPlayerSeeker').slider({
					value: 0,
					step: 0.01,
					orientation: &quot;horizontal&quot;,
					range: &quot;min&quot;,
					max: video_duration,
					animate: true,
					slide: function(){
						seeksliding = true;
					},
					stop:function(e,ui){
						seeksliding = false;
						$owPlayer.attr(&quot;currentTime&quot;,ui.value);
					}
				});
			} else {
				setTimeout(createSeek, 150);
			}
		};

		createSeek();</pre>
<p>Cette fonction &quot;createSeek()&quot; permet de réaliser un slider pour naviguer au sein même de la vidéo. Lors de l&#8217;arrêt du slider, il y a une recherche de la position.</p>
<h4>Etape 7 &#8211; Appel du plugin</h4>
<p>La derniere étape consiste à initialiser notre plugin dans notre page HTML. L&#8217;opération est simple, un simple &quot;$([selecteur]).owPlayer([url],[options]);&quot; permet de réaliser cette opération. Vous aurez bine évidement pris soin d&#8217;intégrer le plugin et les différentes bibliothèques au par avant.</p>
<p>Le code ci-dessous vous montre cette intégration : </p>
<pre class="brush:html">&lt;!DOCTYPE html&gt;
&lt;head&gt;
    &lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=UTF-8&quot;&gt;
	&lt;title&gt;owPlayer - HTML 5 Web video Player&lt;/title&gt;
	&lt;script type=&quot;text/javascript&quot; src=&quot;http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js&quot;&gt;&lt;/script&gt;
	&lt;script type=&quot;text/javascript&quot; src=&quot;jquery-ui.min.js&quot;&gt;&lt;/script&gt;
	&lt;script type=&quot;text/javascript&quot; src=&quot;owPlayer.js&quot;&gt;&lt;/script&gt;
	&lt;script type=&quot;text/javascript&quot;&gt;
		$(document).ready(function(){
			$('.owPlayer').owPlayer('http://mirrorblender.top-ix.org/peach/bigbuckbunny_movies/big_buck_bunny_480p_stereo.ogg',{});
		});
	&lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;
	&lt;h3&gt;owPlayer::&lt;/h3&gt;
	&lt;video class=&quot;owPlayer&quot;&gt;&lt;/video&gt;
&lt;/body&gt;
&lt;/html&gt;
		</pre>
<h2>&#160;</h2>
<h2>Résultat final</h2>
<p>Cette capture vous montre le résultat final. Ce résultat et bien évidement le même sur Firefox, Chrome ou Safari (non testé sur les autres navigateurs)</p>
<p><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="lecteur-final" border="0" alt="lecteur-final" src="http://sldesign.openwab.com/wp-content/uploads/2010/09/lecteurfinal.jpg" width="649" height="388" /> </p>
<h2>Conclusion</h2>
<p>Vous venez de voir qu&#8217;il n&#8217;est pas si compliqué que cela de rendre votre lecteur vidéo complètement personnalisé. Malheureusement, la compatibilité n&#8217;est pas encore au rendez-vous et faudra encore pour quelques temps compter sur les lecteurs Flash&#8230;. </p>
<p>Cet exemple n&#8217;est qu&#8217;un bribe de ce qu&#8217;il est possible de réaliser, il est possible d&#8217;étendre ce lecteur en y insérant de nouvelles fonctions : </p>
<ul>
<li>Playliste </li>
<li>Changement de thèmes dynamiques </li>
<li>Navigation de Playliste –Next / Prev </li>
<li>Gestion des différents navigateurs </li>
</ul>
<p>Dans les prochaines versions, j’aurai l’occasion d’améliorer cette extension et de gérer ces différentes fonctions.</p>
<p class="info">N’hésitez pas à laisser vos commentaires / remarques pour les éventuelles questions afin de faire évoluer cet article.</p>
<p>Vous trouverez-ci dessous les codes complets de l&#8217;application ainsi qu&#8217;un fichier zip téléchargeable.</p>
<h5>Code javascript : owPlayer.js </h5>
<pre class="brush:javascript">(function($) {

	$.fn.owPlayer = function(uri, options) {

		// Initialisation des options par defaut
		var defaults = {
			autoplay : false,
			width : 854,
			height : 480,
			theme : 'default',
			poster : null
		};

		// On étend les options avec les valeurs par défaut
		var options = $.extend(defaults, options);

		this.each(function() {
			$owPlayer = $(this);

			// Chargement de la video
				$owPlayer.attr('src', uri);

				// Chargement des éléments de style
				var cssThemeFile = options.theme;
				$(
						'&lt;link href=&quot;themes/' + options.theme + '/style.css&quot; type=&quot;text/css&quot; rel=&quot;stylesheet&quot;/&gt;')
						.appendTo('head');
				$(
						'&lt;link href=&quot;themes/' + options.theme + '/jquery-ui.css&quot; type=&quot;text/css&quot; rel=&quot;stylesheet&quot;/&gt;')
						.appendTo('head');

				// Création du conteneur principal
				$owPlayerWrapper = '&lt;div class=&quot;owPlayerWrapper&quot;&gt;&lt;/div&gt;';
				$owPlayer.wrap($owPlayerWrapper);
				$('.owPlayerWrapper').width(options.width);

				// Création du panel de contôles
				$owPlayerControlsContener = '';
				$owPlayerControlsContener += '&lt;div class=&quot;owPlayerControlsContener ui-widget-header&quot;&gt;&lt;/div&gt;';
				$owPlayer.after($owPlayerControlsContener);

				// Création des contrôles
				var $owPlayerControls = '';
				$owPlayerControls += '&lt;a class=&quot;owPlayerControl owPlayerBtPlay ui-icon ui-icon-play&quot; href=&quot;#&quot; title=&quot;Play/Pause&quot;&gt;Play / Pause&lt;/a&gt;';
				$owPlayerControls += '&lt;div class=&quot;owPlayerControl owPlayerSeeker&quot;&gt;&lt;/div&gt;';
				$owPlayerControls += '&lt;div class=&quot;owPlayerControl owPlayerTimer&quot;&gt;00:00&lt;/div&gt;';
				$owPlayerControls += '&lt;div class=&quot;owPlayerSoundBox&quot;&gt;&lt;a class=&quot;owPlayerControl owPlayerBtSound ui-icon ui-icon-volume-on&quot; href=&quot;#&quot; title=&quot;Mute&quot;&gt;Mute / Unmute&lt;/a&gt;';
				$owPlayerControls += '&lt;a class=&quot;owPlayerControl owPlayerBtSoundTrigger ui-icon ui-icon-signal&quot; href=&quot;#&quot; title=&quot;Volume&quot;&gt;Volume&lt;/a&gt;';
				$owPlayerControls += '&lt;div class=&quot;owPlayerControl owPlayerSoundSlider&quot;&gt;&lt;/div&gt;&lt;/div&gt;';
				$($owPlayerControls).appendTo('.owPlayerControlsContener');

				// Action des boutons et initialisation des sliders
				/** Bt Play */
				$('.owPlayerBtPlay').click(
						function() {
							if ($owPlayer.attr('paused') == false) {
								$owPlayer[0].pause();
								$(this).removeClass('ui-icon-play').addClass(
										'ui-icon-pause');
							} else {
								$owPlayer[0].play();
								$(this).removeClass('ui-icon-pause').addClass(
										'ui-icon-play');
							}
						});

				// Durée totale de la vidéo
				var video_duration = $owPlayer.attr('duration');

				// Fonction de convertion pour le timer
				var gTimeFormat = function(seconds) {
					var m = Math.floor(seconds / 60) &lt; 10 ? &quot;0&quot;
							+ Math.floor(seconds / 60) : Math
							.floor(seconds / 60);
					var s = Math.floor(seconds - (m * 60)) &lt; 10 ? &quot;0&quot;
							+ Math.floor(seconds - (m * 60)) : Math
							.floor(seconds - (m * 60));
					return m + &quot;:&quot; + s;
				};

				/** Gestion du Timer */
				var seekUpdate = function() {
					var currenttime = $owPlayer.attr('currentTime');
					if (!seeksliding)
						$('.owPlayerSeeker').slider('value', currenttime);
					$('.owPlayerTimer').text(gTimeFormat(currenttime));
				};

				$owPlayer.bind('timeupdate', seekUpdate);

				$('.owPlayerTimer').text(' / ' + gTimeFormat(video_duration));

				/** Slider pour le seeker */

				// Initialise la variable du slider
				var seeksliding;

				var createSeek = function() {
					if ($owPlayer.attr('readyState')) {
						var video_duration = $owPlayer.attr('duration');
						$('.owPlayerSeeker').slider( {
							value : 0,
							step : 0.01,
							orientation : &quot;horizontal&quot;,
							range : &quot;min&quot;,
							max : video_duration,
							animate : true,
							slide : function() {
								seeksliding = true;
							},
							stop : function(e, ui) {
								seeksliding = false;
								$owPlayer.attr(&quot;currentTime&quot;, ui.value);
							}
						});
						// $video_controls.show();
					} else {
						setTimeout(createSeek, 150);
					}
				};

				createSeek();

				/** Bouton pour le son */
				// @TODO Récupérer la valeur du son lors du Mute pour le
				// récupérer lors de l'unmute
				$('.owPlayerBtSound').click(function() {
					if ($owPlayer.attr(&quot;muted&quot;) == true) {
						// Activation du son - le slider passe à 100
						$('.owPlayerSoundSlider').slider('value', '50');
						$(this).removeClass('ui-icon-volume-off').addClass(
								'ui-icon-volume-on');
					} else {
						// Desactivation du son
						$owPlayer.attr('muted', true);
						$('.owPlayerSoundSlider').slider('value', '0');
						$(this).removeClass('ui-icon-volume-on').addClass(
								'ui-icon-volume-off');
					}
				});

				/** Slider pour le son */
				$('.owPlayerSoundSlider').hide();
				$('.owPlayerSoundBox').hover(function() {
					$('.owPlayerSoundSlider').show();
				}, function() {
					$('.owPlayerSoundSlider').hide();
				});

				$('.owPlayerSoundSlider').slider( {
					orientation : &quot;vertical&quot;,
					value : 0.50,
					range : &quot;min&quot;,
					max : 1,
					step : 0.05,
					animate : true,
					slide : function(e, ui) {
						$owPlayer.attr('muted', false);
						video_volume = ui.value;
						$owPlayer.attr('volume', ui.value);
					}
				});

			});
	};
})(jQuery);	</pre>
<h5>Code HTML : index.html</h5>
<pre class="brush:html">&lt;!DOCTYPE html&gt;
&lt;head&gt;
    &lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=UTF-8&quot;&gt;
	&lt;title&gt;owPlayer - HTML 5 Web video Player&lt;/title&gt;
	&lt;script type=&quot;text/javascript&quot; src=&quot;http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js&quot;&gt;&lt;/script&gt;
	&lt;script type=&quot;text/javascript&quot; src=&quot;jquery-ui.min.js&quot;&gt;&lt;/script&gt;
	&lt;script type=&quot;text/javascript&quot; src=&quot;owPlayer.js&quot;&gt;&lt;/script&gt;
	&lt;script type=&quot;text/javascript&quot;&gt;
		$(document).ready(function(){
			$('.owPlayer').owPlayer('http://mirrorblender.top-ix.org/peach/bigbuckbunny_movies/big_buck_bunny_480p_stereo.ogg',{});
		});
	&lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;
	&lt;h3&gt;owPlayer::&lt;/h3&gt;
	&lt;video class=&quot;owPlayer&quot;&gt;&lt;/video&gt;
&lt;/body&gt;
&lt;/html&gt;
	</pre>
<h5>Code CSS : style.css</h5>
<pre class="brush:css">/**
 * owPlayer stylesheet file
 * Extend jQuery-ui stylesheet
 * @author slDesign
 * @version 0.1
 */

.owPlayer{
	margin:0;
	padding:0
}
.owPlayerControlsContener{
	height:24px;
	z-index:100;
	margin-top:-5px;
}

.ui-icon{
	border:1px solid #ccc;
	padding:1px;

}
.owPlayerControl{
	float:left;
	margin:1px 8px;
}

.owPlayerSeeker{
	width:500px;
	height:4px;
}

.owPlayerSoundBox *{
	margin:0;
}
.owPlayerSoundSlider{
	height:300px;
	float:left;
	margin-top:-90px;
}</pre>
<h3>&#160;</h3>
<h3>Remerciements : </h3>
<p>Merci à l’équipe de Big Buck Bunny pour la vidéo [<a title="Site Internet de Big Buck Bunny" href="http://www.bigbuckbunny.org/" target="_blank">site</a>] [<a title="Licence de diffusion et d&#39;utilisation de la vidéo Big Buck Bunny" href="http://www.bigbuckbunny.org/index.php/about/" target="_blank">licence</a>]. Cette vidéo a été réalisée sous Blender</p>
<p>Merci à <a href="http://dev.opera.com/author/36658182">Cristian-Ionut Colceriu</a> pour son article initial qui m’a aidé à rédigé celui-ci</p>
<p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save"><img src="http://sldesign.openwab.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a> </p>]]></content:encoded>
			<wfw:commentRss>http://sldesign.openwab.com/2010/09/14/tutoriel-html-5-raliser-une-lecteur-vido-personnalis/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
<enclosure url="http://mirrorblender.top-ix.org/peach/bigbuckbunny_movies/big_buck_bunny_480p_stereo.ogg" length="166825767" type="audio/ogg" />
		</item>
		<item>
		<title>Des milliers de tutoriels en Fran&#231;ais et sur toutes les applications</title>
		<link>http://sldesign.openwab.com/2010/08/24/des-milliers-de-tutoriels-en-franais-et-sur-toutes-les-applications/</link>
		<comments>http://sldesign.openwab.com/2010/08/24/des-milliers-de-tutoriels-en-franais-et-sur-toutes-les-applications/#comments</comments>
		<pubDate>Tue, 24 Aug 2010 17:12:48 +0000</pubDate>
		<dc:creator>Steve Leherpeux</dc:creator>
				<category><![CDATA[Informations]]></category>
		<category><![CDATA[Tutoriels]]></category>
		<category><![CDATA[Ressources]]></category>
		<category><![CDATA[Tutoriaux]]></category>

		<guid isPermaLink="false">http://sldesign.openwab.com/2010/08/24/des-milliers-de-tutoriels-en-franais-et-sur-toutes-les-applications/</guid>
		<description><![CDATA[Si vous cherchez des tutoriels Français et que vous ne trouvez pas votre bonheur sur les ressources gratuites, voici un site qui pourra vous aider ! tuto.com vous permet de consulter des centaines de tutoriaux gratuits et des milliers d’autres pour quelques euros ! Je vous propose dans cet article de vous présenter les différents [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fsldesign.openwab.com%2F2010%2F08%2F24%2Fdes-milliers-de-tutoriels-en-franais-et-sur-toutes-les-applications%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fsldesign.openwab.com%2F2010%2F08%2F24%2Fdes-milliers-de-tutoriels-en-franais-et-sur-toutes-les-applications%2F&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p><a title="tuto .com" href="http://fr.tuto.com/?parrain=sldesign"><img style="display: inline; margin-left: 0px; margin-right: 0px;" src="http://fr.tuto.com//banner/common/weecast_250x250.jpg" alt="tuto .com" width="250" height="250" align="left" /></a>Si vous cherchez des tutoriels Français et que vous ne trouvez pas votre bonheur sur les ressources gratuites, voici un site qui pourra vous aider !</p>
<p>tuto.com vous permet de consulter des centaines de tutoriaux gratuits et des milliers d’autres pour quelques euros !</p>
<p>Je vous propose dans cet article de vous présenter les différents services et avantages de tuto.com.</p>
<p><span id="more-921"></span></p>
<hr class="clear_all" />
<h2>Tuto.com c&#8217;est quoi ?</h2>
<blockquote><p>Tuto.com est une place de marché dédiée aux tutos informatiques en vidéo. Chacun peut y apprendre à utiliser un logiciel ou bien partager ou vendre un savoir-faire informatique. Apprenez pas à pas, à votre rythme et visionnez les vidéos sans limite de temps, parmi un catalogue de <strong>10816 tuto</strong>. tuto</p></blockquote>
<h2>Fonctionnement</h2>
<p>Le système est basé sur des crédits, qui représentent la monnaie de tuto.com. Il est à noter que vous pouvez également avoir accès à des centaines <strong>de tutoriaux gratuits</strong> sans achat de crédits mais simplement en vous inscrivant.</p>
<p>Après vous être inscrit, vous aurez accès au catalogue de formation et pourrez également acheter des crédits.</p>
<p><img style="display: inline; border: 0px;" title="Enregistrement tuto.com" src="http://sldesign.openwab.com/wp-content/uploads/2010/08/1weecastregistration.jpg" border="0" alt="Enregistrement tuto.com" width="462" height="374" /></p>
<p><strong>Comment fonctionnent les crédits ?</strong></p>
<p>1 crédit = 1 euro. Acheter des crédits, vous permet de les utiliser pour télécharger les formations vidéo qui vous intéressent. En achetant un forfait de crédits, vous remplissez donc une tirelire virtuelle avec laquelle vous pourrez acheter des vidéos de formation, simplement et rapidement.</p>
<p><img style="display: inline; border-width: 0px;" title="Tableau des crédits tuto.com" src="http://sldesign.openwab.com/wp-content/uploads/2010/08/3weecastcredits.jpg" border="0" alt="Tableau des crédits tuto.com" width="1009" height="436" /></p>
<ul>
<li><strong>Formez-vous grâce à + de 10800 vidéos</strong>Une fois vos crédits en poche, vous pouvez vous former immédiatement au logiciel de votre choix, grâce à un catalogue de plus de 10800 vidéos de formation qui s’enrichit quotidiennement.</li>
<li><strong>Téléchargement des vidéos immédiat</strong>Après avoir acheté des crédits, vous pourrez immédiatement les utiliser pour télécharger les vidéos qui vous intéressent et ainsi débuter votre formation sans attendre !</li>
<li><strong>Lecture illimitée des vidéos</strong>Une fois les vidéos téléchargées, vous pouvez les lire de façon illimitée dans le temps, sans avoir besoin d’être connecté sur Internet. Vous vous formez à votre rythme, pas à pas.</li>
<li><strong>Aucun engagement sur la durée</strong>Chez Tuto.com, nous pensons que c’est la qualité de nos vidéos qui vous retiendra. Nous ne proposons donc pas d’abonnement. Vous ne payer que pour ce que vous consommez.</li>
</ul>
<h2>Acheter ou Vendre ?</h2>
<p>Sur Tuto.com, vous avez <strong>2 types d&#8217;utilisateurs</strong>: ceux qui souhaitent <strong>se former</strong> à un logiciel et ceux qui souhaitent <strong>partager leurs connaissances</strong> sur un logiciel. Sur Tuto.com, vous trouverez des cours en vidéo dédiés aux logiciels de bureautique, de 3D, de vidéo, du web, de programmation, de traitement de l&#8217;image, du print&#8230; Certaines vidéos sont <a title="tutoriaux gratuits" href="http://fr.tuto.com/?parrain=sldesign/tuto-gratuit.htm">gratuites</a>, d&#8217;autres payantes.</p>
<p>Si vous maitrisez un logiciel, Tuto.com vous permet de <strong>gagner de l&#8217;argent</strong>. Enregistrer un tutorial vidéo et soumettez-le nous. Il sera alors validé par notre équipe et sera mis en vente.</p>
<h2>Conclusion</h2>
<p>tuto.com est un service complet de tutoriaux vidéos qui vous permettra de trouver de nombreuses ressources de qualités professionnelles ou encore publier vos tutoriaux.</p>
<p>De nombreux logiciels et thématiques y sont abordés, de PHP à .net, de Photoshop à Gimp ou encore de 3D Studio Max à Blender.</p>
<p>N’hésitez pas à vous <a title="Inscription gratuite tuto.com" href="http://fr.tuto.com/?parrain=sldesign" target="_blank">inscrire</a> et profitez des nombreuses ressources gratuites pour vous faire votre propre avis.</p>
<p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save"><img src="http://sldesign.openwab.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a> </p>]]></content:encoded>
			<wfw:commentRss>http://sldesign.openwab.com/2010/08/24/des-milliers-de-tutoriels-en-franais-et-sur-toutes-les-applications/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Support HTML 5 &#8211; La solution pour gérer la compatibilté des navigateurs</title>
		<link>http://sldesign.openwab.com/2010/08/08/support-html-5-la-solution-pour-gerer-la-compatibilte-des-navigateurs/</link>
		<comments>http://sldesign.openwab.com/2010/08/08/support-html-5-la-solution-pour-gerer-la-compatibilte-des-navigateurs/#comments</comments>
		<pubDate>Sun, 08 Aug 2010 07:26:21 +0000</pubDate>
		<dc:creator>Steve Leherpeux</dc:creator>
				<category><![CDATA[HTML / CSS]]></category>
		<category><![CDATA[Compatibilité]]></category>
		<category><![CDATA[CSS3]]></category>
		<category><![CDATA[HTML5]]></category>
		<category><![CDATA[navigateurs]]></category>

		<guid isPermaLink="false">http://sldesign.openwab.com/?p=802</guid>
		<description><![CDATA[HTML 5,  CSS 3 c&#8217;est bien beau, ça rend bien service et c&#8217;est sympa&#8230; malheureusement, tout n&#8217;est pas parfait au pays des rêves car de nombreux utilisateurs (vos lecteurs et utilisateurs) ne peuvent pas profiter de ces nouveaux attributs HTML et CSS. Il est important de penser &#171;&#160;utilisateurs&#160;&#187;. Les modifications apportées par HTML 5 et [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fsldesign.openwab.com%2F2010%2F08%2F08%2Fsupport-html-5-la-solution-pour-gerer-la-compatibilte-des-navigateurs%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fsldesign.openwab.com%2F2010%2F08%2F08%2Fsupport-html-5-la-solution-pour-gerer-la-compatibilte-des-navigateurs%2F&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p><img class="alignleft size-full wp-image-803" style="margin: 5px;" title="Navigateurs Web" src="http://sldesign.openwab.com/wp-content/uploads/2010/08/navigateurs-splash-screen.jpg" alt="Navigateurs Web" width="276" height="161" />HTML 5,  CSS 3 c&#8217;est bien beau, ça rend bien service et c&#8217;est sympa&#8230; malheureusement, tout n&#8217;est pas parfait au pays des rêves car de nombreux utilisateurs (vos lecteurs et utilisateurs) ne peuvent pas profiter de ces nouveaux attributs HTML et CSS.</p>
<p>Il est important de penser &laquo;&nbsp;utilisateurs&nbsp;&raquo;. Les modifications apportées par HTML 5 et CSS 3 ne sont pas encore implémentées par tous les navigateurs. Ne pouvant pas forcer tout le monde à utiliser un seul navigateur, il faut s&#8217;efforcer de prendre en compte cet compatibilité.</p>
<p>Comment pouvons nous vérifier cette compatibilité, comment savoir quel navigateur est compatible avec tel attribut HTML ou CSS ? C&#8217;est ce que je vous propose de voir dans cet article.</p>
<p><span id="more-802"></span></p>
<hr class="clear_all" />
<h2>Solution Javascript</h2>
<p>Une des première solution consiste à utiliser javascript pour vérifier</p>
<pre class="brush:html">&lt;script&gt;
   alert( 'pattern' in document.createElement('input') ) // boolean;
&lt;/script&gt;
</pre>
<p>Si vous mettez ce simple script sur votre page, vous déclencherez une alerte &laquo;&nbsp;true&nbsp;&raquo; ou &laquo;&nbsp;false&nbsp;&raquo; selon les navigateurs.</p>
<div id="attachment_805" class="wp-caption alignnone" style="width: 532px"><img class="size-full wp-image-805" title="Alerte sur un navigateur supportant l'attribut Pattern" src="http://sldesign.openwab.com/wp-content/uploads/2010/08/valid-navigateur.jpg" alt="Alerte sur un navigateur supportant l'attribut Pattern" width="522" height="212" /><p class="wp-caption-text">Alerte sur un navigateur supportant l&#39;attribut Pattern</p></div>
<div id="attachment_806" class="wp-caption alignnone" style="width: 388px"><img class="size-full wp-image-806" title="Alerte sur un navigateur ne supportant pas l'attribut Pattern - IE7" src="http://sldesign.openwab.com/wp-content/uploads/2010/08/navigateur-non-compatible.jpg" alt="Alerte sur un navigateur ne supportant pas l'attribut Pattern" width="378" height="131" /><p class="wp-caption-text">Alerte sur un navigateur ne supportant pas l&#39;attribut Pattern</p></div>
<p>C&#8217;est un moyen simple mais assez contraignant de vérifier la compatibilité de tel ou tel attribut&#8230;</p>
<h2>Commentaires conditionnels</h2>
<p>Les commentaires conditionnels sont un mécanisme propre à Internet Explorer Windows, qui permettent d&#8217;inclure dans une page (X)HTML, de manière valide, du code qui ne sera lu et interprété que par Internet Explorer, ou par l&#8217;une ou l&#8217;autre de ses versions.</p>
<p>Techniquement, il s&#8217;agit de simples commentaires HTML, qui seront compris comme tels par la plupart des navigateurs. Cependant, le contenu de ces commentaires a une syntaxe spéciale, qui permet à Internet Explorer de savoir s&#8217;il doit interpréter le contenu du commentaire ou bien l&#8217;ignorer.</p>
<pre class="brush:html">&lt;!--[if gte IE 6]&gt; pour IE 6.0 et version plus récentes &lt;![endif]--&gt;

&lt;!--[if IE 5.0]&gt; pour IE 5.0 &lt;![endif]--&gt;

&lt;!--[if IE 5.5000]&gt; pour IE 5.5 &lt;![endif]--&gt;

&lt;!--[if IE 6]&gt; pour IE 6.0 &lt;![endif]--&gt;

&lt;!--[if IE 7]&gt; pour IE 7.0 &lt;![endif]--&gt;

&lt;!--[if IE 8]&gt; pour IE 8.0 &lt;![endif]--&gt;

&lt;!--[if gte IE 7]&gt; pour IE 7 et supérieur &lt;![endif]--&gt;

&lt;!--[if lt IE 7]&gt; pour IE inférieur à IE 7 &lt;![endif]--&gt;

&lt;!--[if lte IE 6]&gt; pour IE 5.0, IE 5.5 et IE 6.0 mais pas IE7.0 &lt;![endif]--&gt;
</pre>
<p>Cette technique a le mérite d&#8217;exister, surtout lorsque l&#8217;on connait les différences qu&#8217;il existe entre IE et les autres navigateurs mais, elle ne s&#8217;applique que à Internet Explorer et elle devient vite lourde à gérer&#8230;</p>
<h2>Class Modernizr</h2>
<p>Modernizr ajoute classes à l&#8217;élément</p>
<p>qui vous permettent de cibler les fonctionnalités du navigateur spécifique dans votre feuille de style. Vous n&#8217;avez pas réellement besoin d&#8217;écrire du Javascript pour l&#8217;utiliser.</p>
<h3>Initialisation :</h3>
<p>Il suffit de lier la bibliothèque dans votre doument HTML :</p>
<pre class="brush:html">&lt;head&gt;
	&lt;script type="text/javascript" src="medias/modernizr-1.5.min.js"&gt;&lt;/script&gt;
&lt;/head&gt;
</pre>
<p>Voici un exemple concret concernant l&#8217;attribut &laquo;&nbsp;border-radius&nbsp;&raquo; qui n&#8217;est pas disponible sur IE&#8230; Eh bien, avec Modernizr vous pouvez accomplir tout cela! La syntaxe est très intuitive, aussi:</p>
<h4>Code HTML</h4>
<pre class="brush:html">&lt;div class="radius"&gt;
	&lt;p&gt;&lt;span&gt;Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur mattis fermentum quam, ut feugiat dui ornare eu. Aenean vitae purus eget nunc sagittis sollicitudin eget a lorem.&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
</pre>
<h4>Feuille de style CSS :</h4>
<pre class="brush:css">	.radius p span{
	-moz-border-radius: 5px;
	-webkit-border-radius: 5px;
	display:block;
	width:300px;
}

.borderradius p span{
	border:1px solid #cc3300;
}

.no-borderradius p span{
	border:1px solid #000;
}
</pre>
<p>L&#8217;opération est simple, vous déclarer une class &laquo;&nbsp;.[mon attribut]&nbsp;&raquo; ou &laquo;&nbsp;.no-[mon atribut]&nbsp;&raquo; dans votre feuille de style pour gérer les différentes compatibilité&#8230;</p>
<div id="attachment_807" class="wp-caption alignnone" style="width: 330px"><img class="size-full wp-image-807" title="Border Radius sous firefox" src="http://sldesign.openwab.com/wp-content/uploads/2010/08/border-radius-firefox.jpg" alt="Border Radius sous firefox" width="320" height="98" /><p class="wp-caption-text">Border Radius sous firefox</p></div>
<div id="attachment_808" class="wp-caption alignnone" style="width: 334px"><img class="size-full wp-image-808" title="Border radius sous IE" src="http://sldesign.openwab.com/wp-content/uploads/2010/08/border-radius-ie.jpg" alt="Border radius sous IE" width="324" height="97" /><p class="wp-caption-text">Border radius sous IE après mise en forme via &quot;.no-borderradius&quot;</p></div>
<p>Il est également possible d&#8217;appliquer des conditions sur des éléments javascript. Voici un exemple concernant &laquo;&nbsp;localStorage&nbsp;&raquo;</p>
<pre class="brush:js">&lt;script&gt;
	if (Modernizr.localstorage){
		// Utilisez tous les avantages de localStorage
	} else {
		// Passez par les Cookies
	}
&lt;/script&gt;
</pre>
<p>Cette bibliothèque ne répond surement pas à toutes les problématiques mais elle mérite que l&#8217;on s&#8217;y arrette. Elle est simple d&#8217;utilisation et bien documentée</p>
<p>Pour télécharger &laquo;&nbsp;Modernizr&nbsp;&raquo;, rendez-vous sur le site de l&#8217;auteur : <a title="Site de Modernizr" href="http://www.modernizr.com/" target="_blank">http://www.modernizr.com/</a>.</p>
<h2>Conclusion</h2>
<p>Il n&#8217;existe pas de solution parfaite, cela dit, vous disposez de différentes techniques qui vous permettrons d&#8217;adapter vos pages Web sur tous les navigateurs. Vous pouvez également orienter vos utilisateurs à utiliser un autre navigateur.</p>
<pre class="brush:html">&lt;script&gt;
 $(document).ready(function(){
 if ($.browser.msie) {
 $("#topMsg").html("Votre navigateur n'est pas compatible avec ce site, certaines fonctiionalités et styles seront desactivés. Changer pour &lt;a href=\"http://www.mozilla-europe.org/fr/firefox/\"&gt;firefox&lt;/a&gt; ou &lt;a href=\"http://www.apple.com/fr/safari/\"&gt;Safari&lt;/a&gt; ?");
 }
 });
 &lt;/script&gt;
-----
&lt;p id="topMsg"&gt;

 &lt;/p&gt;</pre>
<p>A bientôt&#8230;</p>
<p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save"><img src="http://sldesign.openwab.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a> </p>]]></content:encoded>
			<wfw:commentRss>http://sldesign.openwab.com/2010/08/08/support-html-5-la-solution-pour-gerer-la-compatibilte-des-navigateurs/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Formulaires HTML5 &#8211; Quoi de neuf ?</title>
		<link>http://sldesign.openwab.com/2010/08/07/formulaires-html5-quoi-de-neuf/</link>
		<comments>http://sldesign.openwab.com/2010/08/07/formulaires-html5-quoi-de-neuf/#comments</comments>
		<pubDate>Sat, 07 Aug 2010 08:37:05 +0000</pubDate>
		<dc:creator>Steve Leherpeux</dc:creator>
				<category><![CDATA[HTML / CSS]]></category>
		<category><![CDATA[Formulaires]]></category>
		<category><![CDATA[HTML 5]]></category>
		<category><![CDATA[Tutoriel]]></category>

		<guid isPermaLink="false">http://sldesign.openwab.com/?p=789</guid>
		<description><![CDATA[Nouveautés HTML 5 &#8211; Formulaires et champs de formulaires Petite introduction aux formulaires HTML 5&#8230; Je vous propose de voir en images et en code les différentes modifications apportées par les nouveaux attributs HTML 5. Introduction : HTML 5 apporte son lot de nouveautés également sur les formulaires. Il est important de prendre en considération [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fsldesign.openwab.com%2F2010%2F08%2F07%2Fformulaires-html5-quoi-de-neuf%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fsldesign.openwab.com%2F2010%2F08%2F07%2Fformulaires-html5-quoi-de-neuf%2F&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p><a href="http://sldesign.openwab.com/wp-content/uploads/2010/08/spash-screen.jpg"><img class="size-full wp-image-792 alignleft" style="margin: 5px;" title="Nouveautés HTML 5 - Splash Screen" src="http://sldesign.openwab.com/wp-content/uploads/2010/08/spash-screen.jpg" alt="Nouveautés HTML 5 - Splash Screen" width="275" height="206" /></a>Nouveautés HTML 5 &#8211; Formulaires et champs de formulaires<br />
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js" type="text/javascript">
        </script></p>
<p>Petite introduction aux formulaires HTML 5&#8230; Je vous propose de voir en images et en code les différentes modifications apportées par les nouveaux attributs HTML 5.<br />
<span id="more-789"></span></p>
<hr class="clear_all" />
<h2>Introduction :</h2>
<p>HTML 5 apporte son lot de nouveautés également sur les formulaires. Il est important de prendre en considération ces modifications car elles vont permettre un meilleur échange entre les utilisateurs et éditeurs de contenu. Elles sont également là pour nous rendre service et optimiser le WEB de demain.</p>
<p class="info">Information : A ce jour, ces nouveautés ne sont compatible qu&#8217;avec les navigateurs &laquo;&nbsp;WEBKIT&nbsp;&raquo; (Safari et Google Chrome).</p>
<h2>Placeholder attribut :</h2>
<p>Cet attribut permet d&#8217;insérer dans votre champ un exemple de texte à saisir qui a la propriété de disparaître au focus. Ceci remplace l&#8217;utilisation de javascript pour réaliser cette opération&#8230;</p>
<h4>Avant&#8230;</h4>
<pre class="brush:html">	&lt;script&gt;
		$(document).ready(function(){
			$('.placeholder').focus(function(){

				if($(this).val() == $(this).attr('alt')){
					$(this).val('');
				};
			});
			$('.placeholder').blur(function(){
				if($(this).val() == ""){
					$(this).val($(this).attr('alt'));
				}
			});

		});
	&lt;/script&gt;
	&lt;form&gt;
		&lt;input type="text" class="placeholder" name="first-name" alt="John" value="John"/&gt;&lt;br/&gt;
		&lt;input type="text" class="placeholder" name="last-name"  alt="Doe" value="Doe"/&gt;&lt;br/&gt;
		&lt;input type="submit" name="submit" value="Save"/&gt;
	&lt;/form&gt;
</pre>
<h4>Après&#8230;</h4>
<pre class="brush:html">	&lt;form&gt;
	&lt;input type="text" name="first-name" placeholder="John"/&gt;&lt;br/&gt;
	&lt;input type="text" name="last-name" placeholder="Doe"/&gt;&lt;br/&gt;
	&lt;input type="submit" name="submit" value="Save"/&gt;
	&lt;/form&gt;
</pre>
<h2>Autofocus</h2>
<p>cet attribut permet de sélectionner un champ en particulier au chargement de la page</p>
<h4>Avant&#8230;</h4>
<pre class="brush:html">	&lt;script&gt;
		$(document).ready(function(){
			$('.selectedInput').focus();
		});
	&lt;/script&gt;
	&lt;form&gt;
	&lt;input type="text" name="first-name" placeholder="John"/&gt;&lt;br/&gt;
	&lt;input class="selectedInput" type="text" name="last-name" autofocus/&gt;&lt;br/&gt;
	&lt;/form&gt;
</pre>
<h4>Après&#8230;</h4>
<pre class="brush:html">        	&lt;form&gt;
	&lt;input type="text" name="first-name" placeholder="John"/&gt;&lt;br/&gt;
	&lt;input type="text" name="last-name" autofocus/&gt;&lt;br/&gt;
	&lt;/form&gt;
</pre>
<div id="attachment_793" class="wp-caption alignnone" style="width: 300px"><img class="size-full wp-image-793" title="Exemple HTML 5 Autofocus" src="http://sldesign.openwab.com/wp-content/uploads/2010/08/autofocus.jpg" alt="Exemple HTML 5 Autofocus" width="290" height="87" /><p class="wp-caption-text">Exemple HTML 5 Autofocus</p></div>
<h2>Attribut Required</h2>
<p>Permet de spécifier si un attribut est obligatoire. Si le champ reste vide au submit, il sera mis en évidence.</p>
<h4>Avant&#8230;</h4>
<pre class="brush:html">		 	&lt;script&gt;
		 		$(document).ready(function(){
					$(".verifForm").click(function(){
						if($(".required").val() == ""){
							alert("Vous devez remplir tous les champs...");
							return false;
						}
					});
				});
		 	&lt;/script&gt;
		 	&lt;form&gt;
		 		&lt;label&gt;Nom d'utilisateur : &lt;/label&gt;&lt;br/&gt;
		 		&lt;input class="required" type="text" name="username" value=""/&gt;&lt;br/&gt;
				&lt;label&gt;Mot de passe : &lt;/label&gt;&lt;br/&gt;
				&lt;input class="required" type="text" name="password" value=""/&gt;&lt;br/&gt;
				&lt;label&gt;Prénom : &lt;/label&gt;&lt;br/&gt;
				&lt;input type="text" name="subname" value=""/&gt;&lt;br/&gt;
				&lt;input class="verifForm" type="submit" name="submit" value="Save"/&gt;
		 	&lt;/form&gt;
</pre>
<h4>
<div id="attachment_795" class="wp-caption alignnone" style="width: 694px"><img class="size-full wp-image-795" title="Aperçu Required avant HTML5" src="http://sldesign.openwab.com/wp-content/uploads/2010/08/required-before.jpg" alt="Aperçu Required avant HTML5" width="684" height="284" /><p class="wp-caption-text">Aperçu Required avant HTML5</p></div></h4>
<h4>Après&#8230;</h4>
<pre class="brush:html">		 	&lt;form&gt;
		 		&lt;label&gt;Nom d'utilisateur : &lt;/label&gt;&lt;br/&gt;
		 		&lt;input required="required" type="text" name="username" value=""/&gt;&lt;br/&gt;
				&lt;label&gt;Mot de passe : &lt;/label&gt;&lt;br/&gt;
				&lt;input required="required" type="text" name="password" value=""/&gt;&lt;br/&gt;
				&lt;label&gt;Prénom : &lt;/label&gt;&lt;br/&gt;
				&lt;input type="text" name="subname" value=""/&gt;&lt;br/&gt;
				&lt;input type="submit" name="submit" value="Save"/&gt;
		 	&lt;/form&gt;
</pre>
<h2>
<p><div id="attachment_794" class="wp-caption alignnone" style="width: 324px"><img class="size-full wp-image-794" title="Résultat attribut HTML5 Required" src="http://sldesign.openwab.com/wp-content/uploads/2010/08/required-after.jpg" alt="Résultat attribut HTML5 Required" width="314" height="300" /><p class="wp-caption-text">Résultat attribut HTML5 Required</p></div></h2>
<h2>Champ email &amp; url</h2>
<p>Permet de spécifier un type de champ email ou url et execute des vérifications</p>
<h4>Avant&#8230;</h4>
<pre class="brush:html">        &lt;script&gt;
        	function isValidEmailAddress(emailAddress) {
				var pattern = new RegExp(/^(("[\w-\s]+")|([\w-]+(?:\.[\w-]+)*)|("[\w-\s]+")([\w-]+(?:\.[\w-]+)*))(@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$)|(@\[?((25[0-5]\.|2[0-4][0-9]\.|1[0-9]{2}\.|[0-9]{1,2}\.))((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2})\.){2}(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2})\]?$)/i);
				return pattern.test(emailAddress);
			}
			function isValidUrlAddress(urlAdress) {
				var pattern = new RegExp(/http:\/\/[A-Za-z0-9\.-]{3,}\.[A-Za-z]{3}/);
				return pattern.test(urlAdress);
			}
            $(document).ready(function(){
            	$('.mail').blur(function(){
					if (!isValidEmailAddress($(this).val())) {
						alert("Email non valide !");
						return false;
					};
				});

				$('.url').blur(function(){
					if(!isValidUrlAddress($(this).val())){
						alert("URL non valide !");
						return false;
					}
				});
            });
        &lt;/script&gt;
		&lt;form&gt;
					&lt;label&gt;News Letter : &lt;/label&gt;&lt;br/&gt;
					&lt;input class="mail" type="text" placeholder="YouMail@provider.com" required /&gt;&lt;br/&gt;
					&lt;label&gt;Votre site Web : &lt;/label&gt;&lt;br/&gt;
					&lt;input class="url" type="text" name="yourWebSite" placeholder="www.yoursite.com"/&gt;&lt;br/&gt;
					&lt;input  type="submit" name="submit" value="Inscription"/&gt;
				&lt;/form&gt;
</pre>
<h4>
<p><div id="attachment_796" class="wp-caption alignnone" style="width: 747px"><img class="size-full wp-image-796" title="Check mail avant HTML5" src="http://sldesign.openwab.com/wp-content/uploads/2010/08/check-mail-before.jpg" alt="Check mail avant HTML5" width="737" height="262" /><p class="wp-caption-text">Check mail avant HTML5</p></div>
<div id="attachment_797" class="wp-caption alignnone" style="width: 726px"><img class="size-full wp-image-797" title="Check URL avant HTML5" src="http://sldesign.openwab.com/wp-content/uploads/2010/08/check-url-before.jpg" alt="Check URL avant HTML5" width="716" height="297" /><p class="wp-caption-text">Check URL avant HTML5</p></div>
<p>Après&#8230;</h4>
<pre class="brush:html">				&lt;form&gt;
					&lt;label&gt;News Letter : &lt;/label&gt;&lt;br/&gt;
					&lt;input type="email" placeholder="YouMail@provider.com" required /&gt;&lt;br/&gt;
					&lt;label&gt;Votre site Web : &lt;/label&gt;&lt;br/&gt;
					&lt;input type="url" name="yourWebSite" placeholder="www.yoursite.com"/&gt;&lt;br/&gt;
					&lt;input  type="submit" name="submit" value="Inscription"/&gt;
				&lt;/form&gt;
</pre>
<div id="attachment_798" class="wp-caption alignnone" style="width: 277px"><img class="size-full wp-image-798" title="Résultat Champ de type Mail HTML5" src="http://sldesign.openwab.com/wp-content/uploads/2010/08/check-mail-after.jpg" alt="Résultat Champ de type Mail HTML5" width="267" height="209" /><p class="wp-caption-text">Résultat Champ de type Mail HTML5</p></div>
<p class="info">Les messages d&#8217;erreurs seront directement gérés par les navigateurs.</p>
<p>Il est également possible d&#8217;utiliser l&#8217;attribut &laquo;&nbsp;pattern&nbsp;&raquo; qui vous permettra de spécifier la structure des données saisies en lieu et place d&#8217;un REGEX javascript :</p>
<pre class="brush:html">&lt;input type="text" name="username" placeholder="Nom d'utilisateur" pattern="[A-Za-z]{4,10}"/&gt;</pre>
<p>Si vous êtes familier avec les expressions régulière vous aurez compris que le format accepté devra contenir uniquement des lettres de 4 à 10 caractères.</p>
<h3>Les nouveaux types de champs :</h3>
<p>Voici les différentes valeurs pouvant être attribuées :</p>
<ul>
<li> tel</li>
<li> search</li>
<li> url</li>
<li> email</li>
<li> datetime</li>
<li> date</li>
<li> month</li>
<li> week</li>
<li> time</li>
<li> datetime-local</li>
<li> number</li>
<li> range</li>
<li> color</li>
</ul>
<h2>Conclusion</h2>
<p>Certes ces nouveautés ne sont encore applicable que sur les navigateurs &laquo;&nbsp;WEBKIT&nbsp;&raquo; mais il est clair que ces nouveaux attributs seront disponible sous peu pour les navigateurs Mozilla (voir IE&#8230;). Alors n&#8217;hésitez pas à utiliser ces nouveaux attributs dès maintenant.</p>
<p>Lien : <a title="Documentation W3C sur les formulaires" href="http://www.w3.org/TR/html401/interact/forms.html#h-17.4" target="_blank">Documentation W3C</a></p>
<p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save"><img src="http://sldesign.openwab.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a> </p>]]></content:encoded>
			<wfw:commentRss>http://sldesign.openwab.com/2010/08/07/formulaires-html5-quoi-de-neuf/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Speed tuts : local storage ou la sauvegarde locale</title>
		<link>http://sldesign.openwab.com/2010/08/06/speed-tuts-local-storage-ou-la-sauvegarde-locale/</link>
		<comments>http://sldesign.openwab.com/2010/08/06/speed-tuts-local-storage-ou-la-sauvegarde-locale/#comments</comments>
		<pubDate>Fri, 06 Aug 2010 07:42:35 +0000</pubDate>
		<dc:creator>Steve Leherpeux</dc:creator>
				<category><![CDATA[HTML / CSS]]></category>
		<category><![CDATA[Tutoriels]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[HTML 5]]></category>
		<category><![CDATA[localStorage]]></category>
		<category><![CDATA[SpeedTuts]]></category>
		<category><![CDATA[Tutoriel]]></category>

		<guid isPermaLink="false">http://sldesign.openwab.com/?p=780</guid>
		<description><![CDATA[HTML 5 nous apporte de nombreuses et belles surprises dont un fait l&#8217;objet de ce tutoriel : &#171;&#160;localStorage&#160;&#187;. A vrai dire, cette fonctionnalité ne fait pas parti officiellement de HTML 5 mais y est lié indirectement. Le principe est simple, cette fonctionnalité vous permet de sauvegarder l&#8217;ensemble de vos données saisies en locale ; que [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fsldesign.openwab.com%2F2010%2F08%2F06%2Fspeed-tuts-local-storage-ou-la-sauvegarde-locale%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fsldesign.openwab.com%2F2010%2F08%2F06%2Fspeed-tuts-local-storage-ou-la-sauvegarde-locale%2F&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>HTML 5 nous apporte de nombreuses et belles surprises dont un fait l&#8217;objet de ce tutoriel : &laquo;&nbsp;localStorage&nbsp;&raquo;. A vrai dire, cette fonctionnalité ne fait pas parti officiellement de HTML 5 mais y est lié indirectement.</p>
<p>Le principe est simple, cette fonctionnalité vous permet de sauvegarder l&#8217;ensemble de vos données saisies en locale ; que vous rafraichissiez la page ou que vous quittiez votre navigateur et le relancez sur la même page, vos données seront sauvegardées.</p>
<p>Nous allons voir dans ce tutoriel la façon d&#8217;implémenter &laquo;&nbsp;localStorage&nbsp;&raquo;.</p>
<p><span id="more-780"></span></p>
<hr class="clear_all" />
<h2>I &#8211; Introduction &amp; prérequis</h2>
<p>Avant de commencer, vous devez connaître le HTML 5 ainsi que l&#8217;utilisation du framework javascript jQuery.</p>
<p>Page de base :</p>
<pre class="brush:html">&lt;!DOCTYPE html&gt;
&lt;html&gt;
 &lt;head&gt;
 &lt;meta name="generator" content="HTML Tidy, see www.w3.org"&gt;
 &lt;meta http-equiv="Content-Type" content= "text/html; charset=UTF-8"&gt;
 &lt;title&gt;Tutoriel local storage&lt;/title&gt;
 &lt;script type="text/javascript" src= "http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"&gt;
 &lt;/script&gt;

 &lt;/head&gt;
 &lt;body&gt;

 &lt;/body&gt;
&lt;/html&gt;</pre>
<p>Vous trouverez ci-dessous la page qui nous servira de base pour ce tutoriel et qui intègre la bibliothèque jQuery</p>
<h2>II &#8211; Création d&#8217;un contenu éditable</h2>
<p>Un des nouveaux attributs de HTML 5 est &laquo;&nbsp;contenteditable&nbsp;&raquo;. Cet attribut vous permet de réaliser des éléments éditables par les utilisateurs. Pour mettre en place cet attribut</p>
<h4>Code HTML &#8211; zone de saisie :</h4>
<pre class="brush:html">	&lt;h5&gt;Todo Liste&lt;/h5&gt;
	&lt;ul class="editable" id="todoListe" contenteditable="true"&gt;
	    &lt;li&gt;
	    &lt;/li&gt;
	&lt;/ul&gt;
	&lt;p&gt;
	    &lt;button id="clearStorage"&gt;
	        Effacer mon localStorage
	    &lt;/button&gt;
	&lt;/p&gt;
</pre>
<div id="attachment_786" class="wp-caption alignnone" style="width: 246px"><img class="size-full wp-image-786" title="Liste éditable" src="http://sldesign.openwab.com/wp-content/uploads/2010/08/2.1-localstorage-content-editable.jpg" alt="Liste éditable" width="236" height="130" /><p class="wp-caption-text">Liste éditable</p></div>
<p>Jusque là, c&#8217;est bien mais lorsque vous quittez votre navigateur ou si vous rafraichissez votre page, le contenu ne sera pas sauvegardé&#8230; Comment faire sans pour autant poster nos données ?</p>
<h2>Utilisation de javascript</h2>
<p>Pour sauvegarder nos données, nous allons utiliser la propriété &laquo;&nbsp;localStorage&nbsp;&raquo; qui nous permettra de sauvegarder nos données en locale sans l&#8217;utilisation de cookies. Vous trouverez ci dessous le code javascript commenté qui nous permettra de réaliser cette opération.</p>
<h4>Code javascript :</h4>
<pre class="brush:js;first-line=14;">&lt;script type="text/javascript"&gt;
$(function(){
	var editable = document.getElementById('todoListe');

	//Action réalisée au focus
	$(editable).blur(function(){
		//Sauvegarde des données saisies dans un variable 'myStorage'
		localStorage.setItem('myStorage', this.innerHTML);
	});

	//Récupération de nos données en cas de chargement...
	if (localStorage.getItem('myStorage')) {
		editable.innerHTML = localStorage.getItem('myStorage');
	};

	//Fonction pour affacer le localStorage
	$('#clearStorage').click(function(){
		localStorage.clear();
		location.reload() ;
	});
});
&lt;/script&gt;
</pre>
<p>Une fois cette opération réalisée, sauvegardez votre fichier puis saisissez plusieurs lignes dans votre liste et sortez du focus. Vous pouvez maintenant fermer votre navigateur et le relancer ou encore rafraichir votre page, les données saisies seront sauvegardées.</p>
<h2>Code complet et ressources :</h2>
<h4>Code complet du tutoriel :</h4>
<pre class="brush:html">&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"&gt;
&lt;html&gt;
    &lt;head&gt;
        &lt;meta name="generator" content="HTML Tidy, see www.w3.org"&gt;
        &lt;meta http-equiv="Content-Type" content= "text/html; charset=UTF-8"&gt;
        &lt;title&gt;Tutoriel local storage&lt;/title&gt;
        &lt;script type="text/javascript" src= "http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"&gt;
        &lt;/script&gt;
        &lt;style type="text/css"&gt;
            .editable {
                background: #f5f5f5;
                border: 1px solid #000;
            }
        &lt;/style&gt;
        &lt;script type="text/javascript"&gt;
            $(function(){
                var editable = document.getElementById('todoListe');
                //Action réalisée au focus
                $(editable).blur(function(){
                    //Sauvegarde des données saisies dans un variable 'myStorage'
                    localStorage.setItem('myStorage', this.innerHTML);
                });

                //Récupération de nos données en cas de chargement...
                if (localStorage.getItem('myStorage')) {
                    editable.innerHTML = localStorage.getItem('myStorage');
                };

                //Fonction pour affacer le localStorage
                $('#clearStorage').click(function(){
                    localStorage.clear();
                    location.reload();
                });
            });
        &lt;/script&gt;
    &lt;/head&gt;
    &lt;body&gt;
    	&lt;h5&gt;Todo Liste&lt;/h5&gt;
            &lt;ul class="editable" id="todoListe" contenteditable="true"&gt;
                &lt;li&gt;
                &lt;/li&gt;
            &lt;/ul&gt;
            &lt;p&gt;
                &lt;button id="clearStorage"&gt;
                    Effacer mon localStorage
                &lt;/button&gt;
            &lt;/p&gt;
    &lt;/body&gt;
&lt;/html&gt;
</pre>
<h3>Compatibilité</h3>
<p>Au moment ou je vous parle, cette implémentation est compatible avec les navigateurs et versions suivantes (windows):</p>
<ul>
<li>Chrome 4 +</li>
<li>Firefox 3.6 +</li>
<li>IE 8 +</li>
<li>Opéra 10 +</li>
<li>Safari 4 +</li>
</ul>
<p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save"><img src="http://sldesign.openwab.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a> </p>]]></content:encoded>
			<wfw:commentRss>http://sldesign.openwab.com/2010/08/06/speed-tuts-local-storage-ou-la-sauvegarde-locale/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Tutoriel Graphisme Gimp &#8211; Création d&#8217;un support CD &#8211; DVD</title>
		<link>http://sldesign.openwab.com/2010/07/29/tutoriel-graphisme-gimp-creation-dun-support-cd-dvd/</link>
		<comments>http://sldesign.openwab.com/2010/07/29/tutoriel-graphisme-gimp-creation-dun-support-cd-dvd/#comments</comments>
		<pubDate>Thu, 29 Jul 2010 06:44:38 +0000</pubDate>
		<dc:creator>Steve Leherpeux</dc:creator>
				<category><![CDATA[Graphisme]]></category>
		<category><![CDATA[Non classé]]></category>
		<category><![CDATA[Gimp]]></category>

		<guid isPermaLink="false">http://sldesign.openwab.com/?p=736</guid>
		<description><![CDATA[Je vous propose dans cet article de réaliser un CD avec Gimp. Ce tutoriel est disponible en version WEB et également en version screen cast (encours de réalisation&#8230;). Difficulté : 5/10 Durée : 20 minutes 1°) Création du document Après avoir lancé &#171;&#160;Gimp&#160;&#187;, créez un nouveau document vierge de 1000px par 1000px (Figue 1.1). Masqué [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fsldesign.openwab.com%2F2010%2F07%2F29%2Ftutoriel-graphisme-gimp-creation-dun-support-cd-dvd%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fsldesign.openwab.com%2F2010%2F07%2F29%2Ftutoriel-graphisme-gimp-creation-dun-support-cd-dvd%2F&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p><a href="http://sldesign.openwab.com/wp-content/uploads/2010/07/cd-screen-splash.jpg"><img class="alignleft size-full wp-image-737" style="margin: 5px;" title="CD réalisé avec Gimp" src="http://sldesign.openwab.com/wp-content/uploads/2010/07/cd-screen-splash.jpg" alt="CD réalisé avec Gimp" width="276" height="276" /></a>Je vous propose dans cet article de réaliser un CD avec Gimp. Ce tutoriel est disponible en version WEB et également en version screen cast (encours de réalisation&#8230;).</p>
<p>Difficulté : 5/10</p>
<p>Durée : 20 minutes</p>
<p><span id="more-736"></span></p>
<hr class="clear_all" />
<h2>1°) Création du document</h2>
<p>Après avoir lancé &laquo;&nbsp;Gimp&nbsp;&raquo;, créez un nouveau document vierge de 1000px par 1000px (Figue 1.1). Masqué tout de suite le calque &laquo;&nbsp;Arrière-plan&nbsp;&raquo; afin d&#8217;afficher la grille.</p>
<div id="attachment_743" class="wp-caption alignnone" style="width: 415px"><img class="size-full wp-image-743" title="Création d'un nouveau document Gimp" src="http://sldesign.openwab.com/wp-content/uploads/2010/07/1.1-cd-gimp-new-doc.jpg" alt="Création d'un nouveau document Gimp" width="405" height="280" /><p class="wp-caption-text">Figure 1.1 - Création d&#39;un nouveau document Gimp</p></div>
<h2>2°) Création du paterne</h2>
<p>Nous allons créer la forme de base de notre CD, pour cela, rien de plus simple puisqu&#8217;il s&#8217;agit d&#8217;un cercle&#8230; Tout d&#8217;abord, ajoutez un nouveau calque que vous nomerez &laquo;&nbsp;Patern CD&nbsp;&raquo;. Sélectionnez l&#8217;outil elipse dans la boite à outil Gimp  <img class="alignnone size-full wp-image-741" title="Gimp bouton elipse de la boite à outils" src="http://sldesign.openwab.com/wp-content/uploads/2010/07/gimp-bt-elipse.jpg" alt="Gimp bouton elipse de la boite à outils" width="25" height="23" /> puis dessinez un cercle quelconque. Il est inutile de réaliser un cercle parfait puisque nous allons régler le positionnement et la taille de notre cercle avec la boite de dialogue de réglage.</p>
<p>Dans la boite de dialogue, entrez les informations suivante (figure 2.1) :</p>
<p>Position : 50 &#8211; 50</p>
<p>Taille : 900 &#8211; 900 pixels</p>
<div id="attachment_744" class="wp-caption alignnone" style="width: 274px"><img class="size-full wp-image-744" title="CD Gimp - Création du cercle principal" src="http://sldesign.openwab.com/wp-content/uploads/2010/07/2.1-cd-gimp-main-circle.jpg" alt="CD Gimp - Création du cercle principal" width="264" height="406" /><p class="wp-caption-text">Figure 2.1 - CD Gimp - Création du cercle principal</p></div>
<p>Remplissez la forme obtenu avec une couler c3c3c3.</p>
<p>Ce paterne nous servira de base pour une sélection complète de notre CD, Dupliquez le et nommez le nouveau calque &laquo;&nbsp;Fond CD&nbsp;&raquo;.</p>
<h2>3°) Création du trou central</h2>
<p>Pour cette opération, nous allons réaliser les mêmes opération que précédemment mais avec de nouveaux réglages. Executez les opérations suivantes :</p>
<ol>
<li>Créez un nouveau calque et nommez le &laquo;&nbsp;Cercle central &#8211; petit&nbsp;&raquo;</li>
<li>Outil Ellipse puis dans la boite de dialogue, entrez les informations suivantes (figure 3.1):
<ul>
<li>Position 435 &#8211; 435</li>
<li>Taille 130 &#8211; 130</li>
</ul>
</li>
<li>Remplissez de noir ou d&#8217;une couleur quelconque</li>
</ol>
<div id="attachment_747" class="wp-caption alignnone" style="width: 278px"><img class="size-full wp-image-747" title="Réglages pour le trou central" src="http://sldesign.openwab.com/wp-content/uploads/2010/07/3.1-cd-gimp-petit-cercle.jpg" alt="Réglages pour le trou central" width="268" height="413" /><p class="wp-caption-text">Figure 3.1 - Réglages pour le trou central</p></div>
<h2>4°) Création du cercle central moyen</h2>
<p>Idem que pour le petit cercle avec les informations suivantes :</p>
<ul>
<li>Nom du calque : Cercle central &#8211; Moyen</li>
<li>Position 390 &#8211; 390</li>
<li>Taille 220 &#8211; 220</li>
<li>Remplissage 8f8f8f</li>
</ul>
<div id="attachment_748" class="wp-caption alignnone" style="width: 276px"><img class="size-full wp-image-748" title="Réglages pour le cercle central - moyen" src="http://sldesign.openwab.com/wp-content/uploads/2010/07/3.2-cd-gimp-cercle-moyen.jpg" alt="Réglages pour le cercle central - moyen" width="266" height="441" /><p class="wp-caption-text">Figure 3.2 - Réglages pour le cercle central - moyen</p></div>
<h2>5°) Création du grand cercle central</h2>
<p>Idem que le cercle de taille moyenne avec les informations suivantes :</p>
<p>Nom du calque : Cercle central &#8211; Grand</p>
<p>Position 340 -340</p>
<p>Taille 320 -320</p>
<p>Remplissage 6b6b6b</p>
<div id="attachment_749" class="wp-caption alignnone" style="width: 280px"><img class="size-full wp-image-749" title="Réglages pour le grand cercle central" src="http://sldesign.openwab.com/wp-content/uploads/2010/07/3.4-cd-gimp-centre-large.jpg" alt="Réglages pour le grand cercle central" width="270" height="415" /><p class="wp-caption-text">Figue 3.4 - Réglages pour le grand cercle central</p></div>
<h2>6°) Création du trou</h2>
<p>Nous avons maintenant notre CD complet ou presque&#8230; nous allons maintenant réaliser le trou central. Pour cela, faite &laquo;&nbsp;Alpha vers sélection&nbsp;&raquo; sur le calque &laquo;&nbsp;Cercle Central &#8211; petit&nbsp;&raquo; puis sélectionnez le calque &laquo;&nbsp;Fond CD&nbsp;&raquo; puis touche &laquo;&nbsp;Suppr.&nbsp;&raquo; de votre clavier. Répétez cette opération de suppression sur les calques &laquo;&nbsp;CCercle central &#8211; Moyen&nbsp;&raquo; et &laquo;&nbsp;Cercle central &#8211; Grand&nbsp;&raquo;</p>
<p>Masquez le calque &laquo;&nbsp;Cercle central &#8211; petit&nbsp;&raquo; afin d&#8217;obtenir notre paterne définitif (figure 4.2)</p>
<div id="attachment_745" class="wp-caption alignnone" style="width: 520px"><img class="size-full wp-image-745" title="Aperçu du paterne " src="http://sldesign.openwab.com/wp-content/uploads/2010/07/4.2-cd-gimp-apercu-2.jpg" alt="Aperçu du paterne " width="510" height="508" /><p class="wp-caption-text">Figure 4.2 - Aperçu du paterne </p></div>
<h2>7°) Réalisation de l&#8217;effet irisé</h2>
<p>Créez un rectangle centré sur le CD  avec les réglages suivants :</p>
<div id="attachment_752" class="wp-caption alignnone" style="width: 274px"><img class="size-full wp-image-752" title="Réglagles pour la sélection rectangulaire" src="http://sldesign.openwab.com/wp-content/uploads/2010/07/5.1-cd-gimp-selection-rectangulaire.jpg" alt="Réglagles pour la sélection rectangulaire" width="264" height="462" /><p class="wp-caption-text">Figure 5.1 - Réglagles pour la sélection rectangulaire</p></div>
<p>Ceci nous permet de travailler sur la moitié de notre image car nous appliquerons par la suite un effet miroir.</p>
<p>Sélectionnez l&#8217;outil dégradé et sélectionnez ensuite un dégradé de type &laquo;&nbsp;Full Saturation Spectrum&nbsp;&raquo;.</p>
<div id="attachment_753" class="wp-caption alignnone" style="width: 209px"><img class="size-full wp-image-753" title="Dégradé de type Saturation spectrum" src="http://sldesign.openwab.com/wp-content/uploads/2010/07/5.3-cd-gimp-select-degrade-saturation-spectrum.jpg" alt="Dégradé de type Saturation spectrum" width="199" height="86" /><p class="wp-caption-text">Figure 5.3 - Dégradé de type Saturation spectrum</p></div>
<p>Remplissez votre sélection rectangulaire de haut en bas avec ce dégradé.</p>
<p>Ensuite, dans le menu calque, faites &laquo;&nbsp;Calque =&gt; Découpage automatique du calque&nbsp;&raquo;.</p>
<p>Il est ensuite nécessaire de déformer notre rectangle afin qu&#8217;il ai une forme d&#8217;entonnoir horizontal. Pour cela, utilisez l&#8217;outil perspective <img class="alignnone size-full wp-image-754" title="Bouton de l'outil perspective" src="http://sldesign.openwab.com/wp-content/uploads/2010/07/gimp-bt-perspective.jpg" alt="Bouton de l'outil perspective" width="23" height="22" /> (figure 5.6).</p>
<div id="attachment_755" class="wp-caption alignnone" style="width: 655px"><img class="size-full wp-image-755" title="Déformation du rectangle irisé" src="http://sldesign.openwab.com/wp-content/uploads/2010/07/5.6-cd-gimp-deformation-irise.jpg" alt="Déformation du rectangle irisé" width="645" height="562" /><p class="wp-caption-text">Figure 5.6 - Déformation du rectangle irisé</p></div>
<p>Cliquez sur &laquo;&nbsp;Transformer&nbsp;&raquo; pour valider la deformation.</p>
<p>Dans le menu, cliquez sur &laquo;&nbsp;Calque =&gt; Calque au dimension de l&#8217;image&nbsp;&raquo; puis dupliquez le calque. Sélectionnez ce nouveau calque et enfin dans le menu, &laquo;&nbsp;Calque =&gt; Transformer =&gt; Miroir horizontal&nbsp;&raquo;.</p>
<p>Fusionner ce nouveau calque avec l&#8217;autre côté irisé (fusionner vers le bas) puis réglez l&#8217;opacité de ce calque à 15 %.</p>
<div id="attachment_756" class="wp-caption alignnone" style="width: 523px"><img class="size-full wp-image-756" title="Apercu après effet irisé" src="http://sldesign.openwab.com/wp-content/uploads/2010/07/6.1-cd-gimp-apercu-cd.jpg" alt="Apercu après effet irisé" width="513" height="510" /><p class="wp-caption-text">Figure 6.1 - Apercu après effet irisé</p></div>
<h2>8°) Lueur blanche</h2>
<p>Nous allons réalisé une lueur blanche comme celle qu&#8217;il pourrait y avoir avec le soleil&#8230;</p>
<p>Créez un nouveau calque puis réalisez une sélection rectangulaire avec les informations suivantes :</p>
<div id="attachment_757" class="wp-caption alignnone" style="width: 274px"><img class="size-full wp-image-757" title="Sélection rectangulaire pour la lueur blanche" src="http://sldesign.openwab.com/wp-content/uploads/2010/07/7.1-cd-gimp-selection-rect-lueur-blanche.jpg" alt="Sélection rectangulaire pour la lueur blanche" width="264" height="435" /><p class="wp-caption-text">Figure 7.1 - Sélection rectangulaire pour la lueur blanche</p></div>
<p>Remplissez cette sélection de blanc.</p>
<p>Appliquez un flou gaussien de 25 puis baissez l&#8217;opacité à 45%. Faites un &laquo;&nbsp;Alpha vers sélection&nbsp;&raquo; sur le calque CD puis &laquo;&nbsp;inverser la sélection&nbsp;&raquo; (Ctrl+i), sélectionnez à nouveau votre calque &laquo;&nbsp;lueur blanche&nbsp;&raquo; et &laquo;&nbsp;Suppr&nbsp;&raquo; de votre clavier pour effacer ce qui dépasse.</p>
<p>Pour finir, utilisez l&#8217;outil rotation <img class="alignnone size-full wp-image-758" title="Gimp bouton de l'outil rotation" src="http://sldesign.openwab.com/wp-content/uploads/2010/07/gimp-bt-rotation.jpg" alt="Gimp bouton de l'outil rotation" width="35" height="33" />et appliquez une rotation de 45°.</p>
<h2>9°) Réglages finaux&#8230;</h2>
<p>Vous pouvez maintenant réaliser différents réglages tel que l&#8217;opacité du centre du CD</p>
<div id="attachment_759" class="wp-caption alignnone" style="width: 519px"><img class="size-full wp-image-759" title="Apercu final du CD" src="http://sldesign.openwab.com/wp-content/uploads/2010/07/8.1-cd-gimp-apercu-centre-median.jpg" alt="Apercu final du CD" width="509" height="508" /><p class="wp-caption-text">Figure 8.1 - Aperçu final du CD</p></div>
<p>Je vous laisse décorer le CD à votre guise&#8230;</p>
<p><img class="alignnone size-full wp-image-760" title="CD's" src="http://sldesign.openwab.com/wp-content/uploads/2010/07/cds.jpg" alt="CD's" width="493" height="342" /></p>
<p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save"><img src="http://sldesign.openwab.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a> </p>]]></content:encoded>
			<wfw:commentRss>http://sldesign.openwab.com/2010/07/29/tutoriel-graphisme-gimp-creation-dun-support-cd-dvd/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Tutoriel CSS : 3D Transform</title>
		<link>http://sldesign.openwab.com/2010/07/27/tutoriel-css-3d-transform/</link>
		<comments>http://sldesign.openwab.com/2010/07/27/tutoriel-css-3d-transform/#comments</comments>
		<pubDate>Tue, 27 Jul 2010 07:36:25 +0000</pubDate>
		<dc:creator>Steve Leherpeux</dc:creator>
				<category><![CDATA[HTML / CSS]]></category>
		<category><![CDATA[3D]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[CSS3]]></category>

		<guid isPermaLink="false">http://sldesign.openwab.com/?p=690</guid>
		<description><![CDATA[Le version 3 de CSS nous a apporté son lot de nouveauté ; parmi les plus connues et plus utilisées on peut citer &#171;&#160;Corner radius&#160;&#187; ou encore les dégradés mais une nouvelle propriété très intéressante va vous permettre une encore plus grande liberté : la propriété &#171;&#160;transform&#160;&#187;. De la 3D en CSS ? Je n&#8217;irai [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fsldesign.openwab.com%2F2010%2F07%2F27%2Ftutoriel-css-3d-transform%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fsldesign.openwab.com%2F2010%2F07%2F27%2Ftutoriel-css-3d-transform%2F&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p><img class="alignleft size-full wp-image-732" style="margin: 5px;" title="CSS Effet 3D - Cube Final" src="http://sldesign.openwab.com/wp-content/uploads/2010/07/cube-final.jpg" alt="CSS Effet 3D - Cube Final" width="199" height="222" />Le version 3 de CSS nous a apporté son lot de nouveauté ; parmi les plus connues et plus utilisées on peut citer &laquo;&nbsp;Corner radius&nbsp;&raquo; ou encore les dégradés mais une nouvelle propriété très intéressante va vous permettre une encore plus grande liberté : la propriété &laquo;&nbsp;transform&nbsp;&raquo;.</p>
<p><em><strong>De la 3D en CSS ?</strong></em></p>
<p>Je n&#8217;irai pas jusqu&#8217;à dire qu&#8217;il s&#8217;agit de 3D mais plutot d&#8217;effet 3D au même titre que nous pouvons réaliser ces effets avec un logiciel de graphisme.</p>
<p>Nous verrons dans cet article comment réaliser un cube en effet 3D.<span id="more-690"></span></p>
<hr class="clear_all" />
<h1>I &#8211; Introduction</h1>
<p>Avant toute chose, il est nécessaire de prendre en compte la comptabilité. L&#8217;utilisation de la propriété CSS 3D transform n&#8217;est compatible qu&#8217;avec Firefox 3.5+ [<code>-moz-transform] (documentation)</code> et Safari 3.2+<code>[-webkit-transform](documentation).</code></p>
<p>Travaillant essentiellement sur Firefox, je ne m'aventurerai pas dans les détails de Safari mais il n'y a pas d'énormes différences...</p>
<h2>1°) Prérequis</h2>
<ul>
<li>Connaissances HTML / CSS</li>
<li>Vous vous souvenez de vos cours de géométrie ?</li>
<li>Un éditeur CSS / HTL</li>
</ul>
<h2>2°) Un peu de théorie...</h2>
<p>http://www.w3.org/TR/css3-3d-transforms/</p>
<p><strong>Rotation d'un objet : </strong>-moz-transform:  rotate(angle);</p>
<p>Exemple :</p>
<p>-moz-transform:  rotate(30);</p>
<pre><img class="size-full wp-image-691 " title="Propritét CSS Transform rotate - Rotation d'un div de 30°" src="http://sldesign.openwab.com/wp-content/uploads/2010/07/1.2.1-css-transform-rotate.jpg" alt="Propritét CSS Transform rotate - Rotation d'un div de 30°" width="318" height="284" />
<div class="mceTemp">
<dl id="attachment_691" class="wp-caption alignnone" style="width: 328px;">
<dd class="wp-caption-dd">Figure 1.2.1 - Propritét CSS Transform rotate - Rotation d'un div de 30°</dd>
</dl>
</div>

<strong>Redimensionnement 2D axe X et Y d'un objet :</strong> -moz-transform:  scale(sx[, sy]);</pre>
<p>Si [sy] n'est pas renseigné, il aura la même valeur de [sx]</p>
<p>Modifier la perspective : -moz-transform: skew(ax,[ay]);</p>
<p>Permet de modifier l'axe de perspective, vous pouvez également utilsier skewX(deg) et skewY(deg) pour les utiliser indépendament.</p>
<p>Exemple : -moz-transform: skewY(30deg);</p>
<p>Parlons maintenant de la propriété "transform:matrix", il faut comprendre dans Matrix la traduction "matrice". Nous avons une forme géométrique qui est constituée de différents points [a,b,c,d] que nous pouvons manipuler.</p>
<pre>-moz-transform:  matrix(a, c, b, d, tx, ty)

/* Where a, b, c, d construit la transformation de la matrice
   ┌     ┐
   │ a b │
   │ c d │
   └     ┘
   and tx, ty are the translate values.  */
</pre>
<p>Quelques exemples :</p>
<p>.matrix {<br />
width: 200px;<br />
height: 100px;<br />
background: #f5f5f5;<br />
-moz-transform:matrix(1,0,0.6,1,15em,0);<br />
}</p>
<p>Rendu (figure 1.2.3)</p>
<div id="attachment_696" class="wp-caption alignnone" style="width: 303px"><img class="size-full wp-image-696 " title="Rendu de la proprité transform:matrix" src="http://sldesign.openwab.com/wp-content/uploads/2010/07/1.2.3-css3D-matrix1.jpg" alt="Rendu de la proprité transform:matrix" width="293" height="113" /><p class="wp-caption-text">Figure 1.2.3 - Rendu de la proprité transform:matrix</p></div>
<p>Exemple 2 - Retournement d'objet</p>
<p>.matrix {<br />
width: 200px;<br />
height: 100px;<br />
background: #ff8000;<br />
-moz-transform:matrix(-1,0,1.2,1,20em,12em);<br />
}</p>
<p>Résultat (figure 1.2.4) :</p>
<div id="attachment_697" class="wp-caption alignnone" style="width: 391px"><img class="size-full wp-image-697" title="Résultat transform:matrix - retournement d'objet" src="http://sldesign.openwab.com/wp-content/uploads/2010/07/1.2.4-css3D-matrix2.jpg" alt="Résultat transform:matrix - retournement d'objet" width="381" height="147" /><p class="wp-caption-text">Figure 1.2.4 - Résultat transform:matrix - retournement d&#39;objet</p></div>
<p>Exemple 3 : Reflexion</p>
<p>-moz-transform: matrix(1, 0, 0, -1, 0, 0);</p>
<div id="attachment_699" class="wp-caption alignnone" style="width: 218px"><img class="size-full wp-image-699" title="Exemple transform:matrix - Reflexion" src="http://sldesign.openwab.com/wp-content/uploads/2010/07/1.2.5-css3D-reflexion-sample.jpg" alt="Exemple transform:matrix - Reflexion" width="208" height="388" /><p class="wp-caption-text">Figure 1.2.5 - Exemple transform:matrix - Reflexion</p></div>
<p>Autres exemples (non-shématisés) :</p>
<p>Rotation 90° sur la gauche : -moz-transform:matrix(0,-1,1,0,0,0);</p>
<h1>II - Création d'un cube 3D</h1>
<h2>1°) Code HTML de base</h2>
<p>Il faut tout d'abord créer 3 blocs qui nous permettrons de simuler notre cube. Ces 3 blocs seront encadrés par un div global.</p>
<p>Code HTML du cube</p>
<pre class="brush:html">&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt;
&lt;html xmlns="http://www.w3.org/1999/xhtml"&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /&gt;
&lt;title&gt;Tutoriel CSS 3D&lt;/title&gt;
&lt;base href="http://localhost/tutos/tuts/css-3D/"/&gt;
&lt;link href="style.css" rel="stylesheet" type="text/css"/&gt;
&lt;/head&gt;
&lt;body&gt;
 &lt;div id="cube"&gt;
 &lt;div id="topSide"&gt;&lt;div&gt;Content&lt;/div&gt;&lt;/div&gt;
 &lt;div id="leftSide"&gt;&lt;div&gt;Content&lt;/div&gt;&lt;/div&gt;
 &lt;div id="rightSide"&gt;&lt;div&gt;Content&lt;/div&gt;&lt;/div&gt;
 &lt;/div&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>
<p>J'ai également créé un fichier css qui nous permettra de mettre en forme notre cube 3D. Dans un premier temps, j'ai simplement dissocier les blocs.</p>
<p>Code CSS fichier style.css</p>
<pre class="brush:css">#cube {
 position: relative;
 top: 200px;
 margin:0 0 230px 0;
}

#cube .cubeSide{
 height:200px;
 width:200px;
}
#topSide{
 background:#ff8000;
}
#leftSide{ background:#0080c0;}
#rightSide{background:#00ff40;}</pre>
<p>Voici le résultat obtenu (figure 2.1.1) :</p>
<div id="attachment_695" class="wp-caption alignnone" style="width: 216px"><img class="size-full wp-image-695" title="CSS Transform - Cube 3D Etape 1" src="http://sldesign.openwab.com/wp-content/uploads/2010/07/2.1-css3D-etape1.jpg" alt="CSS Transform - Cube 3D Etape 1" width="206" height="575" /><p class="wp-caption-text">Figure 2.1.1  -CSS Transform - Cube 3D Etape 1</p></div>
<p>Maintenant, passons à des choses un peu plus sympa, nous allons appliquer notre propriété "transform" à notre cube :</p>
<pre class="brush:css;first-line:27">.leftFace {
 background: #ff8000;
 -moz-transform: skewY(30deg);
}

.rightFace {
 background: #800080;
 -moz-transform: skewY(-30deg);
}</pre>
<p>Nous avons appliqué ici une propriété "transform:skewY" permettant d'incliner nos div sur leurs axes Y donnant ainsi un effet de perspective.</p>
<div id="attachment_701" class="wp-caption alignnone" style="width: 221px"><img class="size-full wp-image-701" title="Transformation perspective sur l'axe Y - [transform:skewX(val)" src="http://sldesign.openwab.com/wp-content/uploads/2010/07/cube_2.jpg" alt="Transformation perspective sur l'axe Y - [transform:skewX(val)" width="211" height="606" /><p class="wp-caption-text">Figure 2.1.2 - Transformation perspective sur l&#39;axe Y - [transform:skewX(val)</p></div>
<p>Positionner les DIV : Nous devons appliquer un positionnement "absolute" à l'ensemble de nos blocs afin que ceux-ci puissent êtres dissocié et placés indépendament (figure 2.1.3) .</p>
<p>Code CSS : Positionnement des DIV</p>
<pre class="brush:css;first-line:11">.topFace, .leftFace, .rightFace {
position: absolute;
}
</pre>
<div id="attachment_704" class="wp-caption alignnone" style="width: 222px"><img class="size-full wp-image-704" title="Positionnement absolute des blocs" src="http://sldesign.openwab.com/wp-content/uploads/2010/07/cube_3.jpg" alt="Positionnement absolute des blocs" width="212" height="326" /><p class="wp-caption-text">Figure 2.1.3 - Positionnement absolute des blocs</p></div>
<p>Ensuite, nous allons positionner notre bloc right (figure 2.1.4). Il s'agit ici de décaller notre bloc de 200px sur la droite et vers le bas.</p>
<pre class="brush:css;first-line:34;">.rightFace {
 background: #800080;
 -moz-transform: skewY(-30deg);
 top: 200px;
 left: 200px;
}</pre>
<div id="attachment_705" class="wp-caption alignnone" style="width: 401px"><img class="size-full wp-image-705" title="Positionnement du bloc &quot;rightSide&quot;" src="http://sldesign.openwab.com/wp-content/uploads/2010/07/cube_4.jpg" alt="Positionnement du bloc &quot;rightSide&quot;" width="391" height="442" /><p class="wp-caption-text">Figure 2.1.4 - Positionnement du bloc &quot;rightSide&quot;</p></div>
<p>Intéressons nous maintenant à la partie haute, c'est à dire le DIV topSide. C'est la partie la plus compliquée...</p>
<pre class="brush:css;first-line:15;">.topFace {
 -moz-transform: rotate(60deg);
 left: 100px;
 top: 42px;
}

.topFace div {
 background: #0080c0;
 -moz-transform: skewY(-30deg) scaleY(1.16);
}</pre>
<p>Quelques explications : Pour donner cet effet, il est nécessaire de pivoter notre face (-moz-transform: rotate(60deg);), puis nous appliquons une perspective et un redimenssionnement.</p>
<div id="attachment_731" class="wp-caption alignnone" style="width: 394px"><img class="size-full wp-image-731" title="CSS Effet 3D - Cube final" src="http://sldesign.openwab.com/wp-content/uploads/2010/07/cube_6.jpg" alt="CSS Effet 3D - Cube final" width="384" height="472" /><p class="wp-caption-text">Figure 2.1.5 - CSS Effet 3D - Cube final</p></div>
<p>Avec un peu d'habillage, voici le résultat final :</p>
<div id="attachment_732" class="wp-caption alignnone" style="width: 429px"><img class="size-full wp-image-732" title="CSS Effet 3D - Cube Final" src="http://sldesign.openwab.com/wp-content/uploads/2010/07/cube-final.jpg" alt="CSS Effet 3D - Cube Final" width="419" height="468" /><p class="wp-caption-text">Figure 2.1.5 - CSS Effet 3D - Cube Final</p></div>
<p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save"><img src="http://sldesign.openwab.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a> </p>]]></content:encoded>
			<wfw:commentRss>http://sldesign.openwab.com/2010/07/27/tutoriel-css-3d-transform/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Impossible de se connecter au panel d&#8217;administration Magento (Problème et solution)</title>
		<link>http://sldesign.openwab.com/2010/07/24/impossible-de-se-connecter-au-panel-dadministration-magento-probleme-et-solution/</link>
		<comments>http://sldesign.openwab.com/2010/07/24/impossible-de-se-connecter-au-panel-dadministration-magento-probleme-et-solution/#comments</comments>
		<pubDate>Sat, 24 Jul 2010 06:36:37 +0000</pubDate>
		<dc:creator>Steve Leherpeux</dc:creator>
				<category><![CDATA[Magento]]></category>
		<category><![CDATA[Non classé]]></category>
		<category><![CDATA[Astuce]]></category>

		<guid isPermaLink="false">http://sldesign.openwab.com/?p=666</guid>
		<description><![CDATA[Après l&#8217;installation de Magento, il est possible que vous rencontriez des problèmes de connexion à l&#8217;espace d&#8217;administration, notamment si vous travaillez en local. En effet, ce problème est lié aux cookies que Magento ne parvient pas à stocker. Le fait de travailler en local implique qu&#8217;il n&#8217;y a pas de nom de domaine et donc [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fsldesign.openwab.com%2F2010%2F07%2F24%2Fimpossible-de-se-connecter-au-panel-dadministration-magento-probleme-et-solution%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fsldesign.openwab.com%2F2010%2F07%2F24%2Fimpossible-de-se-connecter-au-panel-dadministration-magento-probleme-et-solution%2F&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p><a href="http://sldesign.openwab.com/wp-content/uploads/2010/07/magento-splash-screen.jpg"><img class="alignleft size-full wp-image-667" style="margin: 5px;" title="Magento Splash Screen" src="http://sldesign.openwab.com/wp-content/uploads/2010/07/magento-splash-screen.jpg" alt="Magento Splash Screen" width="235" height="226" /></a>Après l&#8217;installation de Magento, il est possible que vous rencontriez des problèmes de connexion à l&#8217;espace d&#8217;administration, notamment si vous travaillez en local.</p>
<p>En effet, ce problème est lié aux cookies que Magento ne parvient pas à stocker. Le fait de travailler en local implique qu&#8217;il n&#8217;y a pas de nom de domaine et donc la sauvegarde des cookies ne se fait pas.</p>
<p>Deux possibilités :</p>
<h3>Solution 1 &#8211; Modifier l&#8217;URL d&#8217;accès au script :</h3>
<p>Dans certains cas si vous travaillez en local, l&#8217;utilisation de l&#8217;adresse &laquo;&nbsp;localhost&nbsp;&raquo; pose un problème. Essayé de vous connecter en tapant directement l&#8217;IP dans votre barre d&#8217;adresse : &laquo;&nbsp;<a href="http://127.0.0.1/magento/admin/">http://127.0.0.1/magento/admin/</a>&laquo;&nbsp;.</p>
<h3>Solution 2 &#8211; Éditez les paramétres des cookies</h3>
<p>-Rendez-vous dans votre répertoire :  &laquo;&nbsp;app/code/core/Mage/Core/Model/Session/Abstract/&nbsp;&raquo;. Éditez le fichier &laquo;&nbsp;Varien.php avec un éditeur de texte&nbsp;&raquo;</p>
<p>-Trouvez le code suivant (~ligne 78),</p>
<pre class="brush:php;first-line:78">// session cookie params
 $cookieParams = array(
 'lifetime' =&gt; $cookie-&gt;getLifetime(),
 'path'     =&gt; $cookie-&gt;getPath(),
 'domain'   =&gt; $cookie-&gt;getConfigDomain(),
 'secure'   =&gt; $cookie-&gt;isSecure(),
 'httponly' =&gt; $cookie-&gt;getHttponly()
 );</pre>
<p>et remplacez par :</p>
<pre class="brush:php;first-line:78">// session cookie params
 $cookieParams = array(
 'lifetime' =&gt; $cookie-&gt;getLifetime(),
 'path'     =&gt; $cookie-&gt;getPath(),
 //'domain'   =&gt; $cookie-&gt;getConfigDomain(),
 //'secure'   =&gt; $cookie-&gt;isSecure(),
 //'httponly' =&gt; $cookie-&gt;getHttponly()
 );</pre>
<p>-Sauvegardez et essayez de vous connecter à nouveau.</p>
<p>Ceci devrait fonctionner&#8230;</p>
<p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save"><img src="http://sldesign.openwab.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a> </p>]]></content:encoded>
			<wfw:commentRss>http://sldesign.openwab.com/2010/07/24/impossible-de-se-connecter-au-panel-dadministration-magento-probleme-et-solution/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>CodeIgniter Tutorial : Introduction et première application</title>
		<link>http://sldesign.openwab.com/2010/07/20/codeigniter-tutorial-introduction-et-premiere-application/</link>
		<comments>http://sldesign.openwab.com/2010/07/20/codeigniter-tutorial-introduction-et-premiere-application/#comments</comments>
		<pubDate>Tue, 20 Jul 2010 13:34:15 +0000</pubDate>
		<dc:creator>Steve Leherpeux</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Tutoriels]]></category>
		<category><![CDATA[CodeIgniter]]></category>
		<category><![CDATA[Framework]]></category>
		<category><![CDATA[Tutoriel]]></category>

		<guid isPermaLink="false">http://sldesign.openwab.com/?p=566</guid>
		<description><![CDATA[Je ne suis pas un fan inconditionné des Frameworks PHP, ces derniers peuvent parfois s&#8217;avérer trop lourds pour certaines applications. L&#8217;apprentissage d&#8217;un framework PHP peut être fastidieu, et la documentation n&#8217;est pas toujours au rendez-vous. Puis un jour, j&#8217;ai découvert CodeIgniter ! Je vous propose un tour d&#8217;horizon de ce framework à travers le développement [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fsldesign.openwab.com%2F2010%2F07%2F20%2Fcodeigniter-tutorial-introduction-et-premiere-application%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fsldesign.openwab.com%2F2010%2F07%2F20%2Fcodeigniter-tutorial-introduction-et-premiere-application%2F&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p><img class="alignleft size-full wp-image-570" style="margin: 5px;" title="codeigniter-splash-screen" src="http://sldesign.openwab.com/wp-content/uploads/2010/07/codeigniter-splash-screen.jpg" alt="Splash screen CodeIgniter" width="238" height="245" />Je ne suis pas un fan inconditionné des Frameworks PHP, ces derniers peuvent parfois s&#8217;avérer trop lourds pour certaines applications. L&#8217;apprentissage d&#8217;un framework PHP peut être fastidieu, et la documentation n&#8217;est pas toujours au rendez-vous.</p>
<p>Puis un jour, j&#8217;ai découvert CodeIgniter ! Je vous propose un tour d&#8217;horizon de ce framework à travers le développement d&#8217;un petit CRM. Nous verrons ainsi comment intégré CodeIgniter et comment tirer parti de ces nombreux avantages.</p>
<p>Notes de versions : Cette article est amené à évolué. Etant mon premier tutoriel CodeIgniter, vos remarques et toute critique pouvant améliorer cet article seront les bienvenues <img src='http://sldesign.openwab.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Version 0.1 du 20 Juillet 2010</p>
<p>L&#8217;application présentée dans ce tutoriel n&#8217;a pas pour vocation d&#8217;être utilisée en production mais une version plus élaborée et complète sera prochainement disponible sur ce site.<br />
<span id="more-566"></span></p>
<hr class="clear_all" />
<h2>I &#8211; Framework PHP</h2>
<h3>Définition d&#8217;un Framework (Source Wiki) :</h3>
<blockquote><p>En programmation informatique, un <strong>framework</strong> est un <em>kit</em> de composants logiciels structurels, qui définissent les  fondations ainsi que les grandes lignes de l&#8217;organisation de tout ou  partie d&#8217;un logiciel (architecture). En programmation orientée objet un  framework est typiquement composé de classes mères qui seront dérivées et  étendues par héritage en fonction des besoins  spécifiques à chaque logiciel qui utilise le framework.</p>
<p>Les framework sont utilisés pour modeler l&#8217;architecture des logiciels applicatifs, des applications web, des middleware et des composants logiciels. Les framework sont  achetés par les ingénieurs, puis ajoutés comme partie intégrante des  logiciels applicatifs mis sur le marché, ils sont par conséquent  rarement achetés et installés séparément par un utilisateur final.</p>
<p>Des tentatives de francisation du terme ont été faites. On trouve  ainsi parfois les termes <strong>cadre d&#8217;applications</strong>, proposé par l&#8217;Office québécois de la  langue française ou <strong>cadriciel</strong>.  L&#8217;expression <strong>atelier de développement</strong> est également employée.</p>
<p>Un framework est un ensemble d&#8217;outils et de composants logiciels organisés conformément à un plan d&#8217;architecture et des design patterns. L&#8217;ensemble forme un <em>squelette</em> de programme. Il est souvent fourni sous la forme d&#8217;une bibliothèque logicielle, et  accompagné du plan de l&#8217;architecture cible du framework.Avec un framework orienté objets, le programmeur qui utilise le  framework pourra personaliser les éléments principaux du programme par  extension, en utilisant le mécanisme d&#8217;héritage: créer des nouvelles classes qui contiennent toutes les  fonctionnalités que met en place le framework, et en plus ses  fonctionnalités propres, créées par le programmeur en fonction des  besoins spécifiques à son programme. Le mécanisme d&#8217;héritage permet  également de transformer des fonctionnalités existant dans les classes  du framework.</p>
<p>Un framework est conçu en vue d&#8217;aider les programmeurs dans leur  travail. L&#8217;organisation du framework vise la productivité maximale du  programmeur qui va l&#8217;utiliser &#8211; gage de baisse des coûts de construction  du programme. Le contenu exact du framework est dicté par le type de  programme et l&#8217;architecture cible pour lequel il est concu.</p></blockquote>
<h3>2°) Les avantages d&#8217;un Framework</h3>
<p><strong>Recyclage du code :</strong> Le code est réutilisable, ceci signifie qu&#8217;il n&#8217;est plus nécessaire de coder 4 ou 5 fois la même chose pour des projets différents</p>
<p><strong>Fiabilité : </strong>Le code de ces Frameworks sont testés et maintenus par une grande communauté de développeurs.</p>
<p><strong>Débogage : </strong>le frameworks PHP ont leurs propres méthodes de débogage spécifiques qui  vous permettent de repérer facilement les erreurs dans votre  développement.</p>
<p><strong>Aide communautaire:</strong> Vous ne jamais se sentir seul  alors que le codage de ces cadres. Lorsque vous jamais ressenti aucune  pression, vous pouvez demander de l&#8217;aide dans les communautés. Il ya bon  nombres de développeurs, qui va sûrement aider dans votre  développement.</p>
<p class="info">Note : Pour plus d&#8217;information, je vous invite à consulter le livre blanc &laquo;&nbsp;<strong>frameworks php pour  l’entreprise</strong>&nbsp;&raquo; que vous pourrez découvrir à l&#8217;adresse suivante : <a title="Livre blanc : Frameworks PHP pour l'entreprise" href="http://www.clever-age.com/veille/publications/developpement-specifique/livre-blanc-frameworks-php-pour-l-entreprise.html" target="_blank">http://www.clever-age.com/veille/publications/developpement-specifique/livre-blanc-frameworks-php-pour-l-entreprise.html</a> (envoi après demande par mail).</p>
<h2>II &#8211; Présentation de CodeIgniter</h2>
<h3>1°) Sur le site de l&#8217;éditeur :</h3>
<blockquote><p>CodeIgniter  est un framework PHP puissant avec un très faible encombrement,  construit pour les codeurs PHP qui ont besoin d&#8217;une boîte à outils  simple et élégante pour créer des applications web complet. Si vous êtes un développeur qui vit dans le monde  réel de l&#8217;hébergement mutualisé et des comptes clients avec des délais,  et si vous êtes fatigué de cadres de grandes lourdement et de manière  approfondie sans-papiers</p></blockquote>
<p>J&#8217;ai choisi de diffuser cette définition car elle représente assez bien ce qu&#8217;est CodeIgniter. Si vous avez déjà testé Zend Framework ou encore Symphonie, vous allez rapidement vous rendre compte de ces petites différences qui font de CodeIgniter un Framework Simple, Intuitif et rapide à mettre en oeuvre.</p>
<h3>2°) Quelques références</h3>
<p>Vous trouverez une liste plus complète d&#8217;applications et de sites réalisés avec CodeIgniter mais si vous voulez voir tout de suite ce qu&#8217;il est possible de faire avec ce Framework, voici quelques ressources :</p>
<ul>
<li><a title="Exemple CodeIgniter - Club 3D" href="http://www.club-3d.com/" target="_blank">http://www.club-3d.com/</a></li>
<li><a title="Application Bamboo réalisée avec CodeIgniter" href="http://www.bambooinvoice.org/" target="_blank">http://www.bambooinvoice.org/</a></li>
<li><a title="CMS réalisé avec CodeIgniter" href="http://ionizecms.com/" target="_blank">http://ionizecms.com/</a></li>
</ul>
<h3>3°) Resources</h3>
<p>Une des forces de CodeIgniter (comme tout bon framework) est représenté par sa communauté et plus particulièrement sa communauté Française. Vous pouvez consulter les ressources &laquo;&nbsp;Françaises&nbsp;&raquo; à l&#8217;adresse suivante :<a title="Site Internet CodeIgniter France" href="http://codeigniter.fr/" target="_blank"> http://codeigniter.fr/</a>. Vous y trouverez la documentation, des tutoriels, ScreenCasts et un forum.</p>
<p>Si vous souhaitez plus de ressource, le site principal de CodeIgniter accessible à l&#8217;adresse suivante : <a title="Site principal CodeIgniter" href="http://codeigniter.com/" target="_blank">http://codeigniter.com/</a></p>
<h2>II &#8211; Introduction à CodeIgniter</h2>
<div class="info">
<p>Note : Les sections qui suivent requiers certains prérequis pour le bon suivi de ce didacticiel.</p>
<ul>
<li>Un éditeur de codes PHP &#8211; HTML &#8211; CSS &#8211; Javascript</li>
<li>Des connaissances dans les langages de programmation WEB &#8211; PHP &#8211; HTML &#8211; CSS &#8211; Javascript</li>
<li>Un serveur WAMP ou LAMP ou MAMP (selon votre OS)</li>
</ul>
<p><span style="text-decoration: underline;">Note de versions et outils :</span></p>
<ul>
<li>Version CodeIgniter : 1.7.2</li>
<li>Version PHP : 5</li>
<li>Editeur HTML &#8211; PHP : Aptana IDE</li>
<li>Framework jQuery et jQuery UI</li>
<li>Nom du projet :  crmIgniter &#8211; Un dossier portant ce nom est créé à la racine du serveur Apache &#8216;www/crmIgniter/&#8217;</li>
</ul>
<p><em>PS. Si vous ne comprenez pas un seul mot de ce qui est ci-dessus, passez votre chemin</em> <img src='http://sldesign.openwab.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
</div>
<h3>1°) Préparation du projet</h3>
<p>Lancer votre IDE puis créez un nouveau projet à la racine de votre serveur WEB &laquo;&nbsp;crmIgniter&nbsp;&raquo; (j&#8217;utilise AptanaIDE)</p>
<h3>2°) Téléchargement &amp; installation</h3>
<p>La première chose à faire, consiste à télécharger le Framework qui est matérialiser par une archive téléchargeable à l&#8217;adresse suivante : <a title="Lien de téléchargement dernière version CodeIgniter" href="http://codeigniter.com/download.php" target="_blank">http://codeigniter.com/download.php</a></p>
<p>Une fois téléchargé cette archive, vous pouvez l&#8217;extraire. Après extraction, vous découvrirez deux dossiers :</p>
<ul>
<li>Un dossier system</li>
<li>Un dossier user_guide</li>
</ul>
<p>Déplacez l&#8217;ensemble de son contenu dans votre répertoire &laquo;&nbsp;crmIgniter&nbsp;&raquo; de sorte que votre fichier &laquo;&nbsp;index.php&nbsp;&raquo; soit à la racine de votre projet (figure 2.1.1).</p>
<div id="attachment_582" class="wp-caption alignnone" style="width: 501px"><img class="size-full wp-image-582" title="2.2.1-ci-structure-projet" src="http://sldesign.openwab.com/wp-content/uploads/2010/07/2.2.1-ci-structure-projet.jpg" alt="Contenu du repertoire crmIgniter" width="491" height="207" /><p class="wp-caption-text">Figure 2.2.1 - Contenu du repertoire crmIgniter</p></div>
<p>Regardons d&#8217;un peu plus prêt la structure du Framework et plus particulièrement le dossier &laquo;&nbsp;system&nbsp;&raquo; qui contient entre autre :</p>
<ul>
<li>Le dossier &laquo;&nbsp;codeigniter&nbsp;&raquo; correspond au Framework lui-même</li>
<li>Le dossier &laquo;&nbsp;application&nbsp;&raquo; dans lequel sera stocké notre application</li>
<li>Le dossier &laquo;&nbsp;helpers&nbsp;&raquo; regroupant des outils de manipulation PHP</li>
<li>Le dossier &laquo;&nbsp;librarie&nbsp;&raquo; regroupant des bibliothèques de fonctions PHP</li>
</ul>
<p>CodeIgniter est un Framework développé selon  le principe du MVC &#8211; Model View Controller. Je vous renvoie à l&#8217;adresse suivante pour la définition complète de ce qu&#8217;est le MVC : <a title="Définition MVC" href="http://dico.developpez.com/html/3020-Conception-MVC-Model-View-Controller.php" target="_blank">http://dico.developpez.com/html/3020-Conception-MVC-Model-View-Controller.php</a></p>
<p>Ouvrons maintenant notre dossier &laquo;&nbsp;application&nbsp;&raquo; et détaillons son contenu :</p>
<ul>
<li>Le dossier &laquo;&nbsp;config&nbsp;&raquo; qui contient nos données de configuration</li>
<li>Le dossier &laquo;&nbsp;controllers&nbsp;&raquo; contenant des fichiers de class qui sont liés à nos URL</li>
<li>Le dossier &laquo;&nbsp;view&nbsp;&raquo; correspondant aux vues</li>
</ul>
<p>Comme un exemple vaut mieux qu&#8217;un grand discourt, tapez l&#8217;adresse suivant dans votre navigateur &laquo;&nbsp;http://localhost/crmIgniter/index.php/welcome/&nbsp;&raquo;. Après avoir validé l&#8217;URL, vous devriez voir s&#8217;afficher la page de bienvenue (figure 2.2.2)</p>
<div id="attachment_583" class="wp-caption alignnone" style="width: 747px"><img class="size-full wp-image-583" title="2.2.2-ci-welcome-page" src="http://sldesign.openwab.com/wp-content/uploads/2010/07/2.2.2-ci-welcome-page.jpg" alt="Page de bienvenue CodeIgniter" width="737" height="303" /><p class="wp-caption-text">Figure 2.2.2 - Page de bienvenue CodeIgniter</p></div>
<p>Essayons de comprendre&#8230; nous avons une URL dont le trigger est &laquo;&nbsp;welcome&nbsp;&raquo;, le contrôleur portant le même nom va s&#8217;executer. Regardons de plus prêt le contenu du fichier &laquo;&nbsp;/controllers/welcome.php&nbsp;&raquo; :</p>
<p>Code PHP :</p>
<pre class="brush:php">&lt;?php

class Welcome extends Controller {

 function Welcome()
 {
 parent::Controller();
 }

 function index()
 {
 $this-&gt;load-&gt;view('welcome_message');
 }
}

/* End of file welcome.php */
/* Location: ./system/application/controllers/welcome.php */</pre>
<p>Ce fichier est une class et la fonction principale &laquo;&nbsp;index()&nbsp;&raquo; execute l&#8217;action &laquo;&nbsp;load-&gt;view&nbsp;&raquo;. Nous somme donc dans un contexte POO. Le &laquo;&nbsp;$this&nbsp;&raquo; définie notre application, en somme, nous pourrions traduire celas par &laquo;&nbsp;Mon application charge la vue &#8216;welcome_message&#8217;.</p>
<p>Si nous regardons à l&#8217;intérieur de notre dossier &laquo;&nbsp;view&nbsp;&raquo;, nous devrions trouver un fichier &laquo;&nbsp;welcome_message.php&nbsp;&raquo;. En ouvrant ce fichier, nous pouvons consulter le code HTML qui le compose.</p>
<h2>III &#8211; Notions de bases</h2>
<h3>1°) Modèle MVC</h3>
<p>Le <strong>Modèle-Vue-Contrôleur</strong> (en abrégé <strong>MVC</strong>, de l&#8217;anglais <em>Model-View-Controller</em>)  est une architecture et une méthode de conception qui  organise l&#8217;interface homme-machine (IHM) d&#8217;une  application logicielle. Ce paradigme divise l&#8217;IHM en un modèle (modèle de données), une vue (présentation, interface  utilisateur) et un contrôleur (logique de contrôle, gestion des  événements, synchronisation), chacun ayant un rôle précis dans  l&#8217;interface. Cette méthode a été mise au point en 1979 par Trygve Reenskaug, qui travaillait alors sur Smalltalk dans les laboratoires de recherche Xerox  PARC.</p>
<p>Pour faire plus simple, il s&#8217;agit simplement d&#8217;un model qui sépare la présentation du code.</p>
<div id="attachment_640" class="wp-caption alignnone" style="width: 310px"><img class="size-medium wp-image-640" title="MVC en image" src="http://sldesign.openwab.com/wp-content/uploads/2010/07/mvc-php-codeigniter-300x283.png" alt="Schéma MVC" width="300" height="283" /><p class="wp-caption-text">Figure 3.1.1 - Organisation MVC</p></div>
<h3>2°) Chargement des vues et URL</h3>
<p>Le schéma de fonctionnement dans CodeIgniter est le suivant :</p>
<p>Le contrôleur principal analyse l&#8217;URL et va charger une vue, cette vue étant exécutée par une fonction</p>
<h2>IV &#8211; Tutoriel Projet crmIgniter &#8211; Réalisation d&#8217;un CRM avec CodeIgniter</h2>
<p>Introduction et notes : La réalisation de cette application se fait dans le cadre d&#8217;un tutoriel et n&#8217;a pas pour vocation à être mis en production. Le code est à vocation didacticiel et n&#8217;est pas optimisé ni sécurisé. Ce tutoriel évoluera au fil de l&#8217;application et servira de base à d&#8217;autres articles.</p>
<h3>1°) Configuration</h3>
<p>Nous allons commencer à configurer notre projet. Pour cela, ouvrez le dossier &#8216;application/config/&#8217; dans votre éditeur.  ce dossier contient l&#8217;ensemble des fichiers de configuration. Nous allons commencer par éditer notre fichier &#8216;config.php&#8217;. Vous devez simplement renseigner / modifier les élements de ce fichier. J&#8217;ai simplement modifier l&#8217;URL de base :</p>
<pre class="brush:php">$config['base_url']    = "http://localhost/crmIgniter/";</pre>
<p>Configurons maintenant notre base de données. Dans un premier temps, créez une base de données MySql &laquo;&nbsp;crmIgniter&nbsp;&raquo;, ne créz pas de table pour le moment, nous verrons cela ultérieurement.</p>
<p>Ouvrez votre fichier &laquo;&nbsp;application/config/database.php&nbsp;&raquo; puis  renseignez les éléments de ce fichier.</p>
<pre class="brush:php;first-line:37;">$active_group = "default";
$active_record = TRUE;

$db['default']['hostname'] = "localhost";
$db['default']['username'] = "root";
$db['default']['password'] = "";
$db['default']['database'] = "crmIgniter";
$db['default']['dbdriver'] = "mysql";
$db['default']['dbprefix'] = "";
$db['default']['pconnect'] = TRUE;
$db['default']['db_debug'] = TRUE;
$db['default']['cache_on'] = FALSE;
$db['default']['cachedir'] = "";
$db['default']['char_set'] = "utf8";
$db['default']['dbcollat'] = "utf8_general_ci";

/* End of file database.php */
/* Location: ./system/application/config/database.php */</pre>
<p>Nous reviendrons ultérieurement sur ces fichiers de configuration.</p>
<h3>2°) Les contrôleur CodeIgniter</h3>
<p>Un contrôleur est simplement une class qui est nommée dans le but d&#8217;être chargée en fonction d&#8217;une URL.</p>
<p>L&#8217;exemple suivant : &laquo;&nbsp;http://www.monsite.com/articles/</p>
<p>chargera la class &laquo;&nbsp;articles&nbsp;&raquo;. Ce contrôleur devra contenir des fonctions permettant de charger des vues. Par défaut, la fonction &laquo;&nbsp;index()&nbsp;&raquo; chargera la vue par défaut</p>
<pre class="brush:php">class articles{
    function index(){
    //Code à executer
    }
}</pre>
<p>Il est possible de charger un contrôleur par défaut, cette opération peut se faire en éditant le fichier &laquo;&nbsp;<dfn>application/config/routes.php&nbsp;&raquo;</dfn></p>
<pre class="brush:php">$route['default_controller'] = '<var>articles</var>';
</pre>
<p>Il vous est possible de passer des segments d&#8217;URL dans vos fonctions :</p>
<pre class="brush:php">example.com/index.php/products/shoes/sandals/123</pre>
<pre class="brush:php">&lt;?php
class Products extends Controller {

function shoes($sandals, $id)
{
echo $sandals;
echo $id;
}
}
?&gt;</pre>
<h3>3°) Les vues CodeIgniter</h3>
<p>Une vue est simplement une page WEB ou un fragment de page WEB. Cette vue est chargée par le contrôleur en relation avec L&#8217;URL</p>
<p>Code HTML &#8211; Exemple du contenu d&#8217;une vue</p>
<pre class="brush:php">code
</pre>
<p>Nous l&#8217;avons vu précédemment, cette vue est chargée par le contrôleur et la fonction qui permet de charger une vue est la suivante :</p>
<pre class="brush:php">&lt;?php
class Blog extends Controller {

 function index()
 {
 $this-&gt;load-&gt;view('blogview');
 }
}
?&gt;</pre>
<p>Il vous est possible de charger plusieurs vues si nécessaire.</p>
<p>Vous pouvez également transférer des données à votre vue depuis votre contrôleur.</p>
<pre class="brush:php"><code>$data = array(
 'title' =&gt; 'My Title',
 'heading' =&gt; 'My Heading',
 'message' =&gt; 'My Message'
 );

 $this-&gt;load-&gt;view('blogview', <var>$data</var>);</code></pre>
<p>ou encore :</p>
<pre class="brush:php">&lt;?php
class Blog extends Controller {

 function index()
 {
 $data['title'] = "My Real Title";
 $data['heading'] = "My Real Heading";

 $this-&gt;load-&gt;view('blogview', $data);
 }
}
?&gt;</pre>
<p>Enfin, CodeIgniter utilise une façon particulière de boucler les données d&#8217;un tableau</p>
<pre class="brush:php">&lt;?php
class Blog extends Controller {

 function index()
 {
 $data['todo_list'] = array('Clean House', 'Call Mom', 'Run Errands');

 $data['title'] = "My Real Title";
 $data['heading'] = "My Real Heading";

 $this-&gt;load-&gt;view('blogview', $data);
 }
}
?&gt;</pre>
<p>Code HTML</p>
<pre class="brush:html">&lt;html&gt;
&lt;head&gt;
&lt;title&gt;&lt;?php echo $title;?&gt;&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;h1&gt;&lt;?php echo $heading;?&gt;&lt;/h1&gt;

&lt;h3&gt;My Todo List&lt;/h3&gt;    

&lt;ul&gt;
&lt;?php foreach($todo_list as $item):?&gt;

&lt;li&gt;&lt;?php echo $item;?&gt;&lt;/li&gt;

&lt;?php endforeach;?&gt;
&lt;/ul&gt;

&lt;/body&gt;
&lt;/html&gt;
</pre>
<p>Vous pouvez si vous le souhaiter utiliser une syntaxe classique.</p>
<h3>4°) Les helpers</h3>
<p>Les helpers sont des bibliothèques de fonctions qui permettent de manipuler des données ; il en existe plusieurs sortes, on peut citer entre autre le helper &laquo;&nbsp;url&nbsp;&raquo; permettant de manipuler les chaines d&#8217;URL ou encore l&#8217;helper &laquo;&nbsp;email&nbsp;&raquo; permettant de manipuler les chaines d&#8217;email.</p>
<p>Il existe différentes façon de charger ces helpers, soit un par un ou via un tableau si vous devez en charger plusieurs. Cette opération est exécutée dans le constructeur de vos models.</p>
<pre class="brush:php">
<pre>class maClass extends Controller{
    function maClass(){
        parent::Controller();
        $this-&gt;load-&gt;helper('url');
        $this-&gt;load-&gt;helper('email');
    }
}</pre>
</pre>
<p>est équivalent à</p>
<pre class="brush:php">class maClass extends Controller{
    function maClass(){
        parent::Controller();
        $this-&gt;load-&gt;helpers(aray('url','email'));
    }
}</pre>
<p>Dans le cadre de mon application, je vais avoir besoin de manipuler différents types de données, voici les helpers que je vais charger :</p>
<pre class="brush:php">function home(){

 //Constructeur
 parent::Controller();

 //Chargement des helpers
 $this-&gt;load-&gt;helpers(
 array(
 'url',
 'email',
 'array',
 'html',
 'date',
 'form'
 ));

 }</pre>
<p>La documentation CodeIgniter étant très bien réalisé, n&#8217;hésitez pas à consulter cette dernière pour en savoir plus sur les helpers.</p>
<h3>5°) URL Rewriting ou comment modifier les URL CodeIgniter</h3>
<p class="info">Note : Cette section impose que votre serveur Apache soit configuré pour accépter &laquo;&nbsp;l&#8217;URL Rewriting&nbsp;&raquo;, si ce n&#8217;est pas le cas, vous devez activer le module d&#8217;URL Rewriting. Si vous souhaitez en savoir plus sur l&#8217;URL Rewriting, voici quelques ressources :</p>
<p class="info"><a title="Site d'informations et de ressources sur l'URL Rewriting" href="http://www.urlrewriting.fr/" target="_blank">http://www.urlrewriting.fr/</a></p>
<p class="info"><a title="Documentation sur les URL CodeIgniter" href="http://codeigniter.com/user_guide/general/urls.html" target="_blank">http://codeigniter.com/user_guide/general/urls.html</a></p>
<p>Comme vous avez pu le remarquer, pour accéder à notre page &laquo;&nbsp;home&nbsp;&raquo;, nous avons une URL de ce type :  http://localhost/crmIgniter/index.php/home/. Nous allons voir comment modifier l&#8217;URL d&#8217;accès et avoir une URL plus propre. Ceci peut être réalisé en utilisant une règle simple,  qui est stocké dans un fichier nommé &laquo;&nbsp;.Htaccess&nbsp;&raquo; .</p>
<p>Ce que  le. Htaccess nous permet de faire, c&#8217;est créer une série de règles. Alors tout  d&#8217;abord, vous devez créer un fichier nommé. Htaccess à la racine de votre application WEB (ou dans le répertoire où vous avez index.php).</p>
<p>Saisissez le code ci-dessous dans votre fichier &laquo;&nbsp;.htaccess&nbsp;&raquo; :</p>
<p>Code du fichier htaccess :</p>
<pre class="brush:plain">DirectoryIndex index.php
RewriteEngine on
RewriteCond $1 !^(index\.php|images|css|js|robots\.txt|favicon\.ico)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ ./index.php/$1 [L,QSA]
</pre>
<p>Quelques explications :</p>
<ul>
<li>On défini l&#8217;index</li>
<li>Activation du moteur de réécriture</li>
<li>Défini les conditions de réécriture</li>
<li>Active les régles de réécriture</li>
</ul>
<p>Vous pouvez tester et entrer l&#8217;URL &laquo;&nbsp;http://localhost/crmIgniter/home/&nbsp;&raquo; dans votre navigateur.</p>
<p>La dernière étape cosniste à modifier notre fichier de configuration et plus particulièrement la section &laquo;&nbsp;$config['index_page'] = &laquo;&nbsp;index.php&nbsp;&raquo;; &#8211; il suffit d&#8217;effacer &laquo;&nbsp;index.pp&nbsp;&raquo; afin de laisser vide la valeur de notre &laquo;&nbsp;index_page&nbsp;&raquo;. Ceci aura pour effet de retirer les &laquo;&nbsp;index.php/&nbsp;&raquo; dans nos liens.</p>
<h3>6°) Création d&#8217;un template CodeIgniter.</h3>
<p>A ce stade, nous devons à chaque chargement de fichier répéter nos en-tête, nos footer&#8230; Ceci n&#8217;est pas très pratique l&#8217;orsque l&#8217;on a l&#8217;habitude d&#8217;utiliser un système de pseudo Frame ou de charger des templates. Nous allons donc créer un système de template.</p>
<p>Etape 1 &#8211; Création du contrôleur principal</p>
<p>Créez un fichier application.php dans votre répertoire contrôleur, ce fichier nous servira de contrôleur principal :</p>
<p>Code du contrôleur principal :</p>
<pre class="brush:php">&lt;?php
class application extends Controller{

//Constructeur
function application(){
parent::Controller();
}

//Function index
function index(){
$this-&gt;load-&gt;view('template');
}
}
</pre>
<p>Vous pouvez ensuite créer la vue principale relative à notre contrôleur, dans notre exemple il s&#8217;agit du fichier template.php :</p>
<p>Code du fichier template.php</p>
<pre class="brush:php">&lt;?php
$this-&gt;load-&gt;view('crmHeader');
$this-&gt;load-&gt;view('crmNav');
$this-&gt;load-&gt;view('crmContent');
$this-&gt;load-&gt;view('crmFooter');
?&gt;
</pre>
<p>Dernière étape, créer les différents blocs qui composent notre template :</p>
<ul>
<li>crmHeader</li>
<li>crmNav</li>
<li>crmContent</li>
<li>crmFooter</li>
</ul>
<p>Code du fichier crmHeader :</p>
<pre class="brush:php">&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8" /&gt;
&lt;title&gt;crmIgniter - CodeIgniter CRM Application&lt;/title&gt;
&lt;meta name="description"
 content="crmIgniter - un CRM réalisé avec le Framework PHP CodeIgniter" /&gt;
 &lt;base href="http://localhost/crmIgniter/" /&gt;
&lt;link href="design/style.css" type="text/css" rel="stylesheet" /&gt;
&lt;link href="js/jQuery/css/ui-lightness/jquery-ui-1.8.2.custom.css"/&gt;
&lt;script type="text/javascript" src="js/jQuery/js/jquery-1.4.2.min.js"&gt;&lt;/script&gt;
&lt;script type="text/javascript" src="js/jQuery/js/jquery-ui-1.8.2.custom.min.js"&gt;&lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;div id="header"&gt;
&lt;h1&gt;crmIgniter&lt;/h1&gt;
&lt;h2&gt;CodeIgniter CRM&lt;/h2&gt;
&lt;/div&gt;</pre>
<p>Code du fichier crmNav</p>
<pre class="brush:php">&lt;div id="crmNav"&gt;
&lt;ul&gt;
 &lt;li&gt;&lt;a href="users" title="Gestion des utilisateurs"&gt;Utilisateurs&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="accounts" title="Gestion des comptes"&gt;Comptes&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="business" title="Gestion des affaires"&gt;Affaires&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;</pre>
<p>Code du fichier crmContent</p>
<pre class="brush:php">&lt;div id="content"&gt;
&lt;h3&gt;Contenu de l'application...&lt;/h3&gt;
&lt;/div&gt;</pre>
<p>Code du fichier crmFooter</p>
<pre class="brush:php">&lt;div id="footer"&gt;
&lt;p&gt;&amp;copy; - openWab &amp;amp; CodeIgniter - crmIgniter 2010 - &lt;a href="mailto:#"&gt;Contact&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>
<p>Vous l&#8217;aurez compris, il n&#8217;y aura plus qu&#8217;à modifier les fichier de contenu (matérialisé ici par le fichier crmContent.php).</p>
<p class="info">Note : Il existe d&#8217;autres méthodes mais j&#8217;ai souhaité vous présenter celle là dans un premier temps afin de vous expliquer la structure du projet. Si vous le souhaitez, il existe une librairie réalisée par un utilisateur de CodeIgniter permettant l&#8217;intégration de vues partielles. Vous pouvez consulter les informations relatives à cette librairie sur le Forum de CodeIgniter : <a title="Librairie CodeIgniter partial view - Forum CodeIgniter" href="http://codeigniter.com/forums/viewthread/62366/" target="_blank">http://codeigniter.com/forums/viewthread/62366/</a></p>
<p>Voici le résultat en image (figure 4.6.1):</p>
<div id="attachment_646" class="wp-caption alignnone" style="width: 310px"><img class="size-medium wp-image-646" title="4.6.1-ci-Interface principale crmIgniter" src="http://sldesign.openwab.com/wp-content/uploads/2010/07/4.6.1-ci-main-users-interface-300x176.jpg" alt="Interface principale crmIgniter" width="300" height="176" /><p class="wp-caption-text">Figure 4.6.1 - Interface principale crmIgniter</p></div>
<h3>7°) Syntaxe alternative des vues</h3>
<p>CodeIgniter vous permet d&#8217;utiliser une syntaxe alternative dans vos vues en lieu et place du &laquo;&nbsp;&lt;?php echo [variable ou fonction]; ?&gt;</p>
<p>Vous pouvez utiliser la syntaxe suivante :</p>
<pre class="brush:php">&lt;?=$variable?&gt;
</pre>
<p class="info">Note : Avant de pouvoir utiliser cette fonction, il est nécessaire d&#8217;activer les &laquo;&nbsp;Short tag&nbsp;&raquo; dans le php.ini.</p>
<pre class="brush:php">&lt;?=$variable?&gt;
</pre>
<p>D&#8217;autres syntaxes sont disponibles notamment en ce qui concerne les structures de contrôle</p>
<pre class="brush:php"><code>&lt;ul&gt;

 <var>&lt;?php foreach($todo as $item): ?&gt;</var>

 &lt;li&gt;<var>&lt;?=$item?&gt;</var>&lt;/li&gt;

 <var>&lt;?php endforeach; ?&gt;</var>

 &lt;/ul&gt;</code></pre>
<p>Reportez-vous à la documentation si vous souhaitez utiliser les syntaxes courtes : <a title="Documentation des syntaxes alternatives CodeIgniter" href="http://codeigniter.com/user_guide/general/alternative_php.html" target="_blank">http://codeigniter.com/user_guide/general/alternative_php.html</a></p>
<h3>8°) Notre module Utilisateurs</h3>
<p>Nous allons dans cette section créer notre premier module. Nous nous intéresserons au module utilisateurs qui permet entre autre de lister, créer ou modifier les utilisateurs.</p>
<h4>Étape 1 &#8211; Création du contrôleur et des vues</h4>
<p>Dans votre dossier contrôleur, créez un fichier &laquo;&nbsp;users.php&nbsp;&raquo;, ce sera notre contrôleur principal dont voici le code :</p>
<pre class="brush:php">&lt;?php
class users extends Controller{

 function users(){
 parent::Controller();

 }

 function index(){
 $this-&gt;load-&gt;view('users_module');
 }
}</pre>
<p>Rien de spécifique, ce module va simplement charger la vue &laquo;&nbsp;users_module&nbsp;&raquo; que nous allons créer. Cette vue va simplement lister les actions pouvant être executées.</p>
<pre class="brush:php">&lt;?php
$this-&gt;load-&gt;view('crmHeader');
$this-&gt;load-&gt;view('crmNav');
?&gt;
&lt;div id="content"&gt;
&lt;a href="users/add_user/" title="nouvel utilisateur"&gt;Nouvel utilisateur&lt;/a&gt;
&lt;a href="users/list_users/" title="Liste des utilisateurs"&gt;Liste des utilisateurs&lt;/a&gt;
&lt;/div&gt;
&lt;?php
$this-&gt;load-&gt;view('crmFooter');
?&gt;</pre>
<p>Nous allons maintenant modifier notre contrôleur en y ajoutant une fonction &laquo;&nbsp;add_user&nbsp;&raquo; :</p>
<pre class="brush:php">&lt;?php
class users extends Controller{

 function users(){
 parent::Controller();

 }

 function index(){
 $this-&gt;load-&gt;view('users_module');
 }

 function add_user(){
 $this-&gt;load-&gt;view('user_add_new');
 }
}</pre>
<p>Créez maintenant la vue &laquo;&nbsp;user_add_new&nbsp;&raquo;</p>
<p>Code du fichier user_add_new.php :</p>
<pre class="brush:php">&lt;?php
$this-&gt;load-&gt;view('crmHeader');
$this-&gt;load-&gt;view('crmNav');
?&gt;
&lt;h3&gt;Nouvel utilisateur::&lt;/h3&gt;
&lt;p&gt;Cette interface vous permet d'ajouter un nouvel utilisateur&lt;/p&gt;
&lt;p&gt;&lt;a href="users/"&gt;retour&lt;/a&gt;&lt;/p&gt;
&lt;?php
$this-&gt;load-&gt;view('crmFooter');
?&gt;</pre>
<p>Cliquez sur le lien &laquo;&nbsp;Nouvel utilisateur&nbsp;&raquo; et vous devriez voir notre nouvelle vue.</p>
<p>Vous pouvez réaliser les mêmes opération pour la vue &laquo;&nbsp;list_users&nbsp;&raquo; ; vous trouverez ci-dessous les différents codes dont notre contrôleur complet.</p>
<pre class="brush:php">&lt;?php
class users extends Controller{

 function users(){
 parent::Controller();

 }

 //Fonction index chargeant la vue par défaut
 function index(){
 $this-&gt;load-&gt;view('users_module');
 }

 //Fonction add_user permettant d'ajouter un utilisateur
 function add_user(){
 $this-&gt;load-&gt;view('user_add_new');
 }

 //Fonction list_user listant les utilisateurs
 function list_users(){
 $this-&gt;load-&gt;view('users_list');
 }

 //Fonction update_user pour modifier un utilisateur
 function update_user(){
 $this-&gt;load-&gt;view('user_update');
 }

 //Fonction user_delete supression d'un utilisateur
 function delete_user(){
 $this-&gt;load-&gt;view('user_delete');
 }
}</pre>
<h4>Etape 2 &#8211; Création du formulaire d&#8217;ajout d&#8217;utilisateur</h4>
<p>Ouvrez votre fichier user_add_new.php, nous allons réaliser notre formulaire d&#8217;ajout de données puis réaliser l&#8217;enregistrement dans notre base de données :</p>
<p>Avant toute chose, veillez à charger les helper &laquo;&nbsp;Form&nbsp;&raquo; ; ce helper permet la manipulation de formulaires.Ce helper vous permet entre autre de générer des formulaires et des champs de formulaires. Vous trouverez ci-dessous le code de notre fichier &laquo;&nbsp;user_add_new&nbsp;&raquo; :</p>
<pre class="brush:php;first-line:7">&lt;?php
//Initialisation des attributs du formulaire
$formAtt = array('id'=&gt;'add_user','class'=&gt;'standardForm');

//Overture du formulaire
echo form_open("",$formAtt);

//Ajout d'un champ hidden
echo form_hidden("id",'');

//Labels + Champs de type texte
echo form_label("Nom d'utilisateur : ");
echo form_input('username');
echo form_label("Mot de passe : ");
echo form_input('password');

//Initialisation des valeurs d'un dropdown (select)
$titles = array(
 'Madame'=&gt;'Madame',
 'Mademoiselle'=&gt;'Mademoiselle',
 'Monsieur'=&gt;'Monsieur'
);
echo form_label("Civilité : ");
echo form_dropdown("title",$titles);

echo form_label("Nom : ");
echo form_input('name');
echo form_label("Prénom : ");
echo form_input('subname');
echo form_label("Email : ");
echo form_input('mail');
echo form_label("Fonction : ");
echo form_input('role');

//Génération du bouton submit
echo form_submit("add_user","Enregistrer");

//Fermeture du formulaire
echo form_close()
?&gt;</pre>
<p>Voici le code HTML généré par l&#8217;utilisation du helper et des fonctions qui y sont liées :</p>
<p>Code HTLM généré :</p>
<pre class="brush:html">&lt;form action="http://localhost/crmIgniter/" method="post" id="add_user"
 class="standardForm"&gt;
&lt;input type="hidden" name="id" value="" /&gt;
&lt;label&gt;Nom d'utilisateur : &lt;/label&gt;
&lt;input type="text" name="username" value="" /&gt;
&lt;label&gt;Mot de passe : &lt;/label&gt;&lt;input type="text" name="password" value="" /&gt;
&lt;label&gt;Civilité: &lt;/label&gt;
&lt;select name="title"&gt;
 &lt;option value="Madame"&gt;Madame&lt;/option&gt;
 &lt;option value="Mademoiselle"&gt;Mademoiselle&lt;/option&gt;
 &lt;option value="Monsieur"&gt;Monsieur&lt;/option&gt;
&lt;/select&gt;
&lt;label&gt;Nom : &lt;/label&gt;
&lt;input type="text" name="name" value="" /&gt;
&lt;label&gt;Prénom: &lt;/label&gt;
&lt;input type="text" name="subname" value="" /&gt;
&lt;label&gt;Email : &lt;/label&gt;&lt;input type="text" name="mail" value="" /&gt;
&lt;label&gt;Fonction : &lt;/label&gt;
&lt;input type="text" name="role" value="" /&gt;
&lt;input type="submit" name="add_user" value="Enregistrer" /&gt;
&lt;/form&gt;</pre>
<p class="info">Note : Je n&#8217;ai pas testé l&#8217;efficacité de ce helper en terme de performance mais son utilisation peut faire gagner un peu de temps en terme de développement.</p>
<p>Voici le résultat en image (Figure 4.8.1) :</p>
<div id="attachment_647" class="wp-caption alignnone" style="width: 205px"><img class="size-medium wp-image-647" title="CodeIgniter - Formulaire ajout d'un utilisateur" src="http://sldesign.openwab.com/wp-content/uploads/2010/07/4.8.1-ci-formulaire-add-new-user-195x300.jpg" alt="CodeIgniter - Formulaire ajout d'un utilisateur" width="195" height="300" /><p class="wp-caption-text">Figure 4.8.1 - Formulaire ajout d&#39;un utilisateur </p></div>
<h4>Étape 3 &#8211; Traitement du formulaire</h4>
<p>Reste à récupérer les données et à les insérer dans notre formulaire. Pour cela, nous allons utilise la class &laquo;&nbsp;database&nbsp;&raquo;, il est don cnecessaire de l&#8217;initialiser dans notre contrôleur :</p>
<pre class="brush:php">//Chargement de la class database
$this-&gt;load-&gt;database();
</pre>
<p>Ensuite, nous pouvons l&#8217;utiliser simplement en stockant les données de notre formulaire dans un tableau :</p>
<pre class="brush:php;first-line:47">&lt;?php
//Traitement des données du formulaire

//Récupération des variables post
if(isset($_POST['add_user'])){
 $newUser = array(
 'id'=&gt;$_POST['id'],
 'username'=&gt;$_POST['username'],
 'password'=&gt;sha1($_POST['password']),
 'title'=&gt;$_POST['title'],
 'name'=&gt;$_POST['name'],
 'subname'=&gt;$_POST['subname'],
 'mail'=&gt;$_POST['mail'],
 'role'=&gt;$_POST['role']
 );
 //Insert
 $this-&gt;db-&gt;insert('users', $newUser); 

 echo '&lt;p&gt;Enregistrement inséré&lt;/p&gt;';
}

?&gt;</pre>
<h4>Etape 4 &#8211; Lister des données</h4>
<p>Comme vous avez pu le voir, les opérations sur les bases de données sont facilité avec l&#8217;utilisation de cette class. Nous allons voir comment lister des données provenant de notre base de données. Pour cela, nous utiliserons la class &laquo;&nbsp;pagination&nbsp;&raquo;, cette class permet de générer facilement des pages de résultats et une navigation entre ses pages.</p>
<p>La première étape consiste à initialiser nos bibliothèque. Voici le code du Contrôleur &laquo;&nbsp;users&nbsp;&raquo; dans lequel j&#8217;ai initialiser deux librairies. La librairie &laquo;&nbsp;pagination&nbsp;&raquo; pour naviguer entre les pages et la librairie &laquo;&nbsp;table&nbsp;&raquo; qui va nous permettre d&#8217;afficher nos résultats dans un tableau.</p>
<pre class="brush:php;first-line:21;">//Chargement de la librairie pagination
 $this-&gt;load-&gt;library('pagination');

 //Chargement de la librairie table
 $this-&gt;load-&gt;library('table');</pre>
<p>Une fois ses paramètres initialisés, nous pouvons les utiliser à travers différentes méthodes et options. Vous trouverez ci-dessous le code de notre fonction &laquo;&nbsp;users_list()&nbsp;&raquo; de notre contrôleur &laquo;&nbsp;users&nbsp;&raquo;.</p>
<pre class="brush:php;first-line:33;">//Fonction list_user listant les utilisateurs
 function list_users(){

 //Chargement de la librairie table
 $this-&gt;load-&gt;library('table');

 //Chargement de la librairie pagination
 $this-&gt;load-&gt;library('pagination');

 //Défini l'URL de base
 $config['base_url'] = 'http://localhost/crmIgniter/users/list_users/';

 //Initialise le nombre total d'enregistrements
 $config['total_rows'] = $this-&gt;db-&gt;get('users')-&gt;num_rows();

 //Initialise le nombre d'enregistrements à afficher par page
 $config['per_page'] = '10';
 $config['num_links'] = '10';
 $config['full_tag_open'] = '&lt;p&gt;';
 $config['full_tag_close'] = '&lt;/p&gt;';

 //Initialisation de notre pagination
 $this-&gt;pagination-&gt;initialize($config);        

 //Execution de la requête - Voir documentation http://codeigniter.com/user_guide/database/active_record.html
 $this-&gt;db-&gt;select('id,title,name,subname,mail');
 $data['records'] = $this-&gt;db-&gt;get('users',$config['per_page'],$this-&gt;uri-&gt;segment(3));

 //Chargement de la vue et transfert des données à notre vue
 $this-&gt;load-&gt;view('users_list',$data);

 }</pre>
<p><span style="text-decoration: underline;"><strong>Quelques explication :</strong></span></p>
<ol>
<li><strong>Chargement de nos librairies.</strong>
<ol>
<li>L&#8217;url sert à indiquer au script après quels éléments il devra insérer le numéro d&#8217;enregistrement</li>
<li>On récupére le nombre total d&#8217;enregistrement afin de calculer le nombre de page</li>
<li>On configure le nombre d&#8217;enregistrement par page</li>
<li>On  configure le nombre maximum de liens à afficher</li>
<li>On configure les balises qui engloberons nos liens de pagination</li>
<li>Initialisation globale de notre pagination</li>
</ol>
</li>
<li><strong>Exécution de la requête</strong></li>
<li><strong>Chargement de la vue</strong></li>
</ol>
<p>Il ne reste plus qu&#8217;à exécuter cela dans notre vue, ouvrez votre vue &laquo;&nbsp;users_list.php&nbsp;&raquo; et éditez le code comme ci-dessous</p>
<pre class="brush:php">&lt;?php
$this-&gt;load-&gt;view('crmHeader');
$this-&gt;load-&gt;view('crmNav');
?&gt;
&lt;h3&gt;Liste des utilisateurs::&lt;/h3&gt;
&lt;div&gt;
&lt;?php

//Initialisation des en-tête de notre tableau
echo $this-&gt;table-&gt;set_heading('ID','Titre','Nom','Prénom','Email');

//Initialisation de notre tableau
echo $this-&gt;table-&gt;generate($records);//Données récupérées de $data['records'] du contrôleur

//Initialisation de la pagination
echo $this-&gt;pagination-&gt;create_links();

?&gt;
&lt;/div&gt;
&lt;?php
$this-&gt;load-&gt;view('crmFooter');
?&gt;</pre>
<p><span style="text-decoration: underline;"><strong>Quelques explications : </strong></span></p>
<ol>
<li>Chargement de notre template</li>
<li>Initialisation des en-têtes de notre tableau set_heading()</li>
<li>Initialisation du tableau</li>
<li>Initialisation de la pagination</li>
<li>Chargement du footer</li>
</ol>
<p>Nous pouvons maintenant afficher nos résultats. Le tableau n&#8217;est pas  mis en forme mais vous pouvez déjà naviguer dans votre tableau. Reste à  appliquer un beau CSS à notre table.</p>
<p>Vous trouverez en figure 4.8.2 le résultat obtenu :</p>
<div id="attachment_648" class="wp-caption alignnone" style="width: 588px"><a href="http://sldesign.openwab.com/wp-content/uploads/2010/07/4.8.2-ci-pagination-resultat-1.jpg"><img class="size-full wp-image-648" title="Table et pagination CodeIgniter" src="http://sldesign.openwab.com/wp-content/uploads/2010/07/4.8.2-ci-pagination-resultat-1.jpg" alt="Tableau et pagination générés avec la class HTML Table et pagination de CodeIgniter" width="578" height="365" /></a><p class="wp-caption-text">Figure 4.8.2 - Tableau et pagination générés avec la class HTML Table et pagination de CodeIgniter</p></div>
<h4>Etape 5 &#8211; Modification  d&#8217;enregistrement</h4>
<p>Nous allons voir ici comment modifier un  enregistrement mais avant cela, nous allons voir comment récupérer nos résultats sans l&#8217;utilisation de la Class &laquo;&nbsp;htm_table&nbsp;&raquo;.</p>
<p>Dans notre contrôleur &laquo;&nbsp;users.php&nbsp;&raquo;, nous avons une fonction permettant de récupérer les résultats de notre et nous les passons dans notre vue à l&#8217;aide de la variable $data['records']. Nous allons utiliser ces données pour créer un tableau.</p>
<pre class="brush:php;first-line:53">//Execution de la requête - Voir documentation http://codeigniter.com/user_guide/database/active_record.html
$this-&gt;db-&gt;select('id,title,name,subname,mail');
$data['records'] = $this-&gt;db-&gt;get('users',$config['per_page'],$this-&gt;uri-&gt;segment(3));
</pre>
<p>Dans un premier temps, nous allons initialiser les données dans notre vue puis boucler les résultats.</p>
<p>Voici le code de notre vue users_list.php:</p>
<pre class="brush:php">&lt;?php
$this-&gt;load-&gt;view('crmHeader');
$this-&gt;load-&gt;view('crmNav');
?&gt;
&lt;h3&gt;Liste des utilisateurs::&lt;/h3&gt;
&lt;div&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;ID&lt;/th&gt;
 &lt;th&gt;Titre&lt;/th&gt;
 &lt;th&gt;Nom&lt;/th&gt;
 &lt;th&gt;Prénom&lt;/th&gt;
 &lt;th&gt;Mail&lt;/th&gt;
 &lt;th&gt;Options&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;?php
 //Récupération des enregitrements sous forme de tableau
 $rows = $records-&gt;result_array();

 //Boucle les enregistrements et création du lien de modification
 foreach($rows as $k =&gt; $v){
 echo "&lt;tr&gt;
 &lt;td&gt;$v[id]&lt;/td&gt;
 &lt;td&gt;$v[title]&lt;/td&gt;
 &lt;td&gt;$v[name]&lt;/td&gt;
 &lt;td&gt;$v[subname]&lt;/td&gt;
 &lt;td&gt;$v[mail]&lt;/td&gt;
 &lt;td&gt;&lt;a id=\"$v[id]\" class=\"updateRecord\" href=\"users/update_user/$v[id]\" title=\"Modifier l'enregistrement\"&gt;Modifier&lt;/a&gt;&lt;/td&gt;
 &lt;/tr&gt;";
 }
 ?&gt;
 &lt;/tbody&gt;
 &lt;tfoot&gt;
 &lt;tr&gt;
 &lt;td colspan="6"&gt;&lt;?php
 echo $this-&gt;pagination-&gt;create_links();
 ?&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tfoot&gt;
&lt;/table&gt;
&lt;/div&gt;
 &lt;?php

 $this-&gt;load-&gt;view('crmFooter');
 ?&gt;

&lt;script type="text/javascript"&gt;
$("tr:odd").css('background','#f5f5f5');
&lt;/script&gt;</pre>
<p>Notre tableau est maintenant créé et nous pouvons naviguer entre les différentes pages. J&#8217;ai ajouté une nouvelle colonne &laquo;&nbsp;Options&nbsp;&raquo; qui me permet d&#8217;effectuer des actions en cliquant sur un lien. Ici, c&#8217;est un lien qui déclenchera ma fonction &#8216;update_user&#8217; et qui est suivi de l&#8217;identifiant (figure 4.8.3).</p>
<div id="attachment_649" class="wp-caption alignnone" style="width: 590px"><img class="size-full wp-image-649" title="CodeIgniter - Figure 4.8.3 - Table de mise à jour de données" src="http://sldesign.openwab.com/wp-content/uploads/2010/07/4.8.3-ci-new-table-update-user.jpg" alt="Table de mise à jour de données" width="580" height="568" /><p class="wp-caption-text">Figure 4.8.3 - Table de mise à jour de données</p></div>
<p>La structure d&#8217;une URL CodeIgniter est la suivante :</p>
<p>&laquo;&nbsp;example.com/class/function/ID&nbsp;&raquo;</p>
<p>Créez une nouvelle vue &laquo;&nbsp;user_update.php&nbsp;&raquo; et placez y le code suivant :</p>
<pre class="brush:php">&lt;?php
$this-&gt;load-&gt;view('crmHeader');
$this-&gt;load-&gt;view('crmNav');
?&gt;
&lt;h3&gt;Mise à jour d'un utilisateur&lt;/h3&gt;

&lt;?php
$this-&gt;load-&gt;view('crmFooter');
?&gt;</pre>
<p>En cliquant sur le lien vous devriez lancer la vue &laquo;&nbsp;user_update.php&nbsp;&raquo;.</p>
<p>Il ne reste plus qu&#8217;à créer notre formulaire de modification, pour cela, nous allons utiliser la class &laquo;&nbsp;database&nbsp;&raquo;. Voici étape par étape les opérations à réaliser :</p>
<p>Récupéré l&#8217;ID de notre enregistrement à modifier</p>
<p>Exécuter la requête nous permettant de récupérer l&#8217;enregistrement souhaité</p>
<p>Générer le formulaire</p>
<p>Envoyer et traiter le formulaire pour mise à jour de la base de données</p>
<p>Commençons&#8230;</p>
<p>Nous devons récupérer l&#8217;ID de l&#8217;enregistrement ; rappelez-vous, dans le script précédent, celui qui affiche la liste des utilisateurs, nous avons généré des liens qui passent l&#8217;ID de l&#8217;utilisateur dans l&#8217;URL :</p>
<pre class="brush:html">&lt;a id=\$v[id]\" class=\"updateRecord\" href=\"users/update_user/$v[id]\" title=\"Modifier l'enregistrement\"&gt;Modifier&lt;/a&gt;</pre>
<p>Notre URL après avoir cliqué sur un lien ressemblera donc à cela :</p>
<pre class="brush:text">http://localhost/crmIgniter/users/update_user/10
</pre>
<p>Rappelons nous la structure de notre URL :</p>
<pre class="brush:text">http://localhost/crmIgniter/[Class]/[Fonction]/[ID]</pre>
<p>Pour récupérer notre ID, nous allons utiliser la class &laquo;&nbsp;URI Class&nbsp;&raquo; qui permet de manipuler nos chaines d&#8217;URL et ce que nous pouvons appeler des &laquo;&nbsp;Segments&nbsp;&raquo;. Cette class met à notre disposition une fonction &laquo;&nbsp;uri-&gt;segment()&nbsp;&raquo; ; Cette fonction attend en paramètre le N° de segment que vous souhaitez récupérer.</p>
<p>Que se passe t&#8217;il si dans mon fichier &laquo;&nbsp;user_update.php&nbsp;&raquo; je met le code suivant ?</p>
<pre class="brush:php">code//Récupération de l'ID
$id = $this-&gt;uri-&gt;segment(3);
echo $id;</pre>
<p>Et bien j&#8217;affiche le Segment correspondant à mon ID soit l&#8217;ID à récupérer <img src='http://sldesign.openwab.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Maintenant que nous avons récupérer notre ID, il ne nous reste plus qu&#8217;à récupérer les données de notre table. Pour cela nous utiliserons Activ_record.  CodeIgniter utilise une version modifiée de la class &laquo;&nbsp;activ_record&nbsp;&raquo;. activ_record est un model d&#8217;accès et de traitement des bases de données permettant de manipuler les données.</p>
<p>Pour modifier un enregistrement la fonction est la suivant &laquo;&nbsp;$this-&gt;db-&gt;update([table],[données]);</p>
<p>Vous trouverez ci-dessous le code commenté de notre fichier user_update.php.</p>
<pre class="brush:php">&lt;?php
$this-&gt;load-&gt;view('crmHeader');
$this-&gt;load-&gt;view('crmNav');
?&gt;
&lt;h3&gt;Mise à jour d'un utilisateur&lt;/h3&gt;
&lt;div&gt;&lt;?php
//Récupération de l'ID
$id = $this-&gt;uri-&gt;segment(3);
echo "Id actif : $id&lt;br/&gt;";
$query = $this-&gt;db-&gt;get_where('users', array('id' =&gt; $id));
$activUser = $query-&gt;result_array();
$activUser = $activUser[0];
echo '&lt;pre&gt;'."\n";
print_r($activUser);
echo '&lt;/pre&gt;'."\n";

/**
 * Ici commence le formulaire
 * On utilise le form helper pour générer le formulaire +
 * les inputs
 */
echo form_open('users/update_user/'.$id);
echo form_label('Nom d\'utilisateur : ');
echo form_input('username',$activUser['username']);
echo form_label('Civilié : ');
$options = array();
echo form_dropdown('title',array('Madame'=&gt;'Madame','Mademoiselle'=&gt;'Mademoiselle','Monsieur'=&gt;'Monsieur'),$activUser['title']);
echo form_label('Nom : ');
echo form_input('name',$activUser['name']);
echo form_label('Prénom : ');
echo form_input('subname',$activUser['subname']);
echo form_label('Email : ');
//Un tableau permettant de passer des attributs à notre input
$mailData = array(
 'name'        =&gt; 'mail',
 'id'          =&gt; 'mail',
 'value'       =&gt; $activUser['mail'],
 'maxlength'   =&gt; '200',
 'size'        =&gt; '50',
 'style'       =&gt; 'width:300px'
);
echo form_input($mailData);
echo form_submit('update_user','Enregistrer les modifications');
echo form_close();

/**
 * Récupération des données - Traitement du formulaire
 */
if(isset($_POST['update_user'])){
 echo "Formulaire soumis :: Traitement de la mise à jour...&lt;br/&gt;";
 //Passage des données récupérées dans un tableau
 $data = array(
 'username' =&gt; $_POST['username'],
 'title' =&gt; $_POST['title'],
 'name' =&gt; $_POST['name'],
 'subname' =&gt; $_POST['subname'],
 'mail' =&gt; $_POST['mail']
 );
 //Sélection de l'enregistrement à modifier
 $this-&gt;db-&gt;where('id',$id);
 //Modification de l'enregistrement
 $this-&gt;db-&gt;update('users',$data);
}
?&gt;
&lt;/div&gt;
&lt;?php
$this-&gt;load-&gt;view('crmFooter');
?&gt;
</pre>
<p>Les figures ci-dessous vous montre en image les actions réalisées (Figures 4.8.4, 4.8.5, 4.6).</p>
<div id="attachment_651" class="wp-caption alignnone" style="width: 366px"><img class="size-full wp-image-651" title="CodeIgniter - Formulaire de mise à jour utilisateur" src="http://sldesign.openwab.com/wp-content/uploads/2010/07/4.8.4-ci-update-form.jpg" alt="Formulaire de mise à jour utilisateur" width="356" height="475" /><p class="wp-caption-text">Figure 4.8.4 - Formulaire de mise à jour utilisateur</p></div>
<div id="attachment_652" class="wp-caption alignnone" style="width: 603px"><img class="size-full wp-image-652" title="CodeIgniter - Base de données avant la mise à jour" src="http://sldesign.openwab.com/wp-content/uploads/2010/07/4.8.5-ci-db-before-update.jpg" alt="Base de données avant la mise à jour" width="593" height="287" /><p class="wp-caption-text">Figure 4.8.5 - Base de données avant la mise à jour</p></div>
<div id="attachment_653" class="wp-caption alignnone" style="width: 627px"><img class="size-full wp-image-653 " title="CodeIgniter - Base de données après la mise à jour" src="http://sldesign.openwab.com/wp-content/uploads/2010/07/4.8.6-ci-db-after-update.jpg" alt="Base de données après la mise à jour" width="617" height="294" /><p class="wp-caption-text">Figure 4.8.7 - Base de données après la mise à jour</p></div>
<h4>Étape 6 &#8211; Suppression d&#8217;un enregistrement</h4>
<p>La suppression d&#8217;un enregistrement suivra le même chemin à la différence prêt que nous utiliserons la fonction &laquo;&nbsp;<code>$this-&gt;db-&gt;delete('mytable', array('id' =&gt; $id));" de la class activ_record.</code></p>
<p>Il suffit pour cela d&#8217;ajouter un lien de suppression à notre liste d&#8217;utilisateurs et d&#8217;y lier encore une fois l&#8217;ID de l&#8217;utilisateur. Le lien pointera sur la fontion &laquo;&nbsp;delete_user()&nbsp;&raquo; de notre contrôleur.</p>
<pre class="brush:php">&lt;a id=\$v[id]\" class=\"deleteRecord\" href=\"users/delete_user/$v[id]\" title=\"Supprimer l'enregistrement\"&gt;Supprimer&lt;/a&gt;</pre>
<p>Notre vue contiendra simplement notre fonction de suppression :</p>
<pre class="brush:php">&lt;?php
$this-&gt;load-&gt;view('crmHeader');
$this-&gt;load-&gt;view('crmNav');
?&gt;
&lt;h3&gt;Supression d'un utilisateur : &lt;/h3&gt;
&lt;?php
$id = $this-&gt;uri-&gt;segment(3);
if(isset($_POST['confirm_delete'])){
 $this-&gt;db-&gt;delete('users', array('id' =&gt; $id));
 echo "&lt;p class=\"confirm\"&gt;L'enregsitrement N° $id a bien été supprimé ! &lt;/p&gt;\n";
}else{
 ?&gt;
 &lt;!-- Formulaire --&gt;
 &lt;form action="" method="post"&gt;
 &lt;p&gt;Etes vous sur de vouloir supprimer l'enregistrement N° &lt;?=$id?&gt; de la table utilisateurs ?&lt;/p&gt;
 &lt;input type="submit" name="confirm_delete" value="Confirmer"/&gt;
 &lt;/form&gt;
 &lt;?php
}
?&gt;
&lt;?php
$this-&gt;load-&gt;view('crmFooter');
?&gt;</pre>
<h2>V &#8211; Conclusion</h2>
<p>Vous venez de voir comment utiliser dans les grandes lignes le Framework CodeIgniter. En conclusion on peut remarquer différents points forts :</p>
<ul>
<li>L&#8217;utilisation du model MVC</li>
<li>Des class et des helpers facilitant grandement le développement d&#8217;application WEB</li>
<li>Une documentation riche</li>
<li>La facilité d&#8217;intégrer ses propres librairies et extensions</li>
</ul>
<p>CodeIgniter est donc un Framework très intéressant ne demandant pas un trop long apprentissage.</p>
<h2>VI &#8211; Ressources</h2>
<h3>Applications développées avec CodeIgniter</h3>
<p><a title="Site du script 68KB" href="http://68kb.com/" target="_blank">68KB &#8211; Script de base de données de connaissances</a></p>
<p><a title="Site de BackendPro Control Panel" href="http://www.kaydoo.co.uk/projects/backendpro" target="_blank">BackendPro Control Panel </a>: Application permettant de gérer la partie administration d&#8217;un site ou d&#8217;une application</p>
<p><a title="Site internet de Blogmer" href="http://speedovation.org/home" target="_blank">Blogmer</a> : Blog script qui se veut simple d&#8217;utilisation et convivial et dont les fonctions sont essentielles</p>
<p><a title="Site De Ionize CMS" href="http://www.ionize-cms.com/" target="_blank">Ionize CMS</a> : Un puissant gestionnaire de contenu réalisé avec CodeIgniter</p>
<h3>Sites développés avec CodeIgniter</h3>
<p>Vous trouverez la liste des sites réalisés avec CodeIgniter à l&#8217;adresse suivante : <a title="Liste des site développés sous CodeIgniter" href="http://codeigniter.com/projects/" target="_blank">http://codeigniter.com/projects/</a></p>
<h3>Documentation &amp; Tutoriels</h3>
<p>Documentation principale : <a title="Guide d'utilisation CodeIgniter" href="http://codeigniter.com/user_guide/" target="_blank">http://codeigniter.com/user_guide/</a></p>
<p>Tutoriels Vidéo : <a title="Tutoriaux CodeIgniter" href="http://codeigniter.com/tutorials/" target="_blank">http://codeigniter.com/tutorials/</a></p>
<p>Wiki : <a title="Wiki CodeIgniter" href="http://codeigniter.com/wiki/" target="_blank">http://codeigniter.com/wiki/</a></p>
<p>Ressource CodeIgniter : <a title="Base de connaissance et resoources CodeIgniter" href="http://codeigniterdirectory.com/" target="_blank">http://codeigniterdirectory.com/</a></p>
<p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save"><img src="http://sldesign.openwab.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a> </p>]]></content:encoded>
			<wfw:commentRss>http://sldesign.openwab.com/2010/07/20/codeigniter-tutorial-introduction-et-premiere-application/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>

