<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
	<title>Ecyseo</title>
	<link>http://www.ecyseo.net/</link>
	<language>fr</language>
	<description>Time is train make the future the past...</description>
<atom:link xmlns:atom="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://www.ecyseo.net/feed.php" />
	<lastBuildDate>Tue, 15 May 2012 02:10:00 +0200</lastBuildDate>
	<generator>PluXml</generator>
	<item>
		<title>Dropcenter</title> 
		<link>http://www.ecyseo.net/article15/dropcenter</link>
		<guid>http://www.ecyseo.net/article15/dropcenter</guid>
		<description>&lt;div style=&quot;float:right&quot;&gt;&lt;img src=&quot;http://www.ecyseo.net/data/images/site/dropcenter.png&quot; alt=&quot;&quot; height=&quot;35&quot; width=&quot;120&quot; /&gt;&lt;/div&gt; Vous rêvez de partager vos fichiers avec vos amis et vous voulez être maître de vos données ? Découvrez &lt;a href=&quot;http://dropcenter.fr/&quot; title=&quot;Dropcenter...&quot; onclick=&quot;window.open(this.href);return false;&quot;&gt;Dropcenter...&lt;/a&gt;&lt;h2&gt;Présentation&lt;/h2&gt;&lt;p&gt;Développée par Idleman et Fox, Dropcenter est une application sans prétention mais qui vaut le coup d&#039;être découverte et utilisée.&lt;/p&gt;&lt;p&gt;Encore en développement (V1.0) mais ayant passé avec succès la phase Béta, Dropcenter ne cesse d&#039;évoluer.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;L&#039;équipe est très réactive et pleine d&#039;humour comme le prouve les fortunes de Chuck Norris, notre maître à tous !&lt;/p&gt;&lt;br /&gt;&lt;div style=&quot;margin-left: 40px;&quot;&gt;&lt;em&gt;Chuck Norris est capable de faire échec et mat en jouant aux Dames.&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;p&gt;est une des nombreuses citations qui s&#039;affichent à chaque rafraichissement de la page. Je rassure ceux qui veulent cacher leur dévotion à Chuck : l&#039;affichage de ces petites bouffées d&#039;oxygène est paramétrable pour une utilisation plus professionnelle.&lt;/p&gt;&lt;h2&gt;Mais Dropcenter, c&#039;est quoi ?&lt;/h2&gt;&lt;h2 style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;http://www.ecyseo.net/data/images/site/screenshot_dropcenter.png&quot; class=&quot;zoombox&quot;&gt;&lt;img src=&quot;http://www.ecyseo.net/data/images/site/screenshot_dropcenter.tb.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;C&#039;est un petit script autohébergé qui suit le principe KISS (Keep It Simple Stupid) et qui le suit bien. Il permet de mettre à disposition sur le net des fichiers de toutes sortes.&lt;/p&gt;&lt;p&gt;L&#039;application dispose d&#039;un uploader multi-options :&lt;/p&gt;&lt;ul&gt;&lt;li&gt;drag &#039;n&#039; drop pour les navigateurs récents&lt;/li&gt;&lt;li&gt;possibilité de charger un fichier via une adresse internet&lt;/li&gt;&lt;li&gt;formulaire html basique pour les vieux navigateurs&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Une application annexe, &lt;strong&gt;DropNews&lt;/strong&gt;, disponible sur Windows et Linux, permet en prime de suivre l&#039;activité du Dropcenter.&lt;br /&gt;&lt;/p&gt;&lt;h2&gt;On peut pas test ?&lt;/h2&gt;&lt;p&gt;Mais bien sûr qu&#039;on peut. Il suffit de &lt;a href=&quot;http://dropcenter.fr/demo/index.php&quot; title=&quot;se rendre sur la page de démo&quot; onclick=&quot;window.open(this.href);return false;&quot;&gt;se rendre sur la page de démo&lt;/a&gt;  et de suivre le peu d&#039;instructions nécessaire. Même Madame Michou du Calvados peut s&#039;en servir tellement c&#039;est intuitif.&lt;/p&gt;&lt;h2&gt;Conclusion&lt;/h2&gt;&lt;p&gt;Utilisez sans modération cette petite application qui mérite qu&#039;on s&#039;y attarde.&lt;br /&gt;&lt;/p&gt;</description>
		<pubDate>Tue, 15 May 2012 02:10:00 +0200</pubDate>
		<dc:creator>Cyril MAGUIRE</dc:creator>
	</item>
	<item>
		<title>Thème Typebased</title> 
		<link>http://www.ecyseo.net/article14/theme-typebased</link>
		<guid>http://www.ecyseo.net/article14/theme-typebased</guid>
		<description>&lt;div style=&quot;float:right&quot;&gt;&lt;img src=&quot;http://www.ecyseo.net/data/images/site/screenshot_typebased.jpg&quot; alt=&quot;&quot; class=&quot;border&quot; height=&quot;89&quot; width=&quot;120&quot; /&gt;&lt;/div&gt;Encore une adaptation de thème wordpress que je vous propose aujourd&#039;hui...&lt;br /&gt;&lt;h2&gt;Installation&lt;/h2&gt;&lt;p&gt;Placer le dossier pluxml à la racine de votre site.&lt;br /&gt;Connectez-vous à l&#039;adresse du site et suivez les instructions d&#039;installation.&lt;br /&gt;Une fois l&#039;installation terminée, la page d&#039;accueil s&#039;affiche avec le thème par défaut.&lt;/p&gt;&lt;p&gt;Connectez-vous au panneau d&#039;administration et cliquez sur Paramètres.&lt;br /&gt;Dans les options d&#039;affichage, sélectionnez le thème &quot;typebased&quot;.&lt;br /&gt;Puis rendez-vous dans la rubrique plugins et activez les tous.&lt;/p&gt;&lt;h2&gt;Rubrique &quot;A PROPOS&quot;&lt;/h2&gt;&lt;p&gt;Le plugin &quot;About&quot; permet de renseigner la rubrique &quot;A PROPOS&quot; située dans la sidebar ainsi que les images et les liens de la rubrique &quot;A VOIR&quot; également dans la sidebar.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;Pour les images de la sidebar, utilisez le code déjà présent comme exemple.&lt;/p&gt;&lt;h2&gt;Démonstration&lt;/h2&gt;&lt;p&gt;A l&#039;heure où j&#039;écris ces lignes, c&#039;est le thème que j&#039;utilise. Si ce n&#039;est plus le cas quand vous les lirez, vous pouvez &lt;a href=&quot;http://demo.woothemes.com/?name=typebased&quot; title=&quot;voir un site en ligne&quot; onclick=&quot;window.open(this.href);return false;&quot;&gt;voir un site en ligne&lt;/a&gt;   utilisant ce thème. S&#039;il vous convient, n&#039;hésitez pas à l&#039;utiliser !&lt;br /&gt;&lt;/p&gt;&lt;h2&gt;Téléchargement&lt;br /&gt;&lt;/h2&gt;&lt;p&gt;L&#039;archive est disponible dans la &lt;a href=&quot;http://www.ecyseo.com/data/documents/telechargements/pluxml_typebased.zip&quot; title=&quot;rubrique &quot; onclick=&quot;window.open(this.href);return false;&quot;&gt;rubrique &quot;téléchargements&quot; &lt;/a&gt;.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Enjoy ;-)&lt;/p&gt;</description>
		<pubDate>Mon, 14 May 2012 14:10:00 +0200</pubDate>
		<dc:creator>Cyril MAGUIRE</dc:creator>
	</item>
	<item>
		<title>Thème Compositio</title> 
		<link>http://www.ecyseo.net/article13/theme-compositio</link>
		<guid>http://www.ecyseo.net/article13/theme-compositio</guid>
		<description>&lt;div style=&quot;float:right&quot;&gt;&lt;a href=&quot;http://www.ecyseo.com/data/images/site/screenshot.png&quot; class=&quot;zoombox&quot;&gt;&lt;img src=&quot;http://www.ecyseo.com/data/images/site/screenshot.tb.png&quot; alt=&quot;&quot; class=&quot;border&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;Je viens d&#039;adapter le thème Compositio de &lt;a href=&quot;http://designdisease.com/&quot; title=&quot;designdisease&quot;&gt;designdisease&lt;/a&gt; pour Pluxml.&lt;br /&gt; Je m&#039;en viens le partager avec vous.&lt;/p&gt;&lt;h2&gt;Installation&lt;/h2&gt;&lt;p&gt;Placer le dossier pluxml à la racine de votre site. Connectez-vous à l&#039;adresse du site et suivez les instructions d&#039;installation. &lt;br /&gt;&lt;/p&gt;&lt;p&gt;Une fois l&#039;installation terminée, la page d&#039;accueil s&#039;affiche avec le thème par défaut. Connectez-vous au panneau d&#039;administration et cliquez sur Paramètres.&lt;/p&gt;&lt;p&gt;Dans les options d&#039;affichage, sélectionnez le thème &quot;compositio&quot;. Puis rendez-vous dans la rubrique plugins et sélectionnez les tous.&lt;/p&gt;&lt;h2&gt;Rubrique &quot;A PROPOS&quot;&lt;/h2&gt;&lt;p&gt;Le plugin &quot;About&quot; permet de renseigner la rubrique &quot;A PROPOS&quot; située dans la sidebar ainsi que les images et les liens de la rubrique &quot;A VOIR&quot; également dans la sidebar.&lt;/p&gt;&lt;p&gt;Pour les images de la sidebar, utilisez le code déjà présent comme exemple. Vérifiez bien que les dimensions de l&#039;image soient égales à 54px de côté.&lt;/p&gt;&lt;h2&gt;Démonstration&lt;/h2&gt;&lt;p&gt;Vous pouvez &lt;a href=&quot;http://www.aprcf.eu&quot; title=&quot;voir un site en ligne&quot; onclick=&quot;window.open(this.href);return false;&quot;&gt;voir un site en ligne&lt;/a&gt;  utilisant ce thème. S&#039;il vous convient, n&#039;hésitez pas à l&#039;utiliser !&lt;br /&gt;&lt;/p&gt;&lt;h2&gt;Téléchargement&lt;br /&gt;&lt;/h2&gt;&lt;p&gt;L&#039;archive est disponible dans la &lt;a href=&quot;http://www.ecyseo.com/data/documents/telechargements/pluxml_compositio.zip&quot; title=&quot;rubrique &quot; téléchargements&quot;&quot;=&quot;&quot; onclick=&quot;window.open(this.href);return false;&quot;&gt;rubrique &quot;téléchargements&quot;&lt;/a&gt; .&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Enjoy ;-)&lt;/p&gt;</description>
		<pubDate>Wed, 09 May 2012 17:06:00 +0200</pubDate>
		<dc:creator>Cyril MAGUIRE</dc:creator>
	</item>
	<item>
		<title>-bash: make: command not found (mac osX)</title> 
		<link>http://www.ecyseo.net/article12/bash-make-command-not-found-mac-osx</link>
		<guid>http://www.ecyseo.net/article12/bash-make-command-not-found-mac-osx</guid>
		<description>&lt;p&gt;Qui n&#039;a pas eu un jour ce type de message rageant en voulant utiliser la commande &lt;em&gt;make&lt;/em&gt; sur Mac ? Voici comment procéder si vous êtes dans ce cas.&lt;/p&gt;&lt;h2&gt;Télécharger les outils du développeur&lt;/h2&gt;&lt;p&gt;Mac OsX ne contient pas par défaut les outils basiques du développeur. Mais Apple a prévu le coup et ces outils sont disponibles sur le DVD d&#039;installation ou en téléchargement gratuit à l&#039;adresse &lt;a href=&quot;https://developer.apple.com/technologies/tools/&quot; title=&quot;https://developer.apple.com/technologies/tools/&quot; onclick=&quot;window.open(this.href);return false;&quot;&gt;https://developer.apple.com/technologies/tools/&lt;/a&gt; &lt;br /&gt;&lt;/p&gt;&lt;p&gt;Il faut installer la dernière version de Xcode (version 4.3.1 à l&#039;heure j&#039;écris).&lt;/p&gt;&lt;p&gt;L&#039;installation est on ne peut plus basique. Je passe les détails.&lt;/p&gt;&lt;h2&gt;Mise à jour de $PATH&lt;/h2&gt;&lt;p&gt;Le chemin vers le compileur gcc doit être mis à jour. Pour cela, il suffit d&#039;ouvrir un terminal et de taper la commande suivante :&lt;/p&gt;&lt;pre class=&quot;brush :php&quot;&gt;&amp;nbsp;export PATH=$PATH:/Developer/usr/bin&lt;/pre&gt;&lt;h2&gt;Mise à jour du profil utilisateur&lt;/h2&gt;&lt;p&gt;Le profil utilisateur doit être également mis à jour pour prendre en compte la modification de $PATH. La commande est la suivante :&lt;/p&gt;&lt;pre class=&quot;brush :php&quot;&gt;&amp;nbsp;mate ~/.profile&lt;/pre&gt;&lt;p&gt;Pour ceux qui ont TextMate. Les autres adapteront en fonction de leur éditeur préféré.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Voilà, j&#039;espère que cette astuce vous permettra de vous sortir une aiguille du pied et de vous faire gagner le temps que j&#039;ai perdu.&lt;/p&gt;&lt;p&gt;Enjoy.&lt;br /&gt;&lt;/p&gt;</description>
		<pubDate>Mon, 12 Mar 2012 23:24:00 +0100</pubDate>
		<dc:creator>Cyril MAGUIRE</dc:creator>
	</item>
	<item>
		<title>Mes plugins Plxml (partie 1)</title> 
		<link>http://www.ecyseo.net/article9/mes-plugins-plxml</link>
		<guid>http://www.ecyseo.net/article9/mes-plugins-plxml</guid>
		<description>Depuis que j&#039;ai découvert &lt;a href=&quot;http://www.pluxml.org/&quot; title=&quot;Pluxml&quot; onclick=&quot;window.open(this.href);return false;&quot;&gt;Pluxml&lt;/a&gt;, je me suis penché sur le développement de plugins. Au travers d&#039;une série de 3 articles, je développerais :&lt;br /&gt;&lt;ol&gt;&lt;li&gt;les plugins qui permettent de modifier la partie administration, afin de faciliter la rédaction des articles et qui permettent d&#039;améliorer le paramétrage du site,&lt;/li&gt;&lt;li&gt;les plugins que j&#039;appellerai d&#039;habillage qui améliore l&#039;esthétique du site&lt;/li&gt;&lt;li&gt;les plugins dont je ne suis pas à l&#039;origine mais auxquels j&#039;ai apporté ma contribution&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;h2&gt;Plugins pour l&#039;administration&lt;/h2&gt;&lt;h3&gt;plxEditor&lt;/h3&gt;&lt;br /&gt;C&#039;est &lt;a href=&quot;http://www.ecyseo.net/data/documents/telechargements/plxeditor_modifie.zip&quot; title=&quot;un plugin&quot; onclick=&quot;window.open(this.href);return false;&quot;&gt;un plugin&lt;/a&gt;   que je n&#039;ai pas développé mais que j&#039;ai un peu modifié afin qu&#039;il ne soit utilisé que pour les formulaires ne nécessitant pas de saisir de code (articles, pages d&#039;info...). En effet, si on utilise le plugin dans les formulaires de la page 
/core/admin/parametres_edittpl.php ainsi que dans les pages statiques 
(globalement, dès qu&#039;il y a du code interprété), les fichiers générés lors de 
l&#039;enregistrement sont complétement déstructurés (par exemple ajout de 
balises &amp;amp;gt;br /&amp;amp;lt; dans les css, modification des fichiers 
php...).&lt;br /&gt;&lt;br /&gt;Malgré tout, ce plugin est utile et il permet l&#039;affichage d&#039;une série de boutons facilitant la mise en forme du texte, un peu à la manière des logiciels de traitement de texte comme &lt;a href=&quot;http://fr.libreoffice.org/&quot; title=&quot;LibreOffice&quot; onclick=&quot;window.open(this.href);return false;&quot;&gt;LibreOffice&lt;/a&gt;  par exemple.&lt;br /&gt;Je ne m&#039;attarderai pas dessus mais je vous le recommande chaudement.&lt;br /&gt;&lt;div style=&quot;text-align:center&quot;&gt;&lt;div style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;http://www.ecyseo.net/data/images/site/editor.png&quot; class=&quot;zoombox&quot;&gt;&lt;img src=&quot;http://www.ecyseo.net/data/images/site/editor.tb.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/div&gt; &lt;div style=&quot;text-align: left;&quot;&gt;&lt;h3&gt;plxEditarea&lt;/h3&gt;&lt;p&gt;J&#039;ai développé &lt;a href=&quot;http://www.ecyseo.net/data/documents/telechargements/editarea_page_edit_template_admin.zip&quot; title=&quot;plxEditarea&quot; onclick=&quot;window.open(this.href);return false;&quot;&gt;plxEditarea&lt;/a&gt;  à partir du travail de &lt;a href=&quot;http://www.cdolivet.com/editarea/?page=editArea&quot; title=&quot;Christophe Dolivet&quot; onclick=&quot;window.open(this.href);return false;&quot;&gt;Christophe Dolivet&lt;/a&gt;. A l&#039;inverse du premier, il permet de saisir du code dans un formulaire (pages statiques, modification des pages des thèmes...). L&#039;intérêt est qu&#039;il dispose d&#039;une coloration syntaxique qui vérifie au fur et à mesure de la saisie la validité du code. Les erreurs sont facilement identifiables. La couleur du texte peut être modifiée en fonction du langage que l&#039;on utilise (php, javascript, css...).&lt;/p&gt;&lt;p&gt;Je ne pourrais plus m&#039;en passer.&lt;/p&gt;&lt;div style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;http://www.ecyseo.net/data/images/site/editarea.png&quot; class=&quot;zoombox&quot;&gt;&lt;img src=&quot;http://www.ecyseo.net/data/images/site/editarea.tb.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/div&gt; &lt;/div&gt;&lt;/div&gt; &lt;div style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;http://www.ecyseo.net/data/images/site/editor.png&quot; class=&quot;zoombox&quot;&gt;&lt;/a&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;h3&gt;plxMarkitup&lt;/h3&gt;&lt;p&gt;C&#039;est une alternative à plxEditor. J&#039;ai &lt;a href=&quot;http://www.ecyseo.net/data/documents/telechargements/markitup_1.0.zip&quot; title=&quot;adapté à la sauce pluxml&quot; onclick=&quot;window.open(this.href);return false;&quot;&gt;adapté à la sauce pluxml&lt;/a&gt;  le formidable outil de &lt;a href=&quot;http://markitup.jaysalvat.com/home/&quot; title=&quot;Jay Salvat&quot; onclick=&quot;window.open(this.href);return false;&quot;&gt;Jay Salvat&lt;/a&gt;.&lt;/p&gt;&lt;div style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;http://www.ecyseo.net/data/images/site/markitup.png&quot; class=&quot;zoombox&quot;&gt;&lt;img src=&quot;http://www.ecyseo.net/data/images/site/markitup.tb.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/div&gt; A la différence de plxEditor, il ne se comporte pas comme un logiciel de traitement de texte mais ajoute des balises au texte que l&#039;on tape. On peut ainsi utiliser différents parseurs (html, markdown, textile, bbcode...).&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;plxMetaVerif&lt;/h3&gt;&lt;p&gt;C&#039;est un plugin qui permet d&#039;&lt;a href=&quot;http://www.ecyseo.net/data/documents/telechargements/plxmetaverif.zip&quot; title=&quot;ajouter la balise meta&quot; onclick=&quot;window.open(this.href);return false;&quot;&gt;ajouter la balise meta&lt;/a&gt;  permettant à google et/ou à bing de s&#039;assurer que vous êtes le propriétaire du site que vous souhaitez enregistrer. Il crée également un fichier html pour google, un fichier xml pour bing et le fichier robots.txt (vide) pour google.&lt;/p&gt;&lt;div style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;http://www.ecyseo.net/data/images/site/plxmetaverif.png&quot; class=&quot;zoombox&quot;&gt;&lt;img src=&quot;http://www.ecyseo.net/data/images/site/plxmetaverif.tb.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;text-align: left;&quot;&gt;Voilà, c&#039;est tout pour aujourd&#039;hui. Demain, je vous détaillerai les plugins permettant d&#039;ajouter une mise en forme sympa à votre site (diaporama, zoom d&#039;images...).&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;   &lt;/div&gt;&lt;/div&gt;</description>
		<pubDate>Sat, 10 Dec 2011 19:21:00 +0100</pubDate>
		<dc:creator>Cyril MAGUIRE</dc:creator>
	</item>
	<item>
		<title>Shaarli share your links...</title> 
		<link>http://www.ecyseo.net/article8/shaarli-share-your-links</link>
		<guid>http://www.ecyseo.net/article8/shaarli-share-your-links</guid>
		<description>&lt;div style=&quot;float:right&quot;&gt;&lt;img src=&quot;http://www.ecyseo.net/data/images/site/logo.png&quot; alt=&quot;&quot; /&gt;&lt;/div&gt; Depuis le mois de septembre, &lt;a href=&quot;http://www.sebsauvage.net/&quot; title=&quot;Seb Sauvage&quot;&gt;Seb Sauvage&lt;/a&gt; nous a concocté un formidable outil : j&#039;ai nommé &lt;a href=&quot;http://sebsauvage.net/wiki/doku.php?id=php:shaarli&quot; title=&quot;shaarli&quot;&gt;Shaarli&lt;/a&gt;  !
 Toujours en version béta (car de nombreuses nouvelles fonctionnalités 
sont encore dans les cartons), cette petite application vous permet de partager
 (ou pas) les liens vers des sites qui vous semblent pertinents (ou 
pas).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Shaarli, c&#039;est quoi ?&lt;/h2&gt;&lt;p&gt;Comme son auteur nous l&#039;indique, &lt;a href=&quot;http://sebsauvage.net/wiki/doku.php?id=php:shaarli&quot; title=&quot;shaarli&quot;&gt;Shaarli&lt;/a&gt; est un clone minimaliste de Delicious que vous pouvez installer sur votre propre serveur. Le but est de disposer de ses données comme on l&#039;entend et de ne pas dépendre d&#039;un service tiers qui pourrait analyser à notre insu nos activités sur le web (non je n&#039;ai pas nommé la &lt;a href=&quot;http://www.ecyseo.net/data/images/site/google.jpg&quot;&gt;&lt;img src=&quot;http://www.ecyseo.net/data/images/site/google.tb.jpg&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;renouille qui voulait devenir une Face de bouc).&lt;/p&gt;&lt;p&gt;Cet outil se veut être simple (ce qui ne veut pas dire qu&#039;il n&#039;est pas puissant) et rapide.&lt;br /&gt;&lt;/p&gt;&lt;h2&gt;Shaarli, comment ?&lt;/h2&gt;&lt;p&gt;La philosophie sous-jacente du code est le principe du KISS (Keep It Simple Stupid). &lt;a href=&quot;http://sebsauvage.net/wiki/doku.php?id=php:shaarli&quot; title=&quot;shaarli&quot;&gt;Shaarli&lt;/a&gt; tient donc en un seul fichier php (oui vous avez bien lu) et en un fichier css de base. Cette méthode permet de faciliter la maintenance du code ce qui n&#039;empêche pas les fonctionnalités d&#039;être multiples.&lt;/p&gt;&lt;div style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;http://www.ecyseo.net/data/images/site/shaarli1.png&quot; class=&quot;zoombox&quot;&gt;&lt;img src=&quot;http://www.ecyseo.net/data/images/site/shaarli1.tb.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/div&gt; &lt;p&gt;Malgré tout, &lt;a href=&quot;http://sebsauvage.net/wiki/doku.php?id=php:shaarli&quot; title=&quot;shaarli&quot;&gt;Shaarli&lt;/a&gt; est rapide et le nombre de liens à traiter n&#039;est pas un problème. Et quand je dis rapide, ce n&#039;est pas une vue de l&#039;esprit. Les temps d&#039;affichage sont presque indécents tellement ils sont courts (0.1353 secondes par exemple sur le site de l&#039;auteur à l&#039;heure où je vous parle avec plus de 8300 liens publics).&lt;/p&gt;&lt;h2&gt;Shaarli, quelles fonctions ?&lt;/h2&gt;&lt;p&gt;Je ne détaillerai pas l&#039;ensemble des fonctionnalités car elles évoluent assez rapidement. Je noterai seulement les essentielles (traduction de celles listées sur le &lt;a href=&quot;http://sebsauvage.net/wiki/doku.php?id=php:shaarli&quot; title=&quot;site dédié à l&#039;outil&quot; onclick=&quot;window.open(this.href);return false;&quot;&gt;site dédié à l&#039;outil&lt;/a&gt; ) :&lt;/p&gt;&lt;ul&gt;&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Design minimaliste (simple is beautiful)&lt;/div&gt; &lt;/li&gt;&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;strong&gt;Rapide&lt;/strong&gt;&lt;/div&gt; &lt;/li&gt;&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Facile à utiliser : un simple bouton dans votre navigateur pour marquer une page&lt;/div&gt; &lt;/li&gt;&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; L&#039;url, le titre et la description du lien sont enregistrés sans restriction de taille&lt;/div&gt; &lt;/li&gt;&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Les marque-pages peuvent être publics ou privés&amp;nbsp;&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;http://www.ecyseo.net/data/images/site/shaarli2.png&quot; class=&quot;zoombox&quot;&gt;&lt;img src=&quot;http://www.ecyseo.net/data/images/site/shaarli2.tb.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/div&gt; &lt;ul&gt;&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Possibilité de les classer et de les filtrer par l&#039;intermédiaire de tags (dont le formulaire de saisie s&#039;auto-complète au fur et à mesure des enregistrements)&lt;br /&gt;&lt;/div&gt; &lt;/li&gt;&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Les liens sont affichés par pages (avec la possibilité de choisir le nombre de liens à afficher par page)&lt;/div&gt; &lt;/li&gt;&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Moteur de recherche inclus (recherche par texte complet)&lt;/div&gt; &lt;/li&gt;&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Nuage de tags disponible&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;http://www.ecyseo.net/data/images/site/shaarli3.png&quot; class=&quot;zoombox&quot;&gt;&lt;img src=&quot;http://www.ecyseo.net/data/images/site/shaarli3.tb.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;ul&gt;&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Permalinks&lt;/div&gt; &lt;/li&gt;&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Génération de miniatures automatiques pour de nombreux services (imgur, imageshack.us, flickr, youtube, vimeo, dailymotion…)&lt;/div&gt;&lt;/li&gt;&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;&lt;div class=&quot;li&quot;&gt; Mur d&#039;images (qui peuvent être filtrées par tags ou par résultat de recherche)&lt;/div&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;http://www.ecyseo.net/data/images/site/shaarli4.png&quot; class=&quot;zoombox&quot;&gt;&lt;img src=&quot;http://www.ecyseo.net/data/images/site/shaarli4.tb.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/div&gt; &lt;ul&gt;&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;&lt;div class=&quot;li&quot;&gt;&lt;acronym title=&quot;Rich Site Summary&quot;&gt;RSS&lt;/acronym&gt; et ATOM feeds (qui peuvent être filtrées par tags ou par résultat de recherche)&lt;/div&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;&lt;div class=&quot;li&quot;&gt;Protocole &lt;a href=&quot;https://code.google.com/p/pubsubhubbub/&quot; class=&quot;urlextern&quot; title=&quot;https://code.google.com/p/pubsubhubbub/&quot; rel=&quot;nofollow&quot;&gt;PubSubHubbub&lt;/a&gt;&amp;nbsp; supporté&lt;/div&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;&lt;div class=&quot;li&quot;&gt;Installation ultra-simplifiée : pousser les fichiers sur le serveur et c&#039;est tout&lt;/div&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;&lt;div class=&quot;li&quot;&gt;Fichier php unique&lt;/div&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;&lt;div class=&quot;li&quot;&gt;Aucune base de données nécessaire (un seul fichier de données généré, pratique pour les sauvegardes)&lt;/div&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;&lt;div class=&quot;li&quot;&gt;Encombrement réduit (1315 liens occupent 150 kb)&lt;/div&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;&lt;div class=&quot;li&quot;&gt;Possibilité d&#039;import/export ds marque-pages de Netscape (pour l&#039;import/export depuis/vers Firefox, Opera, Chrome, Delicious…)&lt;/div&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;&lt;div class=&quot;li&quot;&gt;Protection contre les failles XSRF, les vols de cookies de session cookie, attaques par brute force… et bien entendu contre les injections &lt;acronym title=&quot;Structured Query Language&quot;&gt;SQL&lt;/acronym&gt; (vue qu&#039;il n&#039;y a pas de base &lt;acronym title=&quot;Structured Query Language&quot;&gt;SQL&lt;/acronym&gt; !)&lt;/div&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;&lt;div class=&quot;li&quot;&gt;Les paramètres gênants de FeedProxy FeedBurner/Google dans l&#039;&lt;acronym title=&quot;Uniform Resource Locator&quot;&gt;URL&lt;/acronym&gt; (&lt;code&gt;?utm_source…&lt;/code&gt;) sont supprimés automatiquement&lt;/div&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2&gt;Bref !&lt;/h2&gt;&lt;p&gt;Vous l&#039;aurez compris, &lt;a href=&quot;http://sebsauvage.net/wiki/doku.php?id=php:shaarli&quot; title=&quot;shaarli&quot;&gt;Shaarli&lt;/a&gt; est un outil obligatoire à avoir sous la main. Perso, je ne peux plus m&#039;en passer.&lt;br /&gt;&lt;/p&gt;&lt;p&gt; &lt;/p&gt;</description>
		<pubDate>Wed, 23 Nov 2011 01:58:00 +0100</pubDate>
		<dc:creator>Cyril MAGUIRE</dc:creator>
	</item>
	<item>
		<title>Supraconductivité</title> 
		<link>http://www.ecyseo.net/article7/supraconductivite</link>
		<guid>http://www.ecyseo.net/article7/supraconductivite</guid>
		<description>Rien à dire : c&#039;est bluffant...&lt;br /&gt;&lt;iframe src=&quot;http://www.youtube.com/embed/Ws6AAhTw7RA&quot; allowfullscreen=&quot;&quot; frameborder=&quot;0&quot; height=&quot;295&quot; width=&quot;430&quot;&gt;&lt;/iframe&gt;</description>
		<pubDate>Thu, 20 Oct 2011 02:21:00 +0200</pubDate>
		<dc:creator>Cyril MAGUIRE</dc:creator>
	</item>
	<item>
		<title>Utiliser plusieurs CGridView sur une même page</title> 
		<link>http://www.ecyseo.net/article6/utiliser-plusieurs-cgridview-sur-une-meme-page</link>
		<guid>http://www.ecyseo.net/article6/utiliser-plusieurs-cgridview-sur-une-meme-page</guid>
		<description>&lt;div style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;http://www.ecyseo.net/data/images/site/yii-framework.png&quot; alt=&quot;&quot; /&gt;&lt;/div&gt; &lt;p&gt;Lors du développement d&#039;une application avec Yii, il est souvent nécessaire d&#039;utiliser les widgets mis à disposition par le framework. CGridView en fait partie et j&#039;avoue que son utilisation n&#039;est pas des plus intuitives. Même en lisant la doc plusieurs fois, il n&#039;est pas si évident de faire ce que l&#039;on veut. J&#039;ai été confronté au problème d&#039;utiliser plusieurs fois le widget sur une même page, en utilisant le même modèle mais en voulant afficher des résultats différents. Et voici comment j&#039;ai procédé.&lt;/p&gt;&lt;h2&gt;La structure de l&#039;application&lt;/h2&gt;&lt;p&gt;Yii se base sur la structure MVC (Modèle Vue Controlleur). Nous aurons donc le modèle Articles dans le fichier &quot;Articles.php&quot;, le controlleur dans le fichier &quot;ArticlesController.php&quot; et la vue associée, &quot;view.php&quot;.&lt;/p&gt;&lt;p&gt;Le widget CGridView pouvant fonctionner avec un module de recherche avancé, nous aurons besoin d&#039;une vue annexe qui sera incluse dans la vue principale. Par convention, les vues intégrées sont précédées d&#039;un underscore. Nous nommerons donc le fichier _search.php&lt;/p&gt;&lt;h2&gt;La base de données&lt;/h2&gt;On va utiliser une base théorique pour l&#039;exemple qui se compose de la table &quot;articles&quot; :&lt;pre class=&quot;brush:sql;&quot;&gt;CREATE TABLE `articles` (&lt;br /&gt;  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,&lt;br /&gt;  `nom` tinytext,&lt;br /&gt;  `titre` text,&lt;br /&gt;  `date_parution` date DEFAULT NULL,&lt;br /&gt;  `etat` varchar(60) NOT NULL,&lt;br /&gt;  `contact_id` int(11) unsigned NOT NULL,&lt;br /&gt;  PRIMARY KEY (`id`)&lt;br /&gt;) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;&lt;/pre&gt;et de la table &quot;contacts&quot; :&lt;pre class=&quot;brush:sql;&quot;&gt;CREATE TABLE `contacts` (&lt;br /&gt;  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,&lt;br /&gt;  `nom` varchar(100) DEFAULT NULL,&lt;br /&gt;  `prenom` varchar(100) DEFAULT NULL,&lt;br /&gt;  `tel_fixe` tinytext,&lt;br /&gt;  `tel_portable` tinytext,&lt;br /&gt;  `fax` tinytext,&lt;br /&gt;  `email` tinytext,&lt;br /&gt;  `adresse` text,&lt;br /&gt;  PRIMARY KEY (`id`)&lt;br /&gt;) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;&lt;/pre&gt;Les deux tables sont liées entre elles par le champ &quot;contact_id&quot; de la table &quot;articles&quot; et l&#039;index &quot;id&quot; de la table &quot;contacts&quot;. Au niveau du modèle &quot;Articles&quot;, cela se traduit par la relation :&lt;pre class=&quot;brush:php;&quot;&gt;&amp;nbsp; /**&lt;br /&gt;  * @return array relational rules.&lt;br /&gt;  */&lt;br /&gt; public function relations()&lt;br /&gt; {&lt;br /&gt;  // NOTE: you may need to adjust the relation name and the related&lt;br /&gt;  // class name for the relations automatically generated below.&lt;br /&gt;  return array( &lt;br /&gt;    &#039;contact&#039; =&amp;gt; array(self::BELONGS_TO, &#039;Contacts&#039;, &#039;contact_id&#039;),&lt;br /&gt;        );&lt;br /&gt; }&lt;/pre&gt;&lt;h2&gt;Les vues&lt;/h2&gt;&lt;h3&gt;view.php&lt;/h3&gt;&lt;p&gt;Nous souhaitons trier les articles en fonction de leur état possible (&#039;ouvert&#039;,&#039;ferme&#039;,&#039;attente&#039;). Chaque résultat sera positionné par état dans un tableau généré par CGridView.&lt;/p&gt;&lt;p&gt;Voici le code commenté :&lt;/p&gt;&lt;pre class=&quot;brush:php;&quot; &amp;lt;?php&lt;br=&quot;&quot; /&gt;&amp;lt;?php &lt;br /&gt;//Le fil d&#039;ariane&lt;br /&gt; $this-&amp;gt;breadcrumbs=array(&lt;br /&gt;  Yii::t(&#039;app&#039;,&#039;Administration&#039;)=&amp;gt;array(&#039;gestion/index&#039;),&lt;br /&gt;  Yii::t(&#039;app&#039;,&#039;Liste des articles &#039;),&lt;br /&gt; );&lt;br /&gt;&lt;br /&gt; //On défini ici le menu que l&#039;on complétera en fonction de l&#039;état de l&#039;article&lt;br /&gt; $this-&amp;gt;menu=array();&lt;br /&gt;&lt;br /&gt; //Les différents états possibles pour un article&lt;br /&gt; $states = array(&#039;ouvert&#039;,&#039;ferme&#039;,&#039;attente&#039;);&lt;br /&gt; &lt;br /&gt; //On fait une boucle afin d&#039;afficher les résultats en fonction de l&#039;état des articles&lt;br /&gt; foreach ($states as $key =&amp;gt; $value) :&lt;br /&gt;  switch ($value) {&lt;br /&gt;      case &quot;ouvert&quot;:&lt;br /&gt;    //$etat permettra de controller entre autre le widget&lt;br /&gt;          $etat = &#039;ouvert&#039;;&lt;br /&gt;    //$statut permettra de compléter les légendes&lt;br /&gt;          $statut = Yii::t(&#039;app&#039;,&#039;ouvertes&#039;);&lt;br /&gt;          break;&lt;br /&gt;      case &quot;ferme&quot;:&lt;br /&gt;          $etat = &#039;ferme&#039;;&lt;br /&gt;          $statut = Yii::t(&#039;app&#039;,&#039;fermées&#039;);&lt;br /&gt;          break;&lt;br /&gt;   case &quot;attente&quot;:&lt;br /&gt;          $etat = &#039;attente&#039;;&lt;br /&gt;          $statut = Yii::t(&#039;app&#039;,&#039;en attente&#039;);&lt;br /&gt;          break;&lt;br /&gt;   default :&lt;br /&gt;    $etat = &#039;ouvert&#039;;&lt;br /&gt;    $statut = Yii::t(&#039;app&#039;,&#039;ouvertes&#039;);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  //On complète le menu&lt;br /&gt;  $this-&amp;gt;menu[] = array(&#039;label&#039;=&amp;gt;Yii::t(&#039;app&#039;,&#039;Liste des articles &#039;).$statut, &#039;url&#039;=&amp;gt; &#039;#&#039;.$etat);&lt;br /&gt;&lt;br /&gt;  //On paramètre le nombre de pages de résultats&lt;br /&gt;  $pageSize=Yii::app()-&amp;gt;user-&amp;gt;getState(&#039;pageSize&#039;,Yii::app()-&amp;gt;params[&#039;defaultPageSize&#039;]);&lt;br /&gt;  &lt;br /&gt;  //On lance une obfuscation afin que le widget puisse générer sans erreur les différents tableaux de résultats.&lt;br /&gt; ob_start();&lt;br /&gt;&lt;br /&gt;  //Par défaut, les champs de recherche avancée sont masqués par une fonction javascript qui permet aussi de les afficher&lt;br /&gt;  //Chaque état devant être indépendant, on génère une fonction pour chacun d&#039;entre eux.&lt;br /&gt;  Yii::app()-&amp;gt;clientScript&lt;br /&gt;   -&amp;gt;registerScript(&#039;search&#039;.$etat, &quot;&lt;br /&gt;   $(&#039;#search-button_$etat&#039;).click(function(){&lt;br /&gt;    $(&#039;#search_$etat&#039;).toggle();&lt;br /&gt;    return false;&lt;br /&gt;   });&lt;br /&gt;   $(&#039;.search-form form#form_$etat&#039;).submit(function(){&lt;br /&gt;    $.fn.yiiGridView.update(&#039;$etat&#039;, {&lt;br /&gt;     data: $(this).serialize()&lt;br /&gt;    });    &lt;br /&gt;    $(&#039;#search_$etat&#039;).toggle();&lt;br /&gt;    return false;&lt;br /&gt;   }); &lt;br /&gt;   &quot;,&lt;br /&gt;   CClientScript::POS_READY);&lt;br /&gt; //On ouvre une division afin d&#039;envelopper chaque état pour y accéder plus facilement par le menu&lt;br /&gt; //Chaque division ayant un index unique correspondant à l&#039;état des articles&lt;br /&gt; ?&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;div id=&quot;&amp;lt;?php echo $etat;?&amp;gt;&quot; class=&quot;contenu&quot;&amp;gt;&amp;lt;!-- articles &amp;lt;?php echo strtoupper($statut);?&amp;gt;--&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;?php&lt;br /&gt; //On inclue le formulaire de recherche avancée&lt;br /&gt; //On donne un index unique au lien permettant l&#039;ouverture/la fermeture du formulaire afin que le javascript fonctionne&lt;br /&gt; echo CHtml::link(Yii::t(&#039;app&#039;,&#039;Recherche avancée&#039;),&#039;#&#039;,array(&#039;id&#039;=&amp;gt;&#039;search-button_&#039;.$etat));&lt;br /&gt;&lt;br /&gt; //On appelle la vue _search.php en lui passant les variables définies dans le modèle (voir ci-après)&lt;br /&gt; $this-&amp;gt;renderPartial(&#039;_search&#039;,array(&lt;br /&gt;    &#039;model&#039;=&amp;gt;$model,&lt;br /&gt;    &#039;contacts&#039;=&amp;gt;$contacts,&lt;br /&gt;    &#039;etat&#039;=&amp;gt;$etat&lt;br /&gt;      ));&lt;br /&gt;&lt;br /&gt; //On définie une variable afin de pouvoir traduire le message de suppression qui sera utilisé par CGridView&lt;br /&gt; //Si on le fait directement dans le widget, la trduction n&#039;est pas prise en compte&lt;br /&gt; $del = Yii::t(&#039;app&#039;,&#039;Êtes vous sûr de vouloir supprimer l’article &quot;&#039;);&lt;br /&gt;&lt;br /&gt; //Enfin on définie le widget&lt;br /&gt; $this-&amp;gt;widget(&#039;zii.widgets.grid.CGridView&#039;, array(&lt;br /&gt;   //L&#039;id unique permet l&#039;indépendance entre chaque widget&lt;br /&gt;   &#039;id&#039;=&amp;gt;&#039;tableau_&#039;.$etat,&lt;br /&gt;   //Le dataProvider permet de modifier l&#039;affichage du widget en fonction des résultats de recherche&lt;br /&gt;   //La recherche se fait ici par $_POST par la méthode search définie dans le modèle Articles&lt;br /&gt;   //search prend en argument l&#039;état de l&#039;article&lt;br /&gt;   &#039;dataProvider&#039;=&amp;gt; $model-&amp;gt;search($etat),&lt;br /&gt;   //On peut afficher un formulaire de recherche simplifié. La recherche se fera par $_GET &lt;br /&gt;   //sur le modèle principal&lt;br /&gt;   &#039;filter&#039;=&amp;gt; $model,&lt;br /&gt;   //L&#039;affichage peut être généré ou non en ajax&lt;br /&gt;   &#039;ajaxUpdate&#039;=&amp;gt;true, &lt;br /&gt;   //On peut décider de l&#039;endroit où sera affiché le formulaire de recherche simplifiée&lt;br /&gt;   &#039;filterPosition&#039; =&amp;gt; &#039;header&#039;,&lt;br /&gt;   //Si la pagination est activée, on peut personnaliser son affichage&lt;br /&gt;   //en précisant le texte qui sera utilisé&lt;br /&gt;   &#039;summaryText&#039;=&amp;gt;Yii::t(&#039;app&#039;,&#039;articles &#039;).&#039;{start}&#039;.Yii::t(&#039;app&#039;,&#039; à &#039;).&#039;{end}&#039;.Yii::t(&#039;app&#039;,&#039; sur &#039;).&#039;{count}&#039;.Yii::t(&#039;app&#039;,&#039; au total&#039;),&lt;br /&gt;   //en définisant le template de pagination&lt;br /&gt;   &#039;template&#039;=&amp;gt;&quot;{pager}\n{summary}\n{items}\n{pager}&quot;,&lt;br /&gt;   //et les liens qui seront affichés (ainsi que leur css associé)&lt;br /&gt;   &#039;pager&#039;=&amp;gt;array( &lt;br /&gt;    &#039;header&#039;=&amp;gt;false,&lt;br /&gt;    &#039;maxButtonCount&#039;=&amp;gt; 4,&lt;br /&gt;    &#039;firstPageLabel&#039;=&amp;gt;&#039;&amp;amp;lt;&amp;amp;lt;&#039;,&lt;br /&gt;    &#039;lastPageLabel&#039;=&amp;gt;&#039;&amp;amp;gt;&amp;amp;gt;&#039;,&lt;br /&gt;    &#039;nextPageLabel&#039;=&amp;gt;&#039;&amp;amp;gt;&#039;,&lt;br /&gt;    &#039;prevPageLabel&#039;=&amp;gt;&#039;&amp;amp;lt;&#039;,&lt;br /&gt;    &#039;cssFile&#039;=&amp;gt;Yii::app()-&amp;gt;theme-&amp;gt;baseUrl.&#039;/css/pagination.css&#039;&lt;br /&gt;   ), &lt;br /&gt;   //Une fois toutes les options de présentation définies&lt;br /&gt;   //on affiche les données&lt;br /&gt;   &#039;columns&#039;=&amp;gt;array( &lt;br /&gt;    //En première colonne, on peut afficher un bouton permettant la suppression des articles&lt;br /&gt;    array( &lt;br /&gt;     //header est l&#039;entête qui sera affichée en première ligne dans le tableau de résultats&lt;br /&gt;     &#039;header&#039;=&amp;gt;Yii::t(&#039;app&#039;,&#039;Action&#039;),&lt;br /&gt;     //On définit un bouton associé au widget&lt;br /&gt;     &#039;class&#039;=&amp;gt;&#039;CButtonColumn&#039;,&lt;br /&gt;     //On définit sa fonction&lt;br /&gt;     //Par défaut, Yii prévoit 3 tickets de fonction différents&lt;br /&gt;     //delete, update et view&lt;br /&gt;     //D&#039;autres tickets de fonction peuvent être définis&lt;br /&gt;     &#039;template&#039;=&amp;gt;&#039;{delete}&#039;,&lt;br /&gt;     //On définit le message de confirmation&lt;br /&gt;     //Le contenu étant généré par javascript, il faut avoir au préalable traduit le message&lt;br /&gt;     &#039;deleteConfirmation&#039;=&amp;gt; &quot;js:&#039;&quot;.$del.&quot;&#039;+$(this).parents(&#039;tr&#039;).children(&#039;:nth-child(2)&#039;).text()+&#039;\&quot; ?&#039;&quot;&lt;br /&gt;    ),&lt;br /&gt;    //En deuxième colonne, on affiche le nom de l&#039;article&lt;br /&gt;    array(&lt;br /&gt;      &#039;header&#039;=&amp;gt;Yii::t(&#039;app&#039;,&#039;Nom&#039;),&lt;br /&gt;      //On définit le nom qui sera donné au champ de recherche&lt;br /&gt;      //Comme le widget est utilisé plusieurs fois&lt;br /&gt;      //on crée un tableau en fonction de l&#039;état des articles afin de bien différencier les résultats&lt;br /&gt;      &#039;name&#039; =&amp;gt; &quot;[$etat]nom&quot;, &lt;br /&gt;      //On choisi d&#039;afficher un lien vers la partie administration afin de modifier l&#039;article&lt;br /&gt;      //le champ doit donc être de type html&lt;br /&gt;      &#039;type&#039; =&amp;gt; &#039;html&#039;,&lt;br /&gt;      //On affiche enfin la valeur de chaque cellule&lt;br /&gt;      //Lorsque l&#039;on affiche les résultats, on n&#039;utilise pas directement le modèle $model&lt;br /&gt;      //Le widget fait une boucle afin d&#039;afficher les résultats&lt;br /&gt;      //qui sont stockés au préalable dans l&#039;objet $data.&lt;br /&gt;      //Le code doit être placé entre guillemets&lt;br /&gt;      &#039;value&#039; =&amp;gt; &#039;CHtml::link($data-&amp;gt;nom,array(&quot;articles/update&quot;,&quot;id&quot; =&amp;gt; $data-&amp;gt;id, &quot;article&quot; =&amp;gt; CHtml::encode($data-&amp;gt;nom)))&#039;,&lt;br /&gt;    ),&lt;br /&gt;    array(&lt;br /&gt;     //Même principe&lt;br /&gt;     &#039;header&#039;=&amp;gt;Yii::t(&#039;app&#039;,&#039;Titre&#039;),&lt;br /&gt;     &#039;name&#039;=&amp;gt;&quot;[$etat]titre&quot;,&lt;br /&gt;     &#039;value&#039;=&amp;gt;&#039;$data-&amp;gt;titre&#039;&lt;br /&gt;    ),&lt;br /&gt;    array( &lt;br /&gt;     //On définit de nouveaux boutons d&#039;actions&lt;br /&gt;     //On les sépare du boutons de suppression afin d&#039;éviter toute erreur&lt;br /&gt;     //de manipulation de la part de l&#039;utilisateur&lt;br /&gt;     //Même principe que précédemment&lt;br /&gt;     &#039;header&#039;=&amp;gt;Yii::t(&#039;app&#039;,&#039;Actions&#039;),&lt;br /&gt;     &#039;class&#039;=&amp;gt;&#039;CButtonColumn&#039;,&lt;br /&gt;     &#039;template&#039;=&amp;gt;&#039;{update} {view}&#039;,&lt;br /&gt;     //On précise les url et les options de chaque bouton généré&lt;br /&gt;     &#039;buttons&#039;=&amp;gt;array(&lt;br /&gt;      &#039;update&#039;=&amp;gt;array(  &lt;br /&gt;       &#039;url&#039;=&amp;gt; &#039;Yii::app()-&amp;gt;controller-&amp;gt;createAbsoluteUrl(&quot;articles/update&quot;, array(&quot;id&quot;=&amp;gt;$data-&amp;gt;id,&quot;nom&quot;=&amp;gt;$data-&amp;gt;nom))&#039;&lt;br /&gt;       ), &lt;br /&gt;      &#039;view&#039;=&amp;gt;array(  &lt;br /&gt;       &#039;url&#039;=&amp;gt; &#039;Yii::app()-&amp;gt;controller-&amp;gt;createAbsoluteUrl(&quot;articles/view&quot;, array(&quot;id&quot;=&amp;gt;$data-&amp;gt;id,&quot;nom&quot;=&amp;gt;$data-&amp;gt;nom))&#039;,&lt;br /&gt;       &#039;options&#039;=&amp;gt; array(&lt;br /&gt;        &#039;title&#039;=&amp;gt;Yii::t(&#039;app&#039;,&#039;Aperçu de l\&#039;article&#039;))&lt;br /&gt;       )           &lt;br /&gt;     )&lt;br /&gt;    ),        &lt;br /&gt;   ),&lt;br /&gt;  ));&lt;br /&gt; ?&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;/div&amp;gt;&amp;lt;!-- FIN articles &amp;lt;?php echo strtoupper($statut);?&amp;gt; --&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;?php&lt;br /&gt; //On stocke le contenu obfusqué dans une variable.&lt;br /&gt; //Le contenu est concaténé avec le contenu précédent&lt;br /&gt; $articles .= ob_get_contents();&lt;br /&gt; //On ferme l&#039;obfuscation&lt;br /&gt; ob_end_clean();&lt;br /&gt; //On ferme la boucle&lt;br /&gt; endforeach;&lt;br /&gt; //Enfin on affiche les résultats&lt;br /&gt; ?&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;h1&amp;gt;&amp;lt;?php echo Yii::t(&#039;app&#039;,&#039;Gestion des articles &#039;);?&amp;gt;&amp;lt;/h1&amp;gt; &lt;br /&gt;&lt;br /&gt; &amp;lt;?php&lt;br /&gt; //On affiche le menu sous forme de liste non ordonnée&lt;br /&gt; $this-&amp;gt;widget(&#039;zii.widgets.CMenu&#039;, array(&lt;br /&gt;  &#039;items&#039;=&amp;gt;$this-&amp;gt;menu,&lt;br /&gt;  &#039;htmlOptions&#039;=&amp;gt;array(&#039;class&#039;=&amp;gt;&#039;css-tabs history&#039;),&lt;br /&gt; ));&lt;br /&gt; //et les résultats&lt;br /&gt; ?&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;div class=&quot;panes&quot;&amp;gt;&amp;lt;!-- PANES --&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;?php echo $articles;?&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;/div&amp;gt;&amp;lt;!-- FIN PANES --&amp;gt;&lt;/pre&gt;&lt;h3&gt;_search.php&lt;/h3&gt;&lt;pre class=&quot;brush:php&quot;&gt;&lt;!--?php     if (empty($model---&gt;&amp;lt;?php &lt;br /&gt;&lt;br /&gt; if (empty($model-&amp;gt;date_parution)) {&lt;br /&gt;  $model-&amp;gt;date_parution = null;&lt;br /&gt; }&lt;br /&gt; //On lance une obfuscation afin que le widget puisse générer &lt;br /&gt; //sans erreur le formulaire pour chaque CGridView&lt;br /&gt; $form = $this-&amp;gt;beginWidget(&#039;CActiveForm&#039;, array(&lt;br /&gt;  &#039;method&#039;=&amp;gt;&#039;post&#039;,&lt;br /&gt;  //On donne l&#039;id défini dans la fonction javascript de la page view.php&lt;br /&gt;  &#039;id&#039;=&amp;gt;&#039;form_&#039;.$etat&lt;br /&gt; )); &lt;br /&gt;&lt;br /&gt; //On affiche le formulaire&lt;br /&gt; //Pour un gain de temps, j&#039;ai volontairement fais une mise en page à l&#039;aide d&#039;un tableau&lt;br /&gt; //Oui, je sais c&#039;est pas bien....&lt;br /&gt; echo &#039;&lt;br /&gt;&lt;br /&gt;  &amp;lt;div class=&quot;search-form&quot; style=&quot;display:none;&quot; id=&quot;search_&#039;.$etat.&#039;&quot;&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;table summary=&quot;form&quot; class=&quot;table-form&quot;&amp;gt; &lt;br /&gt;  &amp;lt;tr&amp;gt;&lt;br /&gt;   &amp;lt;td&amp;gt;&#039;.$form-&amp;gt;label($model,Yii::t(&#039;app&#039;,&#039;nom&#039;),array(&#039;for&#039;=&amp;gt;&#039;nom_&#039;.$etat)).&#039;&amp;lt;/td&amp;gt;&#039;&lt;br /&gt;   &lt;br /&gt;   //On définit le nom qui sera donné au champ de recherche&lt;br /&gt;     //Comme le widget est utilisé plusieurs fois&lt;br /&gt;     //on crée un tableau en fonction de l&#039;état des articles afin de bien différencier les résultats&lt;br /&gt;   //On donne également un id unique à chaque champ&lt;br /&gt;   &#039;&amp;lt;td&amp;gt;&#039;.$form-&amp;gt;textField($model,&quot;[$etat]nom&quot;,array(&#039;size&#039;=&amp;gt;60,&#039;maxlength&#039;=&amp;gt;255,&#039;id&#039;=&amp;gt;&#039;nom_&#039;.$etat)).&#039;&amp;lt;/td&amp;gt;&lt;br /&gt;  &amp;lt;/tr&amp;gt;&lt;br /&gt;  &amp;lt;tr&amp;gt;&lt;br /&gt;   &amp;lt;td&amp;gt;&#039;.$form-&amp;gt;labelEx($model,Yii::t(&#039;app&#039;,&#039;date de parution &amp;lt;span&amp;gt;*&amp;lt;/span&amp;gt;&#039;),array(&#039;for&#039;=&amp;gt;&#039;date_parution_&#039;.$etat,&#039;id&#039;=&amp;gt;&#039;label_ouverture_&#039;.$etat)).&#039;&amp;lt;/td&amp;gt;&lt;br /&gt;&lt;br /&gt;   &amp;lt;td&amp;gt;&#039;.$form-&amp;gt;textField($model,&quot;[$etat]date_parution&quot;,array(&#039;class&#039;=&amp;gt;&#039;date&#039;,&#039;id&#039;=&amp;gt;&#039;date_parution_&#039;.$etat)).&#039;&amp;lt;/td&amp;gt;&lt;br /&gt;   &lt;br /&gt;  &amp;lt;/tr&amp;gt;&#039;&lt;br /&gt;   //dropDownList fonctionne avec un tableau (ici $contacts défini dans le controlleur)&lt;br /&gt;   &#039;&amp;lt;td&amp;gt;&#039;.$form-&amp;gt;label($model,Yii::t(&#039;app&#039;,&#039;Contact&#039;),array(&#039;for&#039;=&amp;gt;&#039;contact_&#039;.$etat)).&#039;&amp;lt;/td&amp;gt;&lt;br /&gt;   &amp;lt;td&amp;gt;&#039;.$form-&amp;gt;dropDownList($model,&quot;[$etat]contact_id&quot;,$contacts,array(&#039;id&#039;=&amp;gt;&#039;contact_&#039;.$etat)).&#039;&amp;lt;/td&amp;gt;&lt;br /&gt;  &amp;lt;/tr&amp;gt; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;tr class=&quot;buttons&quot;&amp;gt;&lt;br /&gt;   &amp;lt;td colspan=&quot;2&quot; class=&quot;centrer&quot;&amp;gt;&#039;.CHtml::submitButton(Yii::t(&#039;app&#039;,&#039;Rechercher&#039;)).&#039;&amp;lt;/td&amp;gt;&lt;br /&gt;  &amp;lt;/tr&amp;gt; &lt;br /&gt; &amp;lt;/table&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; &#039;;&lt;br /&gt;&lt;br /&gt; $this-&amp;gt;endWidget(); ?&amp;gt;&lt;br /&gt; &amp;lt;?php $return = ob_get_contents();&lt;br /&gt; ob_end_clean();?&amp;gt;&lt;br /&gt;&lt;br /&gt;     &amp;lt;?php echo $return;?&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;/div&amp;gt;&amp;lt;!-- search-form --&amp;gt;&lt;div class=&quot;search-form&quot; style=&quot;display:none;&quot; id=&quot;search_&#039;.$etat.&#039;&quot;&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &#039;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; //On définit le nom qui sera donné au champ de recherche&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; //Comme le widget est utilisé plusieurs fois&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; //on crée un tableau en fonction de l&#039;état des articles afin de bien différencier les résultats&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; //On donne également un id unique à chaque champ&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &#039;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &#039;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; //dropDownList fonctionne avec un tableau (ici $contacts défini dans le controlleur)&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &#039;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;table summary=&quot;form&quot; class=&quot;table-form&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&#039;.$form-&amp;gt;label($model,Yii::t(&#039;app&#039;,&#039;nom&#039;),array(&#039;for&#039;=&amp;gt;&#039;nom_&#039;.$etat)).&#039;&lt;/td&gt;&lt;td&gt;&#039;.$form-&amp;gt;textField($model,&quot;[$etat]nom&quot;,array(&#039;size&#039;=&amp;gt;60,&#039;maxlength&#039;=&amp;gt;255,&#039;id&#039;=&amp;gt;&#039;nom_&#039;.$etat)).&#039;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&#039;.$form-&amp;gt;labelEx($model,Yii::t(&#039;app&#039;,&#039;date de parution &lt;span&gt;*&lt;/span&gt;&#039;),array(&#039;for&#039;=&amp;gt;&#039;date_parution_&#039;.$etat,&#039;id&#039;=&amp;gt;&#039;label_ouverture_&#039;.$etat)).&#039;&lt;/td&gt;&lt;td&gt;&#039;.$form-&amp;gt;textField($model,&quot;[$etat]date_parution&quot;,array(&#039;class&#039;=&amp;gt;&#039;date&#039;,&#039;id&#039;=&amp;gt;&#039;date_parution_&#039;.$etat)).&#039;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&#039;.$form-&amp;gt;label($model,Yii::t(&#039;app&#039;,&#039;Contact&#039;),array(&#039;for&#039;=&amp;gt;&#039;contact_&#039;.$etat)).&#039;&lt;/td&gt;&lt;td&gt;&#039;.$form-&amp;gt;dropDownList($model,&quot;[$etat]contact_id&quot;,$contacts,array(&#039;id&#039;=&amp;gt;&#039;contact_&#039;.$etat)).&#039;&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;buttons&quot;&gt;&lt;td colspan=&quot;2&quot; class=&quot;centrer&quot;&gt;&#039;.CHtml::submitButton(Yii::t(&#039;app&#039;,&#039;Rechercher&#039;)).&#039;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&#039;;&amp;nbsp;&amp;nbsp; &amp;nbsp;$this-&amp;gt;endWidget(); ?&amp;gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;!--?php $return = ob_get_contents();    ob_end_clean();?--&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;!--?php echo $return;?--&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/div&gt;&lt;!-- search-form --&gt;&lt;/pre&gt;&lt;h2&gt;Le controlleur&lt;/h2&gt;&lt;p&gt;Je ne détaillerai pas l&#039;ensemble des méthodes du controlleur. Uniquement celle qui nous intéresse pour l&#039;exemple.&lt;/p&gt;&lt;pre class=&quot;brush:php&quot;&gt;&lt;!--?php    /**     * Manages all articles.     */    public function actionArticles()    {          //On appelle la méthode search en créant l&#039;objet model        $model = new Articles(&#039;search&#039;);        $model---&gt;&amp;lt;?php&lt;br /&gt; /**&lt;br /&gt;  * Manages all articles.&lt;br /&gt;  */&lt;br /&gt; public function actionArticles()&lt;br /&gt; {   &lt;br /&gt;  //On appelle la méthode search en créant l&#039;objet model&lt;br /&gt;  $model = new Articles(&#039;search&#039;);&lt;br /&gt;  $model-&amp;gt;unsetAttributes();  // On supprime toutes les valeurs par défaut&lt;br /&gt;  &lt;br /&gt;  //On s&#039;assure que s&#039;il une requête est postée, elle le soit depuis le site&lt;br /&gt;  if (isset($_POST[&#039;YII_CSRF_TOKEN&#039;]) &amp;amp;&amp;amp; $_POST[&#039;YII_CSRF_TOKEN&#039;] == Yii::app()-&amp;gt;request-&amp;gt;csrfToken) {&lt;br /&gt;   //Si c&#039;est le cas, on passe tous les arguments de POST à GET&lt;br /&gt;   //car se sont les arguments de GET qui seront passés comme attributs à l&#039;objet&lt;br /&gt;   $_GET = $_POST;&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  //Si le tableau $_GET existe&lt;br /&gt;  if(isset($_GET[&#039;Articles&#039;])){&lt;br /&gt;   //On passe les arguments de $_GET comme attributs de l&#039;objet&lt;br /&gt;   //en fonction de l&#039;état d&#039;origine de l&#039;article.&lt;br /&gt;   //Cela permet une recherche que sur un état en particulier&lt;br /&gt;   if (isset($_GET[&#039;Articles&#039;][&#039;ouvert&#039;])){&lt;br /&gt;    $model-&amp;gt;attributes = $_GET[&#039;Articles&#039;][&#039;ouvert&#039;];&lt;br /&gt;   }&lt;br /&gt;   elseif (isset($_GET[&#039;Articles&#039;][&#039;ferme&#039;])){&lt;br /&gt;    $model-&amp;gt;attributes = $_GET[&#039;Articles&#039;][&#039;ferme&#039;];&lt;br /&gt;   }&lt;br /&gt;   elseif (isset($_GET[&#039;Articles&#039;][&#039;attente&#039;])){&lt;br /&gt;    $model-&amp;gt;attributes = $_GET[&#039;Articles&#039;][&#039;attente&#039;];&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt;        &lt;br /&gt;  //On recherche tous les contacts&lt;br /&gt;  $c = Contacts::model()-&amp;gt;findAll(array(&#039;select&#039; =&amp;gt; &#039;nom, prenom, id&#039;)); &lt;br /&gt;  //On ajoute un champ nul pour éviter que la recherche de ce champ soit obligatoire&lt;br /&gt;  $contacts = array(0=&amp;gt;null) + $c;&lt;br /&gt;&lt;br /&gt;  //On affiche la vue en passant toutes les variables nécessaires&lt;br /&gt;  $this-&amp;gt;render(&#039;admin&#039;,array(&lt;br /&gt;   &#039;model&#039;=&amp;gt;$model,&lt;br /&gt;   &#039;contacts&#039;=&amp;gt;$contacts&lt;br /&gt;  ));&lt;br /&gt; }&lt;br /&gt; ?&amp;gt;&lt;/pre&gt;&lt;h2&gt;La méthode search() du modèle Articles&lt;/h2&gt;&lt;p&gt;C&#039;est le coeur de l&#039;affichage des résultats. C&#039;est elle qui permet le tri des résultats en fonction de l&#039;état des articles.&lt;/p&gt;&lt;pre class=&quot;brush:php&quot;&gt;&lt;!--?php    /**     * Retrieves a list of models based on the current search/filter conditions.     * @return CActiveDataProvider the data provider that can return the models based on the search/filter conditions.     * @param string $etat, state of the article (opened, closed, pending)    */    //On passe en argument l&#039;état de l&#039;article    //Par défaut, il est nul, ce qui permet de tous les afficher    public function search($etat = null)    {            //On crée un nouvel objet de type CDbCriteria qui permet de rechercher dans la base de données            $criteria=new CDbCriteria;                        $criteria---&gt;&amp;lt;?php&lt;br /&gt; /**&lt;br /&gt;  * Retrieves a list of models based on the current search/filter conditions.&lt;br /&gt;  * @return CActiveDataProvider the data provider that can return the models based on the search/filter conditions.&lt;br /&gt;  * @param string $etat, state of the article (opened, closed, pending) &lt;br /&gt; */&lt;br /&gt; //On passe en argument l&#039;état de l&#039;article&lt;br /&gt; //Par défaut, il est nul, ce qui permet de tous les afficher&lt;br /&gt; public function search($etat = null)&lt;br /&gt; {&lt;br /&gt;   //On crée un nouvel objet de type CDbCriteria qui permet de rechercher dans la base de données&lt;br /&gt;   $criteria=new CDbCriteria;&lt;br /&gt;   &lt;br /&gt;         $criteria-&amp;gt;together=true;&lt;br /&gt;      &lt;br /&gt;   //Si la recherche vient d&#039;un état en particulier,&lt;br /&gt;   //On compare les arguments de $_GET à la base de données&lt;br /&gt;   if (isset($_GET[&#039;Articles&#039;][$etat])){&lt;br /&gt;    //Le premier argument est le champ de la base de données&lt;br /&gt;    //Le deuxième argument est la valeur de l&#039;attributs donné par $_GET&lt;br /&gt;    //Le troisième permet de faire une recherche stricte (paramètre à false)&lt;br /&gt;    //ou approximative (paramètre à true). Lors de la requête sql générée&lt;br /&gt;    //l&#039;argument est alors entouré de deux %&lt;br /&gt;    $criteria-&amp;gt;compare(&#039;t.nom&#039;,$this-&amp;gt;nom,true);&lt;br /&gt;    $criteria-&amp;gt;compare(&#039;t.titre&#039;,$this-&amp;gt;titre,true); &lt;br /&gt;    $criteria-&amp;gt;compare(&#039;t.date_parution&#039;,$this-&amp;gt;date_parution,true);&lt;br /&gt;   }&lt;br /&gt;   //On fait une recherche stricte en fonction de l&#039;état des articles &lt;br /&gt;   //afin d&#039;afficher un tableau de résultats différent par état&lt;br /&gt;      $criteria-&amp;gt;compare(&#039;t.etat&#039;,$etat,false);&lt;br /&gt;   &lt;br /&gt;   //On retourne les résultats au widget CGridView qui se charge de les afficher&lt;br /&gt;   return new CActiveDataProvider(get_class($this), array(&lt;br /&gt;    &#039;criteria&#039;=&amp;gt;$criteria,&lt;br /&gt;    &#039;sort&#039;=&amp;gt;array(&lt;br /&gt;              &#039;defaultOrder&#039;=&amp;gt;&#039;t.nom ASC&#039;,&lt;br /&gt;          ),&lt;br /&gt;          &#039;pagination&#039;=&amp;gt;array(&lt;br /&gt;              &#039;pageSize&#039;=&amp;gt;10&lt;br /&gt;          )&lt;br /&gt;   ));&lt;br /&gt;   &lt;br /&gt;         &lt;br /&gt; }&lt;br /&gt; ?&amp;gt;&lt;/pre&gt;&lt;h2&gt;Conclusion&lt;/h2&gt;&lt;p&gt;Yii fournit un ensemble de widgets qui méritent d&#039;être étudiés en profondeur car ils permettent des fonctionnalités vraiment poussées. Même si la documentation n&#039;est pas assez exhaustive à mon goût, le forum officiel est rempli d&#039;exemples et d&#039;âmes charitables qui pourront vous renseigner avec plus de précision.&lt;/p&gt;&lt;p&gt;Yii c&#039;est bon ! Mangez-en.&lt;/p&gt;</description>
		<pubDate>Tue, 23 Aug 2011 02:49:00 +0200</pubDate>
		<dc:creator>Cyril MAGUIRE</dc:creator>
	</item>
</channel>
</rss>
