<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">
	<id>tag:weirdog.com,2010-02-18:feed</id>
	<title>Weirdog - Articles</title>
	
	<link href="http://www.weirdog.com/" />

	<author>
		<name>Laviale Olivier</name>
	</author>

	<updated>2013-05-06T14:06:25Europe/Paris</updated>

	<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/wdblog" /><feedburner:info uri="wdblog" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry>
		<title>Une balise pour les tranductions interpolées</title>
		<link href="http://feedproxy.google.com/~r/wdblog/~3/_4QtgdgGyqg/balise-tranductions-interpolees.html" />
		<id>tag:weirdog.com,2013-05-06:balise-tranductions-interpolees</id>
		<updated>2013-05-06T14:06:25Europe/Paris</updated>
		<published>2013-05-06T15:46:31Europe/Paris</published>
						<content type="html" xml:lang="fr">&lt;p&gt;C'est presque incroyable qu'après 5 ans d'utilisation de &lt;a href="https://github.com/Icybee/Patron"&gt;Patron&lt;/a&gt; ce soit seulement aujourd'hui qu'il me faut recourir à une fonction de traduction qui supporte l'interpolation. La notation &lt;code&gt;#{t:chaine_à_traduire}&lt;/code&gt; avait suffit à tous mes projets jusqu'à présent. La nouvelle balise &lt;code&gt;translate&lt;/code&gt; permet non seulement de traduire des chaines de caractères, mais aussi de faire de l'interpolation.&lt;/p&gt;

&lt;p&gt;La balise est décrite comme suit :&lt;/p&gt;

&lt;pre class="html"&gt;&lt;code&gt;&lt;span class="markup"&gt;&amp;lt;p:translate&lt;/span&gt;
     &lt;span class="attribute"&gt;native&lt;/span&gt; = &lt;span class="attribute"&gt;string&lt;/span&gt;&lt;span class="markup"&gt;&amp;gt;&lt;/span&gt;
     &lt;span class="markup"&gt;&amp;lt;!--&lt;/span&gt; &lt;span class="attribute"&gt;Content:&lt;/span&gt; &lt;span class="attribute"&gt;p:with-param*&lt;/span&gt; &lt;span class="attribute"&gt;--&lt;/span&gt;&lt;span class="markup"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="markup"&gt;&amp;lt;/p:translate&lt;/span&gt;&lt;span class="markup"&gt;&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;L'attribut &lt;code&gt;native&lt;/code&gt; sert à spécifier la chaine à traduire et les paramètres destinés à l'interpolation sont spécifiés avec la construction &lt;code&gt;with-param&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Voici un exemple d'utilisation :&lt;/p&gt;

&lt;pre class="html"&gt;&lt;code&gt;&lt;span class="markup"&gt;&amp;lt;p:translate&lt;/span&gt; &lt;span class="attribute"&gt;native&lt;/span&gt;=&lt;span class="attribute"&gt;&lt;span class="string"&gt;&amp;quot;Posted on :date by !name&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class="markup"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="markup"&gt;&amp;lt;p:with-param&lt;/span&gt; &lt;span class="attribute"&gt;name&lt;/span&gt;=&lt;span class="attribute"&gt;&lt;span class="string"&gt;&amp;quot;date&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class="markup"&gt;&amp;gt;&lt;/span&gt;&lt;span class="markup"&gt;&amp;lt;time&lt;/span&gt; &lt;span class="attribute"&gt;datetime&lt;/span&gt;=&lt;span class="attribute"&gt;&lt;span class="string"&gt;&amp;quot;#{@date}&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class="attribute"&gt;pubdate&lt;/span&gt;=&lt;span class="attribute"&gt;&lt;span class="string"&gt;&amp;quot;pubdate&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class="markup"&gt;&amp;gt;&lt;/span&gt;#{@date.format_date()}&lt;span class="markup"&gt;&amp;lt;/time&lt;/span&gt;&lt;span class="markup"&gt;&amp;gt;&lt;/span&gt;&lt;span class="markup"&gt;&amp;lt;/p:with-param&lt;/span&gt;&lt;span class="markup"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="markup"&gt;&amp;lt;p:with-param&lt;/span&gt; &lt;span class="attribute"&gt;name&lt;/span&gt;=&lt;span class="attribute"&gt;&lt;span class="string"&gt;&amp;quot;name&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class="attribute"&gt;select&lt;/span&gt;=&lt;span class="attribute"&gt;&lt;span class="string"&gt;&amp;quot;@user.name&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class="attribute"&gt;/&lt;/span&gt;&lt;span class="markup"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="markup"&gt;&amp;lt;/p:translate&lt;/span&gt;&lt;span class="markup"&gt;&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;La chaine est traduite et interpolée par la méthode &lt;a href="http://icanboogie.org/docs/function-ICanBoogie.I18n.t.html" target="_blank"&gt;t()&lt;/a&gt; du paquet &lt;a href="https://github.com/ICanBoogie/I18n"&gt;ICanBoogie/I18n&lt;/a&gt;.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/wdblog/~4/_4QtgdgGyqg" height="1" width="1"/&gt;</content>
	<feedburner:origLink>http://www.weirdog.com/blog/patron/balise-tranductions-interpolees.html</feedburner:origLink></entry>
	<entry>
		<title>Masquer l'illustration d'une actualité comportant une vidéo</title>
		<link href="http://feedproxy.google.com/~r/wdblog/~3/dY1GtQe48ac/masquer-lillustration-dune-actualite-comportant-une-video.html" />
		<id>tag:weirdog.com,2013-04-04:masquer-lillustration-dune-actualite-comportant-une-video</id>
		<updated>2013-04-10T08:45:48Europe/Paris</updated>
		<published>2013-04-04T17:22:02Europe/Paris</published>
						<content type="html" xml:lang="fr">&lt;p&gt;Sur le site &lt;a href="http://www.transitionspro.fr" target="_blank"&gt;Transitions&lt;/a&gt;, les actualités sont accompagnées d'une vignette que l'on doit masquer lorsque l'&lt;a href="http://www.transitionspro.fr/decouvrez-transitions/actualites/2013-02-interview-papaz.html" target="_blank"&gt;actualité contient une vidéo&lt;/a&gt;.
Pour cela on peut utiliser le nom de classe &lt;code&gt;node-id&lt;/code&gt; présent sur la balise &lt;code&gt;BODY&lt;/code&gt; pour sélectivement cacher les illustrations de ce type d'actualités :&lt;/p&gt;

&lt;pre class="css"&gt;&lt;code&gt;body.node-id-164 .view--news--view .illustration {
    display: node;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;C'est simple, mais cela devient vite pénible lorsque l'on ajoute souvent des actualités accompagnées de vidéo, notamment parce que le client n'est pas autonome et qu'il nous faut intervenir pour mettre à jour la feuille de style par &lt;span class="caps"&gt;FTP&lt;/span&gt;. Bref, c'est simple mais c'est nul. Heureusement, on peut arranger tout ça en quelques lignes.&lt;/p&gt;

&lt;h2&gt;Une solution automatique&lt;/h2&gt;

&lt;p&gt;Ce que l'on va faire, c'est ajouter la classe &lt;code&gt;has-video&lt;/code&gt; sur l'élément de vue qui affiche l'actualité, lorsque celle-ci comporte une vidéo. Une règle unique nous permettra de masquer les illustrations de ces actualités :&lt;/p&gt;

&lt;pre class="css"&gt;&lt;code&gt;.view--news--view.has-video .illustration {
    display: node;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Pour ajouter cette classe on va se servir de deux évènements. L'évènement &lt;code&gt;Icybee\Modules\Views\View::render:before&lt;/code&gt; est déclenché lorsqu'une vue s’apprête a être rendue. Lors de cet évènement on vérifie que la vue correspond à celle que nous souhaitons modifier, à savoir « news/view ». Si la vue correspond, on attache une fonction de rappel sur l'évènement &lt;code&gt;Icybee\Modules\News\News::alter_css_class_names&lt;/code&gt;. Nous n'aurons plus qu'à ajouter la classe &lt;code&gt;has-video&lt;/code&gt; aux noms de classe de l'actualité si son corps contient une balise &lt;span class="caps"&gt;IFRAME&lt;/span&gt;. On oubliera pas de détacher l'évènement une fois terminé afin d'éviter qu'il soit appelé en dehors du rendu de la vue.&lt;/p&gt;

&lt;pre class="php"&gt;&lt;code&gt;&lt;span class="delimiter"&gt;&amp;lt;?php&lt;/span&gt;

&lt;span class="reserved"&gt;use&lt;/span&gt; Icybee\Modules\Views\View;
&lt;span class="reserved"&gt;use&lt;/span&gt; Icybee\Modules\News\News;

&lt;span class="variable"&gt;$core&lt;/span&gt;&lt;span class="symbol"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="variable"&gt;events&lt;/span&gt;&lt;span class="symbol"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="function"&gt;attach&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="function"&gt;function&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;View\Be&lt;span class="reserved"&gt;for&lt;/span&gt;eRenderEvent &lt;span class="variable"&gt;$event&lt;/span&gt;, View &lt;span class="variable"&gt;$target&lt;/span&gt;&lt;span class="symbol"&gt;)&lt;/span&gt; &lt;span class="function"&gt;use&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="variable"&gt;$core&lt;/span&gt;&lt;span class="symbol"&gt;)&lt;/span&gt;
&lt;span class="symbol"&gt;{&lt;/span&gt;
    &lt;span class="reserved"&gt;if&lt;/span&gt; &lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="variable"&gt;$event&lt;/span&gt;&lt;span class="symbol"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="variable"&gt;id&lt;/span&gt; &lt;span class="symbol"&gt;!=&lt;/span&gt; &lt;span class="string"&gt;'news/view'&lt;/span&gt;&lt;span class="symbol"&gt;)&lt;/span&gt;
    &lt;span class="symbol"&gt;{&lt;/span&gt;
        &lt;span class="reserved"&gt;return&lt;/span&gt;;
    &lt;span class="symbol"&gt;}&lt;/span&gt;

    &lt;span class="variable"&gt;$eh&lt;/span&gt; &lt;span class="symbol"&gt;=&lt;/span&gt; &lt;span class="variable"&gt;$core&lt;/span&gt;&lt;span class="symbol"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="variable"&gt;events&lt;/span&gt;&lt;span class="symbol"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="function"&gt;attach&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="function"&gt;function&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;\Icybee\AlterCSSCl&lt;span class="reserved"&gt;as&lt;/span&gt;sNamesEvent &lt;span class="variable"&gt;$event&lt;/span&gt;, News &lt;span class="variable"&gt;$target&lt;/span&gt;&lt;span class="symbol"&gt;)&lt;/span&gt; &lt;span class="function"&gt;use&lt;/span&gt;&lt;span class="symbol"&gt;(&amp;amp;&lt;/span&gt;&lt;span class="variable"&gt;$eh&lt;/span&gt;&lt;span class="symbol"&gt;)&lt;/span&gt; &lt;span class="symbol"&gt;{&lt;/span&gt;

        &lt;span class="reserved"&gt;if&lt;/span&gt; &lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="function"&gt;strpos&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="variable"&gt;$target&lt;/span&gt;&lt;span class="symbol"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="variable"&gt;body&lt;/span&gt;, &lt;span class="string"&gt;'&amp;lt;iframe '&lt;/span&gt;&lt;span class="symbol"&gt;)&lt;/span&gt; &lt;span class="symbol"&gt;!==&lt;/span&gt; &lt;span class="reserved"&gt;false&lt;/span&gt;&lt;span class="symbol"&gt;)&lt;/span&gt;
        &lt;span class="symbol"&gt;{&lt;/span&gt;
            &lt;span class="variable"&gt;$event&lt;/span&gt;&lt;span class="symbol"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="variable"&gt;names[&lt;/span&gt;&lt;span class="string"&gt;'has-video'&lt;/span&gt;&lt;span class="symbol"&gt;]&lt;/span&gt; &lt;span class="symbol"&gt;=&lt;/span&gt; &lt;span class="reserved"&gt;true&lt;/span&gt;;
        &lt;span class="symbol"&gt;}&lt;/span&gt;

        &lt;span class="variable"&gt;$eh&lt;/span&gt;&lt;span class="symbol"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="function"&gt;detach&lt;/span&gt;&lt;span class="symbol"&gt;()&lt;/span&gt;;

    &lt;span class="symbol"&gt;})&lt;/span&gt;;
&lt;span class="symbol"&gt;})&lt;/span&gt;;&lt;/code&gt;&lt;/pre&gt;
&lt;img src="http://feeds.feedburner.com/~r/wdblog/~4/dY1GtQe48ac" height="1" width="1"/&gt;</content>
	<feedburner:origLink>http://www.weirdog.com/blog/icybee/masquer-lillustration-dune-actualite-comportant-une-video.html</feedburner:origLink></entry>
	<entry>
		<title>Exporter des propriétés privées durant serialize()</title>
		<link href="http://feedproxy.google.com/~r/wdblog/~3/8M0Q61lVVhQ/serialize-private-properties.html" />
		<id>tag:weirdog.com,2013-03-19:serialize-private-properties</id>
		<updated>2013-03-19T14:19:41Europe/Paris</updated>
		<published>2013-03-19T13:14:16Europe/Paris</published>
						<content type="html" xml:lang="fr">&lt;p&gt;Depuis que j'ai ajouté le support de &lt;a href="https://github.com/ICanBoogie/DateTime"&gt;ICanBoogie/DateTime&lt;/a&gt; au paquet
&lt;a href="https://github.com/ICanBoogie/ActiveRecord"&gt;ActiveRecord&lt;/a&gt;, je souhaitais que les propriétés de type &lt;em&gt;datetime&lt;/em&gt; soient
toujours des instances de &lt;a href="https://github.com/ICanBoogie/DateTime"&gt;ICanBoogie/DateTime&lt;/a&gt;.
Parce que les dates venant de la base de données sont des chaines de caractères, je souhaitais que l'on puisse poser
une chaine de caractère ou une instance de &lt;a href="http://php.net/manual/fr/class.datetime.php" target="_blank"&gt;DateTime&lt;/a&gt;, mais qu'à la lecture
on obtienne toujours une instance de &lt;a href="https://github.com/ICanBoogie/DateTime"&gt;ICanBoogie/DateTime&lt;/a&gt;, même pour les dates &lt;em&gt;vides&lt;/em&gt;.
Rien de bien compliqué puisque les instances d'&lt;a href="https://github.com/ICanBoogie/ActiveRecord/blob/master/lib/activerecord.php"&gt;ActiveRecord&lt;/a&gt;
étendent &lt;a href="https://github.com/ICanBoogie/Prototype/blob/master/lib/object.php"&gt;Object&lt;/a&gt; et qu'il est donc très simple
d'ajouter des getter et des setters.&lt;/p&gt;

&lt;p&gt;Par exemple, pour la propriété &lt;code&gt;created_at&lt;/code&gt;, il suffit d'ajouter le getter &lt;code&gt;volatile_get_created_at&lt;/code&gt; et le setter
&lt;code&gt;volatile_set_created_at&lt;/code&gt; et de rendre la propriété privée. De cette façon le getter et
le setter sont toujours appelés puisque la propriété n'est accessible que depuis la classe qui la définie. Il ne restait plus qu'à ajouter &lt;code&gt;created_at&lt;/code&gt; au
tableau renvoyé par &lt;code&gt;__sleep&lt;/code&gt; pour que la propriété soit exportée lors de la sérialisation de l'objet. Tout allait pour le mieux jusqu'à ce
ce que je créé une sous-classes et que j'essaie d'en sérialiser une instance, et là patatras :&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Notice: serialize(): « created_at » returned as member  variable from __sleep() but does not exist …&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Damned, c'est tout pourrit !&lt;/p&gt;

&lt;h2&gt;Export problématique des propriété privées&lt;/h2&gt;

&lt;p&gt;Il semble que les propriétés privées d'une super classe ne peuvent pas être exportées. Le rapport de bug &lt;a href="https://bugs.php.net/bug.php?id=40412&amp;amp;thanks=6"&gt;40412&lt;/a&gt;, qui date déjà de 2007, en fait mention. Lorsque l'on &lt;a href="https://www.google.fr/search?q=Notice%3A+serialize+returned+as+member++variable+from+__sleep+but+does+not+exist"&gt;cherche ce message d'erreur&lt;/a&gt; sur Google, il y a pas mal de retours, notamment Symphony2 et Doctrine. On conseille en général d'utiliser la visibilité protégée… mais cela ne fait pas du tout mon affaire parce que j'ai besoin de la visibilité privée pour que le getter et le setter correspondants soient appelés.&lt;/p&gt;

&lt;p&gt;J'étais triste et quasiment prêt à saisir quelques commandes git pour revenir en arrière quand j'ai pensé à la méthode &lt;code&gt;from()&lt;/code&gt; de ma classe &lt;a href="https://github.com/ICanBoogie/Prototype/blob/master/lib/object.php"&gt;Object&lt;/a&gt;. En effet, il y a quelques temps j'avais écris cette méthode pour me permettre de créer des instances de classes à la manière du mode &lt;a href="http://www.php.net/manual/fr/pdostatement.fetch.php" target="_blank"&gt;&lt;span class="caps"&gt;FETCH&lt;/span&gt;_CLASS&lt;/a&gt; de &lt;span class="caps"&gt;PDO&lt;/span&gt; . Vous pouvez &lt;a href="http://weirdog.com/blog/php/creer-instance-pdo-fetch-class.html" target="_blank"&gt;consulter mon article&lt;/a&gt; à ce sujet. Après tout, j'arrivais bien à créer des propriétés protégées ou privées en fabriquant moi-même la chaine de sérialisation, ce qui me permettait de créer n'importe qu'elle instance avec comme source un tableau associatif :&lt;/p&gt;

&lt;pre class="php"&gt;&lt;code&gt;&lt;span class="delimiter"&gt;&amp;lt;?php&lt;/span&gt;

&lt;span class="reserved"&gt;class&lt;/span&gt; A &lt;span class="reserved"&gt;extends&lt;/span&gt; ICanBoogie\Object
&lt;span class="symbol"&gt;{&lt;/span&gt;
    &lt;span class="reserved"&gt;private&lt;/span&gt; &lt;span class="variable"&gt;$a&lt;/span&gt;;
&lt;span class="symbol"&gt;}&lt;/span&gt;

&lt;span class="variable"&gt;$a&lt;/span&gt; &lt;span class="symbol"&gt;=&lt;/span&gt; A::&lt;span class="function"&gt;from&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="function"&gt;array&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="string"&gt;'a'&lt;/span&gt; &lt;span class="symbol"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="string"&gt;&amp;quot;testing&amp;quot;&lt;/span&gt;&lt;span class="symbol"&gt;))&lt;/span&gt;;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;C'est en consultant le code de la fonction et en revoyant le message « but does not exist » que j'ai retrouvé l'espoir.&lt;/p&gt;

&lt;h2&gt;Un nouvel espoir&lt;/h2&gt;

&lt;p&gt;Parce que le nom d'une propriété protégée est préfixée par &lt;code&gt;"\x00*\x00"&lt;/code&gt; et que celui d'une propriété privée est préfixée
par &lt;code&gt;"\x00{$class}\x00"&lt;/code&gt;, où &lt;code&gt;{$class}&lt;/code&gt; est la classe définissant la propriété privée, peut-être que si je préfixe le nom
de la propriété cela pourrait marcher… J'avais trouvé la solution !&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Pour exporter une propriété privée, il convient de préfixer son nom par &lt;code&gt;"\x00{$class}\x00"&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;La fonctionnalité de mes rêves&lt;/h2&gt;

&lt;p&gt;La fonctionnalité dont j'avais si chèrement rêvé était maintenant devenue réalité. J'étais heureux.&lt;/p&gt;

&lt;pre class="php"&gt;&lt;code&gt;&lt;span class="delimiter"&gt;&amp;lt;?php&lt;/span&gt;

&lt;span class="reserved"&gt;namespace&lt;/span&gt; Icybee\Modules\Sites;

&lt;span class="reserved"&gt;use&lt;/span&gt; ICanBoogie\DateTime;

&lt;span class="reserved"&gt;class&lt;/span&gt; Site &lt;span class="reserved"&gt;extends&lt;/span&gt; \ICanBoogie\ActiveRecord
&lt;span class="symbol"&gt;{&lt;/span&gt;
    &lt;code class="comment"&gt;// …&lt;/code&gt;

    &lt;span class="reserved"&gt;public&lt;/span&gt; &lt;span class="reserved"&gt;function&lt;/span&gt; &lt;span class="function"&gt;__sleep&lt;/span&gt;&lt;span class="symbol"&gt;()&lt;/span&gt;
    &lt;span class="symbol"&gt;{&lt;/span&gt;
        &lt;span class="reserved"&gt;return&lt;/span&gt; &lt;span class="reserved"&gt;parent&lt;/span&gt;::&lt;span class="function"&gt;__sleep&lt;/span&gt;&lt;span class="symbol"&gt;()&lt;/span&gt; &lt;span class="symbol"&gt;+&lt;/span&gt; array
        &lt;span class="symbol"&gt;(&lt;/span&gt;
            &lt;span class="string"&gt;'created_at'&lt;/span&gt; &lt;span class="symbol"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="string"&gt;&amp;quot;\x00&amp;quot;&lt;/span&gt; . __CLASS__ . &lt;span class="string"&gt;&amp;quot;\x00created_at&amp;quot;&lt;/span&gt;
        &lt;span class="symbol"&gt;)&lt;/span&gt;;
    &lt;span class="symbol"&gt;}&lt;/span&gt;

    &lt;code class="comment"&gt;// …&lt;/code&gt;

    &lt;span class="reserved"&gt;private&lt;/span&gt; &lt;span class="variable"&gt;$created_at&lt;/span&gt;;

    &lt;span class="comment"&gt;/**
     * Returns the created time.
     *
     * @return \ICanBoogie\DateTime
     */&lt;/span&gt;
    &lt;span class="reserved"&gt;protected&lt;/span&gt; &lt;span class="reserved"&gt;function&lt;/span&gt; &lt;span class="function"&gt;volatile_get_created_at&lt;/span&gt;&lt;span class="symbol"&gt;()&lt;/span&gt;
    &lt;span class="symbol"&gt;{&lt;/span&gt;
        &lt;span class="variable"&gt;$time&lt;/span&gt; &lt;span class="symbol"&gt;=&lt;/span&gt; &lt;span class="variable"&gt;$this&lt;/span&gt;&lt;span class="symbol"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="variable"&gt;created_at&lt;/span&gt;;

        &lt;span class="reserved"&gt;if&lt;/span&gt; &lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="variable"&gt;$time&lt;/span&gt; instanceof DateTime&lt;span class="symbol"&gt;)&lt;/span&gt;
        &lt;span class="symbol"&gt;{&lt;/span&gt;
            &lt;span class="reserved"&gt;return&lt;/span&gt; &lt;span class="variable"&gt;$time&lt;/span&gt;;
        &lt;span class="symbol"&gt;}&lt;/span&gt;

        &lt;span class="reserved"&gt;return&lt;/span&gt; &lt;span class="variable"&gt;$this&lt;/span&gt;&lt;span class="symbol"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="variable"&gt;created_at&lt;/span&gt; &lt;span class="symbol"&gt;=&lt;/span&gt; &lt;span class="variable"&gt;$time&lt;/span&gt; &lt;span class="symbol"&gt;===&lt;/span&gt; null ? DateTime::&lt;span class="function"&gt;none&lt;/span&gt;&lt;span class="symbol"&gt;()&lt;/span&gt; : &lt;span class="reserved"&gt;new&lt;/span&gt; &lt;span class="function"&gt;DateTime&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="variable"&gt;$time&lt;/span&gt;, &lt;span class="string"&gt;'utc'&lt;/span&gt;&lt;span class="symbol"&gt;)&lt;/span&gt;;
    &lt;span class="symbol"&gt;}&lt;/span&gt;

    &lt;span class="comment"&gt;/**
     * Sets the created time.
     *
     * @param \DateTime|string $value
     */&lt;/span&gt;
    &lt;span class="reserved"&gt;protected&lt;/span&gt; &lt;span class="reserved"&gt;function&lt;/span&gt; &lt;span class="function"&gt;volatile_set_created_at&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="variable"&gt;$value&lt;/span&gt;&lt;span class="symbol"&gt;)&lt;/span&gt;
    &lt;span class="symbol"&gt;{&lt;/span&gt;
        &lt;span class="variable"&gt;$this&lt;/span&gt;&lt;span class="symbol"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="variable"&gt;created_at&lt;/span&gt; &lt;span class="symbol"&gt;=&lt;/span&gt; &lt;span class="variable"&gt;$value&lt;/span&gt;;
    &lt;span class="symbol"&gt;}&lt;/span&gt;

    &lt;code class="comment"&gt;// …&lt;/code&gt;
&lt;span class="symbol"&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;img src="http://feeds.feedburner.com/~r/wdblog/~4/8M0Q61lVVhQ" height="1" width="1"/&gt;</content>
	<feedburner:origLink>http://www.weirdog.com/blog/php/serialize-private-properties.html</feedburner:origLink></entry>
	<entry>
		<title>Singuliers, pluriels, acronymes, underscore... l'inflexion en PHP</title>
		<link href="http://feedproxy.google.com/~r/wdblog/~3/CsorqNYGawI/singularize-pluralize-inflexion-php.html" />
		<id>tag:weirdog.com,2013-03-15:singularize-pluralize-inflexion-php</id>
		<updated>2013-03-15T16:38:24Europe/Paris</updated>
		<published>2013-03-15T16:57:09Europe/Paris</published>
						<content type="html" xml:lang="fr">&lt;p&gt;Je viens d'adapter le nouvel &lt;a href="https://github.com/rails/rails/blob/master/activesupport/lib/active_support/inflector/methods.rb"&gt;inflecteur&lt;/a&gt; trop sexy de Ruby on Rails à &lt;span class="caps"&gt;PHP&lt;/span&gt;. Il permet de transformer les mots du singulier au pluriel, de l'underscore au &lt;em&gt;camel case&lt;/em&gt;, de transformer des mots en titres… en respectant les mots irréguliers et les acronymes. Les inflexions peuvent être étendues, surchargées et localisées. Des inflexions localisées sont actuellement disponibles pour l'Anglais, l'Espagnol, le Français et le Norvégien Bokmål. Il peut être installé avec Composer.&lt;/p&gt;

&lt;p&gt;Jetez un œil au dépôt &lt;a href="https://github.com/ICanBoogie/Inflector"&gt;ICanBoogie/Inflector&lt;/a&gt; sur GitHub !&lt;/p&gt;

&lt;h2&gt;Quelques exemples&lt;/h2&gt;

&lt;pre class="php"&gt;&lt;code&gt;&lt;span class="delimiter"&gt;&amp;lt;?php&lt;/span&gt;

&lt;span class="reserved"&gt;use&lt;/span&gt; ICanBoogie\Inflector;

&lt;span class="variable"&gt;$inflector&lt;/span&gt; &lt;span class="symbol"&gt;=&lt;/span&gt; Inflector::&lt;span class="function"&gt;get&lt;/span&gt;&lt;span class="symbol"&gt;()&lt;/span&gt;;

&lt;code class="comment"&gt;# pluralize&lt;/code&gt;

&lt;span class="variable"&gt;$inflector&lt;/span&gt;&lt;span class="symbol"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="function"&gt;pluralize&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="string"&gt;'post'&lt;/span&gt;&lt;span class="symbol"&gt;)&lt;/span&gt;;                       &lt;code class="comment"&gt;// &amp;quot;posts&amp;quot;&lt;/code&gt;
&lt;span class="variable"&gt;$inflector&lt;/span&gt;&lt;span class="symbol"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="function"&gt;pluralize&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="string"&gt;'child'&lt;/span&gt;&lt;span class="symbol"&gt;)&lt;/span&gt;;                      &lt;code class="comment"&gt;// &amp;quot;children&amp;quot;&lt;/code&gt;
&lt;span class="variable"&gt;$inflector&lt;/span&gt;&lt;span class="symbol"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="function"&gt;pluralize&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="string"&gt;'sheep'&lt;/span&gt;&lt;span class="symbol"&gt;)&lt;/span&gt;;                      &lt;code class="comment"&gt;// &amp;quot;sheep&amp;quot;&lt;/code&gt;
&lt;span class="variable"&gt;$inflector&lt;/span&gt;&lt;span class="symbol"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="function"&gt;pluralize&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="string"&gt;'words'&lt;/span&gt;&lt;span class="symbol"&gt;)&lt;/span&gt;;                      &lt;code class="comment"&gt;// &amp;quot;words&amp;quot;&lt;/code&gt;
&lt;span class="variable"&gt;$inflector&lt;/span&gt;&lt;span class="symbol"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="function"&gt;pluralize&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="string"&gt;'CamelChild'&lt;/span&gt;&lt;span class="symbol"&gt;)&lt;/span&gt;;                 &lt;code class="comment"&gt;// &amp;quot;CamelChildren&amp;quot;&lt;/code&gt;

&lt;code class="comment"&gt;# singularize&lt;/code&gt;

&lt;span class="variable"&gt;$inflector&lt;/span&gt;&lt;span class="symbol"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="function"&gt;singularize&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="string"&gt;'posts'&lt;/span&gt;&lt;span class="symbol"&gt;)&lt;/span&gt;;                    &lt;code class="comment"&gt;// &amp;quot;post&amp;quot;&lt;/code&gt;
&lt;span class="variable"&gt;$inflector&lt;/span&gt;&lt;span class="symbol"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="function"&gt;singularize&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="string"&gt;'children'&lt;/span&gt;&lt;span class="symbol"&gt;)&lt;/span&gt;;                 &lt;code class="comment"&gt;// &amp;quot;child&amp;quot;&lt;/code&gt;
&lt;span class="variable"&gt;$inflector&lt;/span&gt;&lt;span class="symbol"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="function"&gt;singularize&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="string"&gt;'sheep'&lt;/span&gt;&lt;span class="symbol"&gt;)&lt;/span&gt;;                    &lt;code class="comment"&gt;// &amp;quot;sheep&amp;quot;&lt;/code&gt;
&lt;span class="variable"&gt;$inflector&lt;/span&gt;&lt;span class="symbol"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="function"&gt;singularize&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="string"&gt;'word'&lt;/span&gt;&lt;span class="symbol"&gt;)&lt;/span&gt;;                     &lt;code class="comment"&gt;// &amp;quot;word&amp;quot;&lt;/code&gt;
&lt;span class="variable"&gt;$inflector&lt;/span&gt;&lt;span class="symbol"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="function"&gt;singularize&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="string"&gt;'CamelChildren'&lt;/span&gt;&lt;span class="symbol"&gt;)&lt;/span&gt;;            &lt;code class="comment"&gt;// &amp;quot;CamelChild&amp;quot;&lt;/code&gt;

&lt;code class="comment"&gt;# camelize&lt;/code&gt;

&lt;span class="variable"&gt;$inflector&lt;/span&gt;&lt;span class="symbol"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="function"&gt;camelize&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="string"&gt;'active_model'&lt;/span&gt;&lt;span class="symbol"&gt;)&lt;/span&gt;;                &lt;code class="comment"&gt;// 'ActiveModel'&lt;/code&gt;
&lt;span class="variable"&gt;$inflector&lt;/span&gt;&lt;span class="symbol"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="function"&gt;camelize&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="string"&gt;'active_model'&lt;/span&gt;, &lt;span class="reserved"&gt;true&lt;/span&gt;&lt;span class="symbol"&gt;)&lt;/span&gt;;          &lt;code class="comment"&gt;// 'activeModel'&lt;/code&gt;
&lt;span class="variable"&gt;$inflector&lt;/span&gt;&lt;span class="symbol"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="function"&gt;camelize&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="string"&gt;'active_model/errors'&lt;/span&gt;&lt;span class="symbol"&gt;)&lt;/span&gt;;         &lt;code class="comment"&gt;// 'ActiveModel\Errors'&lt;/code&gt;
&lt;span class="variable"&gt;$inflector&lt;/span&gt;&lt;span class="symbol"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="function"&gt;camelize&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="string"&gt;'active_model/errors'&lt;/span&gt;, &lt;span class="reserved"&gt;true&lt;/span&gt;&lt;span class="symbol"&gt;)&lt;/span&gt;;   &lt;code class="comment"&gt;// 'activeModel\Errors'&lt;/code&gt;

&lt;code class="comment"&gt;# underscore&lt;/code&gt;

&lt;span class="variable"&gt;$inflector&lt;/span&gt;&lt;span class="symbol"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="function"&gt;underscore&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="string"&gt;'ActiveModel'&lt;/span&gt;&lt;span class="symbol"&gt;)&lt;/span&gt;;               &lt;code class="comment"&gt;// 'active_model'&lt;/code&gt;
&lt;span class="variable"&gt;$inflector&lt;/span&gt;&lt;span class="symbol"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="function"&gt;underscore&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="string"&gt;'ActiveModel\Errors'&lt;/span&gt;&lt;span class="symbol"&gt;)&lt;/span&gt;;        &lt;code class="comment"&gt;// 'active_model/errors'&lt;/code&gt;

&lt;code class="comment"&gt;# humanize&lt;/code&gt;

&lt;span class="variable"&gt;$inflector&lt;/span&gt;&lt;span class="symbol"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="function"&gt;humanize&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="string"&gt;'employee_salary'&lt;/span&gt;&lt;span class="symbol"&gt;)&lt;/span&gt;;             &lt;code class="comment"&gt;// &amp;quot;Employee salary&amp;quot;&lt;/code&gt;
&lt;span class="variable"&gt;$inflector&lt;/span&gt;&lt;span class="symbol"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="function"&gt;humanize&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="string"&gt;'author_id'&lt;/span&gt;&lt;span class="symbol"&gt;)&lt;/span&gt;;                   &lt;code class="comment"&gt;// &amp;quot;Author&amp;quot;&lt;/code&gt;

&lt;code class="comment"&gt;# titleize&lt;/code&gt;

&lt;span class="variable"&gt;$inflector&lt;/span&gt;&lt;span class="symbol"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="function"&gt;titleize&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="string"&gt;'man from the boondocks'&lt;/span&gt;&lt;span class="symbol"&gt;)&lt;/span&gt;;      &lt;code class="comment"&gt;// &amp;quot;Man From The Boondocks&amp;quot;&lt;/code&gt;
&lt;span class="variable"&gt;$inflector&lt;/span&gt;&lt;span class="symbol"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="function"&gt;titleize&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="string"&gt;'x-men: the last stand'&lt;/span&gt;&lt;span class="symbol"&gt;)&lt;/span&gt;;       &lt;code class="comment"&gt;// &amp;quot;X Men: The Last Stand&amp;quot;&lt;/code&gt;
&lt;span class="variable"&gt;$inflector&lt;/span&gt;&lt;span class="symbol"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="function"&gt;titleize&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="string"&gt;'TheManWithoutAPast'&lt;/span&gt;&lt;span class="symbol"&gt;)&lt;/span&gt;;          &lt;code class="comment"&gt;// &amp;quot;The Man Without A Past&amp;quot;&lt;/code&gt;
&lt;span class="variable"&gt;$inflector&lt;/span&gt;&lt;span class="symbol"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="function"&gt;titleize&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="string"&gt;'raiders_of_the_lost_ark'&lt;/span&gt;&lt;span class="symbol"&gt;)&lt;/span&gt;;     &lt;code class="comment"&gt;// &amp;quot;Raiders Of The Lost Ark&amp;quot;&lt;/code&gt;

&lt;code class="comment"&gt;# ordinal&lt;/code&gt;

&lt;span class="variable"&gt;$inflector&lt;/span&gt;&lt;span class="symbol"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="function"&gt;ordinal&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="number"&gt;1&lt;/span&gt;&lt;span class="symbol"&gt;)&lt;/span&gt;;                              &lt;code class="comment"&gt;// &amp;quot;st&amp;quot;&lt;/code&gt;
&lt;span class="variable"&gt;$inflector&lt;/span&gt;&lt;span class="symbol"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="function"&gt;ordinal&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="number"&gt;2&lt;/span&gt;&lt;span class="symbol"&gt;)&lt;/span&gt;;                              &lt;code class="comment"&gt;// &amp;quot;nd&amp;quot;&lt;/code&gt;
&lt;span class="variable"&gt;$inflector&lt;/span&gt;&lt;span class="symbol"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="function"&gt;ordinal&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="number"&gt;1002&lt;/span&gt;&lt;span class="symbol"&gt;)&lt;/span&gt;;                           &lt;code class="comment"&gt;// &amp;quot;nd&amp;quot;&lt;/code&gt;
&lt;span class="variable"&gt;$inflector&lt;/span&gt;&lt;span class="symbol"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="function"&gt;ordinal&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="number"&gt;1003&lt;/span&gt;&lt;span class="symbol"&gt;)&lt;/span&gt;;                           &lt;code class="comment"&gt;// &amp;quot;rd&amp;quot;&lt;/code&gt;
&lt;span class="variable"&gt;$inflector&lt;/span&gt;&lt;span class="symbol"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="function"&gt;ordinal&lt;/span&gt;&lt;span class="symbol"&gt;(-&lt;/span&gt;&lt;span class="number"&gt;11&lt;/span&gt;&lt;span class="symbol"&gt;)&lt;/span&gt;;                            &lt;code class="comment"&gt;// &amp;quot;th&amp;quot;&lt;/code&gt;
&lt;span class="variable"&gt;$inflector&lt;/span&gt;&lt;span class="symbol"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="function"&gt;ordinal&lt;/span&gt;&lt;span class="symbol"&gt;(-&lt;/span&gt;&lt;span class="number"&gt;1021&lt;/span&gt;&lt;span class="symbol"&gt;)&lt;/span&gt;;                          &lt;code class="comment"&gt;// &amp;quot;st&amp;quot;&lt;/code&gt;

&lt;code class="comment"&gt;# ordinalize&lt;/code&gt;

&lt;span class="variable"&gt;$inflector&lt;/span&gt;&lt;span class="symbol"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="function"&gt;ordinalize&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="number"&gt;1&lt;/span&gt;&lt;span class="symbol"&gt;)&lt;/span&gt;;                           &lt;code class="comment"&gt;// &amp;quot;1st&amp;quot;&lt;/code&gt;
&lt;span class="variable"&gt;$inflector&lt;/span&gt;&lt;span class="symbol"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="function"&gt;ordinalize&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="number"&gt;2&lt;/span&gt;&lt;span class="symbol"&gt;)&lt;/span&gt;;                           &lt;code class="comment"&gt;// &amp;quot;2nd&amp;quot;&lt;/code&gt;
&lt;span class="variable"&gt;$inflector&lt;/span&gt;&lt;span class="symbol"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="function"&gt;ordinalize&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="number"&gt;1002&lt;/span&gt;&lt;span class="symbol"&gt;)&lt;/span&gt;;                        &lt;code class="comment"&gt;// &amp;quot;1002nd&amp;quot;&lt;/code&gt;
&lt;span class="variable"&gt;$inflector&lt;/span&gt;&lt;span class="symbol"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="function"&gt;ordinalize&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="number"&gt;1003&lt;/span&gt;&lt;span class="symbol"&gt;)&lt;/span&gt;;                        &lt;code class="comment"&gt;// &amp;quot;1003rd&amp;quot;&lt;/code&gt;
&lt;span class="variable"&gt;$inflector&lt;/span&gt;&lt;span class="symbol"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="function"&gt;ordinalize&lt;/span&gt;&lt;span class="symbol"&gt;(-&lt;/span&gt;&lt;span class="number"&gt;11&lt;/span&gt;&lt;span class="symbol"&gt;)&lt;/span&gt;;                         &lt;code class="comment"&gt;// &amp;quot;-11th&amp;quot;&lt;/code&gt;
&lt;span class="variable"&gt;$inflector&lt;/span&gt;&lt;span class="symbol"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="function"&gt;ordinalize&lt;/span&gt;&lt;span class="symbol"&gt;(-&lt;/span&gt;&lt;span class="number"&gt;1021&lt;/span&gt;&lt;span class="symbol"&gt;)&lt;/span&gt;;                       &lt;code class="comment"&gt;// &amp;quot;-1021st&amp;quot;&lt;/code&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Des &lt;em&gt;helpeurs&lt;/em&gt; permettent d'utiliser très simplement les inflexions localisées :&lt;/p&gt;

&lt;pre class="php"&gt;&lt;code&gt;&lt;span class="delimiter"&gt;&amp;lt;?php&lt;/span&gt;

&lt;span class="reserved"&gt;namespace&lt;/span&gt; ICanBoogie;

&lt;span class="reserved"&gt;echo&lt;/span&gt; &lt;span class="function"&gt;pluralize&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="string"&gt;'child'&lt;/span&gt;&lt;span class="symbol"&gt;)&lt;/span&gt;;                             &lt;code class="comment"&gt;// &amp;quot;children&amp;quot;&lt;/code&gt;
&lt;span class="reserved"&gt;echo&lt;/span&gt; &lt;span class="function"&gt;pluralize&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="string"&gt;'genou'&lt;/span&gt;, &lt;span class="string"&gt;'fr'&lt;/span&gt;&lt;span class="symbol"&gt;)&lt;/span&gt;;                       &lt;code class="comment"&gt;// &amp;quot;genoux&amp;quot;&lt;/code&gt;
&lt;span class="reserved"&gt;echo&lt;/span&gt; &lt;span class="function"&gt;singularize&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="string"&gt;'lærere'&lt;/span&gt;, &lt;span class="string"&gt;'nb'&lt;/span&gt;&lt;span class="symbol"&gt;)&lt;/span&gt;;                    &lt;code class="comment"&gt;// &amp;quot;lærer&amp;quot;&lt;/code&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;img src="http://feeds.feedburner.com/~r/wdblog/~4/CsorqNYGawI" height="1" width="1"/&gt;</content>
	<feedburner:origLink>http://www.weirdog.com/blog/icanboogie/singularize-pluralize-inflexion-php.html</feedburner:origLink></entry>
	<entry>
		<title>À la rescousse des requêtes HEAD</title>
		<link href="http://feedproxy.google.com/~r/wdblog/~3/fa4L_ybfUTw/rescousse-requetes-head.html" />
		<id>tag:weirdog.com,2013-03-05:rescousse-requetes-head</id>
		<updated>2013-03-05T15:47:40Europe/Paris</updated>
		<published>2013-03-05T14:37:49Europe/Paris</published>
						<content type="html" xml:lang="fr">&lt;p&gt;Il m'embêtait ce robot « &lt;a href="https://www.facebook.com/externalhit_uatext.php"&gt;facebookexternalhit&lt;/a&gt; » à réclamer les entêtes des miniatures générées par le module &lt;a href="https://github.com/Icybee/module-thumbnailer"&gt;Thumbnailer&lt;/a&gt; d'&lt;a href="http://icybee.org/" target="_blank"&gt;Icybee&lt;/a&gt;. La méthode &lt;code&gt;GET&lt;/code&gt; permet d'obtenir une miniature, mais point de méthode &lt;code&gt;HEAD&lt;/code&gt;. Comme je préfère les solutions qui profitent à tout le monde, et que je n'avais pas envie d'ajouter tout un tas de routes supplémentaires, j'ai modifié le &lt;a href="http://icanboogie.org/docs/class-ICanBoogie.HTTP.Dispatcher.html" target="_blank"&gt;dispatcher &lt;span class="caps"&gt;HTTP&lt;/span&gt;&lt;/a&gt; pour qu'il tente de secourir les requêtes &lt;code&gt;HEAD&lt;/code&gt; non implémentées.&lt;/p&gt;

&lt;p&gt;Depuis le commit &lt;a href="https://github.com/ICanBoogie/HTTP/commit/e9a169bd82ac441dfa0e136ebe2fd16a96e22359"&gt;e9a169b&lt;/a&gt;, le &lt;a href="http://icanboogie.org/docs/class-ICanBoogie.HTTP.Dispatcher.html" target="_blank"&gt;dispatcher &lt;span class="caps"&gt;HTTP&lt;/span&gt;&lt;/a&gt; tente de secourir les requêtes &lt;code&gt;HEAD&lt;/code&gt; dont le traitement soulève une exception &lt;a href="http://icanboogie.org/docs/class-ICanBoogie.HTTP.NotFound.html" target="_blank"&gt;NotFound&lt;/a&gt;. En effet, ni vu ni connu, le dispatcher clone la requête et la traite à nouveau avec cette fois la méthode &lt;code&gt;GET&lt;/code&gt;. Si le résultat est une &lt;a href="http://icanboogie.org/docs/class-ICanBoogie.HTTP.Response.html" target="_blank"&gt;réponse&lt;/a&gt;, alors il retourne une nouvelle réponse créée à partir des entêtes du résultat. Et voilà !&lt;/p&gt;

&lt;p&gt;Donc, s'il existe un contrôleur capable de renvoyer une réponse pour une requête &lt;code&gt;GET&lt;/code&gt;, alors on peut en extraire les entêtes pour répondre automatiquement à une requête &lt;code&gt;HEAD&lt;/code&gt;. Bien sûr, rien n'empêche d'ajouter un contrôleur pour traiter les requêtes &lt;code&gt;HEAD&lt;/code&gt; soit même.&lt;/p&gt;

&lt;pre class="php"&gt;&lt;code&gt;&lt;span class="delimiter"&gt;&amp;lt;?php&lt;/span&gt;

&lt;span class="reserved"&gt;namespace&lt;/span&gt; ICanBoogie\HTTP;

&lt;span class="reserved"&gt;class&lt;/span&gt; Dispatcher implements IDispatcher
&lt;span class="symbol"&gt;{&lt;/span&gt;
    &lt;code class="comment"&gt;// …&lt;/code&gt;

    &lt;span class="reserved"&gt;public&lt;/span&gt; &lt;span class="reserved"&gt;function&lt;/span&gt; &lt;span class="function"&gt;__invoke&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;Request &lt;span class="variable"&gt;$request&lt;/span&gt;&lt;span class="symbol"&gt;)&lt;/span&gt;
    &lt;span class="symbol"&gt;{&lt;/span&gt;
        try
        &lt;span class="symbol"&gt;{&lt;/span&gt;
            &lt;span class="reserved"&gt;return&lt;/span&gt; &lt;span class="variable"&gt;$this&lt;/span&gt;&lt;span class="symbol"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="function"&gt;dispatch&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="variable"&gt;$request&lt;/span&gt;&lt;span class="symbol"&gt;)&lt;/span&gt;;
        &lt;span class="symbol"&gt;}&lt;/span&gt;
        catch &lt;span class="symbol"&gt;(&lt;/span&gt;\Exception &lt;span class="variable"&gt;$e&lt;/span&gt;&lt;span class="symbol"&gt;)&lt;/span&gt;
        &lt;span class="symbol"&gt;{&lt;/span&gt;
            &lt;span class="reserved"&gt;if&lt;/span&gt; &lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="variable"&gt;$request&lt;/span&gt;&lt;span class="symbol"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="variable"&gt;method&lt;/span&gt; &lt;span class="symbol"&gt;===&lt;/span&gt; Request::METHOD_HEAD &lt;span class="symbol"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="variable"&gt;$e&lt;/span&gt; instanceof NotFound&lt;span class="symbol"&gt;)&lt;/span&gt;
            &lt;span class="symbol"&gt;{&lt;/span&gt;
                &lt;span class="variable"&gt;$get_request&lt;/span&gt; &lt;span class="symbol"&gt;=&lt;/span&gt; clone &lt;span class="variable"&gt;$request&lt;/span&gt;;
                &lt;span class="variable"&gt;$get_request&lt;/span&gt;&lt;span class="symbol"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="variable"&gt;method&lt;/span&gt; &lt;span class="symbol"&gt;=&lt;/span&gt; Request::METHOD_GET;

                &lt;span class="variable"&gt;$response&lt;/span&gt; &lt;span class="symbol"&gt;=&lt;/span&gt; &lt;span class="variable"&gt;$this&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="variable"&gt;$get_request&lt;/span&gt;&lt;span class="symbol"&gt;)&lt;/span&gt;;

                &lt;span class="reserved"&gt;if&lt;/span&gt; &lt;span class="symbol"&gt;(!(&lt;/span&gt;&lt;span class="variable"&gt;$response&lt;/span&gt; instanceof Response&lt;span class="symbol"&gt;))&lt;/span&gt;
                &lt;span class="symbol"&gt;{&lt;/span&gt;
                    &lt;span class="reserved"&gt;return&lt;/span&gt; &lt;span class="variable"&gt;$response&lt;/span&gt;;
                &lt;span class="symbol"&gt;}&lt;/span&gt;

                &lt;span class="reserved"&gt;return&lt;/span&gt; &lt;span class="reserved"&gt;new&lt;/span&gt; &lt;span class="function"&gt;Response&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;null, &lt;span class="variable"&gt;$response&lt;/span&gt;&lt;span class="symbol"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="variable"&gt;status&lt;/span&gt;, &lt;span class="variable"&gt;$response&lt;/span&gt;&lt;span class="symbol"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="variable"&gt;headers&lt;/span&gt;&lt;span class="symbol"&gt;)&lt;/span&gt;;
            &lt;span class="symbol"&gt;}&lt;/span&gt;

            &lt;span class="reserved"&gt;return&lt;/span&gt; &lt;span class="variable"&gt;$this&lt;/span&gt;&lt;span class="symbol"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="function"&gt;rescue&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="variable"&gt;$e&lt;/span&gt;, &lt;span class="variable"&gt;$request&lt;/span&gt;&lt;span class="symbol"&gt;)&lt;/span&gt;;
        &lt;span class="symbol"&gt;}&lt;/span&gt;
    &lt;span class="symbol"&gt;}&lt;/span&gt;

    &lt;code class="comment"&gt;// …&lt;/code&gt;
&lt;span class="symbol"&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;img src="http://feeds.feedburner.com/~r/wdblog/~4/fa4L_ybfUTw" height="1" width="1"/&gt;</content>
	<feedburner:origLink>http://www.weirdog.com/blog/icanboogie/rescousse-requetes-head.html</feedburner:origLink></entry>
	<entry>
		<title>Manipuler les dates comme un boss avec ICanBoogie/DateTime</title>
		<link href="http://feedproxy.google.com/~r/wdblog/~3/C-xEub198OQ/icanboogie-datetime.html" />
		<id>tag:weirdog.com,2013-02-17:icanboogie-datetime</id>
		<updated>2013-03-13T09:13:01Europe/Paris</updated>
		<published>2013-02-17T15:00:14Europe/Paris</published>
						<content type="html" xml:lang="fr">&lt;p&gt;Le paquet &lt;a href="https://github.com/ICanBoogie/DateTime"&gt;DateTime&lt;/a&gt; du framework &lt;a href="http://icanboogie.org/" target="_blank"&gt;ICanBoogie&lt;/a&gt; étend les capacités des classes &lt;a href="http://www.php.net/manual/en/class.datetime.php" target="_blank"&gt;DateTime&lt;/a&gt; et &lt;a href="http://www.php.net/manual/en/class.datetimezone.php" target="_blank"&gt;DateTimeZone&lt;/a&gt; de &lt;span class="caps"&gt;PHP&lt;/span&gt;. Les classes qui composent le paquet facilitent le travail avec les dates et les heures, les fuseaux horaires ainsi que les emplacements des fuseaux horaires.&lt;/p&gt;

&lt;p&gt;De nombreuses propriétés magiques permettent d'obtenir le jour, le mois, l'année, le fuseau horaire de l'instance… mais aussi de les manipuler. Le formatage des dates et des heures est facilité par de nombreux raccourcis. Des propriétés magiques permettent également de vérifier simplement certaines conditions . Toutes les instances peuvent être utilisées comme des chaînes de caractères. Enfin, le paquet est continuellement testé par &lt;a href="http://about.travis-ci.org/" target="_blank"&gt;Travis CI&lt;/a&gt; et peut-être installé par &lt;a href="http://getcomposer.org/" target="_blank"&gt;Composer&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://travis-ci.org/ICanBoogie/DateTime"&gt;&lt;img src="https://travis-ci.org/ICanBoogie/DateTime.png?branch=master" alt="Build Status" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;Quelques exemples&lt;/h2&gt;

&lt;p&gt;Disons que nous sommes le « 2013-02-03 21:03:45 » à Paris:&lt;/p&gt;

&lt;pre class="php"&gt;&lt;code&gt;&lt;span class="delimiter"&gt;&amp;lt;?php&lt;/span&gt;

&lt;span class="reserved"&gt;use&lt;/span&gt; ICanBoogie\DateTime;

&lt;span class="function"&gt;date_default_timezone_set&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="string"&gt;'EST'&lt;/span&gt;&lt;span class="symbol"&gt;)&lt;/span&gt;; &lt;code class="comment"&gt;// set local time zone to Eastern Standard Time&lt;/code&gt;

&lt;span class="variable"&gt;$time&lt;/span&gt; &lt;span class="symbol"&gt;=&lt;/span&gt; &lt;span class="reserved"&gt;new&lt;/span&gt; &lt;span class="function"&gt;DateTime&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="string"&gt;'now'&lt;/span&gt;, &lt;span class="string"&gt;'Europe/Paris'&lt;/span&gt;&lt;span class="symbol"&gt;)&lt;/span&gt;;

&lt;span class="reserved"&gt;echo&lt;/span&gt; &lt;span class="variable"&gt;$time&lt;/span&gt;;                             &lt;code class="comment"&gt;// 2013-02-03T21:03:45+0100&lt;/code&gt;
&lt;span class="reserved"&gt;echo&lt;/span&gt; &lt;span class="variable"&gt;$time&lt;/span&gt;&lt;span class="symbol"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="variable"&gt;utc&lt;/span&gt;;                        &lt;code class="comment"&gt;// 2013-02-03T20:03:45Z&lt;/code&gt;
&lt;span class="reserved"&gt;echo&lt;/span&gt; &lt;span class="variable"&gt;$time&lt;/span&gt;&lt;span class="symbol"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="variable"&gt;local&lt;/span&gt;;                      &lt;code class="comment"&gt;// 2013-02-03T15:03:45-0500&lt;/code&gt;
&lt;span class="reserved"&gt;echo&lt;/span&gt; &lt;span class="variable"&gt;$time&lt;/span&gt;&lt;span class="symbol"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="variable"&gt;utc&lt;/span&gt;&lt;span class="symbol"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="variable"&gt;local&lt;/span&gt;;                 &lt;code class="comment"&gt;// 2013-02-03T15:03:45-0500&lt;/code&gt;
&lt;span class="reserved"&gt;echo&lt;/span&gt; &lt;span class="variable"&gt;$time&lt;/span&gt;&lt;span class="symbol"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="variable"&gt;utc&lt;/span&gt;&lt;span class="symbol"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="variable"&gt;is_utc&lt;/span&gt;;                &lt;code class="comment"&gt;// true&lt;/code&gt;
&lt;span class="reserved"&gt;echo&lt;/span&gt; &lt;span class="variable"&gt;$time&lt;/span&gt;&lt;span class="symbol"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="variable"&gt;utc&lt;/span&gt;&lt;span class="symbol"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="variable"&gt;is_local&lt;/span&gt;;              &lt;code class="comment"&gt;// false&lt;/code&gt;
&lt;span class="reserved"&gt;echo&lt;/span&gt; &lt;span class="variable"&gt;$time&lt;/span&gt;&lt;span class="symbol"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="variable"&gt;local&lt;/span&gt;&lt;span class="symbol"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="variable"&gt;is_utc&lt;/span&gt;;              &lt;code class="comment"&gt;// false&lt;/code&gt;
&lt;span class="reserved"&gt;echo&lt;/span&gt; &lt;span class="variable"&gt;$time&lt;/span&gt;&lt;span class="symbol"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="variable"&gt;local&lt;/span&gt;&lt;span class="symbol"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="variable"&gt;is_local&lt;/span&gt;;            &lt;code class="comment"&gt;// true&lt;/code&gt;
&lt;span class="reserved"&gt;echo&lt;/span&gt; &lt;span class="variable"&gt;$time&lt;/span&gt;&lt;span class="symbol"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="variable"&gt;is_dst&lt;/span&gt;;                     &lt;code class="comment"&gt;// false&lt;/code&gt;

&lt;span class="reserved"&gt;echo&lt;/span&gt; &lt;span class="variable"&gt;$time&lt;/span&gt;&lt;span class="symbol"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="variable"&gt;as_rss&lt;/span&gt;;                     &lt;code class="comment"&gt;// Sun, 03 Feb 2013 21:03:45 +0100&lt;/code&gt;
&lt;span class="reserved"&gt;echo&lt;/span&gt; &lt;span class="variable"&gt;$time&lt;/span&gt;&lt;span class="symbol"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="variable"&gt;as_db&lt;/span&gt;;                      &lt;code class="comment"&gt;// 2013-02-03 21:03:45&lt;/code&gt;

&lt;span class="reserved"&gt;echo&lt;/span&gt; &lt;span class="variable"&gt;$time&lt;/span&gt;&lt;span class="symbol"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="variable"&gt;as_time&lt;/span&gt;;                    &lt;code class="comment"&gt;// 21:03:45&lt;/code&gt;
&lt;span class="reserved"&gt;echo&lt;/span&gt; &lt;span class="variable"&gt;$time&lt;/span&gt;&lt;span class="symbol"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="variable"&gt;utc&lt;/span&gt;&lt;span class="symbol"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="variable"&gt;as_time&lt;/span&gt;;               &lt;code class="comment"&gt;// 20:03:45&lt;/code&gt;
&lt;span class="reserved"&gt;echo&lt;/span&gt; &lt;span class="variable"&gt;$time&lt;/span&gt;&lt;span class="symbol"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="variable"&gt;local&lt;/span&gt;&lt;span class="symbol"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="variable"&gt;as_time&lt;/span&gt;;             &lt;code class="comment"&gt;// 15:03:45&lt;/code&gt;
&lt;span class="reserved"&gt;echo&lt;/span&gt; &lt;span class="variable"&gt;$time&lt;/span&gt;&lt;span class="symbol"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="variable"&gt;utc&lt;/span&gt;&lt;span class="symbol"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="variable"&gt;local&lt;/span&gt;&lt;span class="symbol"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="variable"&gt;as_time&lt;/span&gt;;        &lt;code class="comment"&gt;// 15:03:45&lt;/code&gt;

&lt;span class="reserved"&gt;echo&lt;/span&gt; &lt;span class="variable"&gt;$time&lt;/span&gt;&lt;span class="symbol"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="variable"&gt;quarter&lt;/span&gt;;                    &lt;code class="comment"&gt;// 1&lt;/code&gt;
&lt;span class="reserved"&gt;echo&lt;/span&gt; &lt;span class="variable"&gt;$time&lt;/span&gt;&lt;span class="symbol"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="variable"&gt;week&lt;/span&gt;;                       &lt;code class="comment"&gt;// 5&lt;/code&gt;
&lt;span class="reserved"&gt;echo&lt;/span&gt; &lt;span class="variable"&gt;$time&lt;/span&gt;&lt;span class="symbol"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="variable"&gt;day&lt;/span&gt;;                        &lt;code class="comment"&gt;// 3&lt;/code&gt;
&lt;span class="reserved"&gt;echo&lt;/span&gt; &lt;span class="variable"&gt;$time&lt;/span&gt;&lt;span class="symbol"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="variable"&gt;minute&lt;/span&gt;;                     &lt;code class="comment"&gt;// 3&lt;/code&gt;
&lt;span class="reserved"&gt;echo&lt;/span&gt; &lt;span class="variable"&gt;$time&lt;/span&gt;&lt;span class="symbol"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="variable"&gt;is_monday&lt;/span&gt;;                  &lt;code class="comment"&gt;// false&lt;/code&gt;
&lt;span class="reserved"&gt;echo&lt;/span&gt; &lt;span class="variable"&gt;$time&lt;/span&gt;&lt;span class="symbol"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="variable"&gt;is_saturday&lt;/span&gt;;                &lt;code class="comment"&gt;// true&lt;/code&gt;
&lt;span class="reserved"&gt;echo&lt;/span&gt; &lt;span class="variable"&gt;$time&lt;/span&gt;&lt;span class="symbol"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="variable"&gt;is_today&lt;/span&gt;;                   &lt;code class="comment"&gt;// true&lt;/code&gt;
&lt;span class="reserved"&gt;echo&lt;/span&gt; &lt;span class="variable"&gt;$time&lt;/span&gt;&lt;span class="symbol"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="variable"&gt;tomorrow&lt;/span&gt;;                   &lt;code class="comment"&gt;// 2013-02-04T00:00:00+0100&lt;/code&gt;
&lt;span class="reserved"&gt;echo&lt;/span&gt; &lt;span class="variable"&gt;$time&lt;/span&gt;&lt;span class="symbol"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="variable"&gt;tomorrow&lt;/span&gt;&lt;span class="symbol"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="variable"&gt;is_future&lt;/span&gt;         &lt;code class="comment"&gt;// true&lt;/code&gt;
&lt;span class="reserved"&gt;echo&lt;/span&gt; &lt;span class="variable"&gt;$time&lt;/span&gt;&lt;span class="symbol"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="variable"&gt;yesterday&lt;/span&gt;;                  &lt;code class="comment"&gt;// 2013-02-02T00:00:00+0100&lt;/code&gt;
&lt;span class="reserved"&gt;echo&lt;/span&gt; &lt;span class="variable"&gt;$time&lt;/span&gt;&lt;span class="symbol"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="variable"&gt;yesterday&lt;/span&gt;&lt;span class="symbol"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="variable"&gt;is_past&lt;/span&gt;          &lt;code class="comment"&gt;// true&lt;/code&gt;
&lt;span class="reserved"&gt;echo&lt;/span&gt; &lt;span class="variable"&gt;$time&lt;/span&gt;&lt;span class="symbol"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="variable"&gt;monday&lt;/span&gt;;                     &lt;code class="comment"&gt;// 2013-01-28T00:00:00+0100&lt;/code&gt;
&lt;span class="reserved"&gt;echo&lt;/span&gt; &lt;span class="variable"&gt;$time&lt;/span&gt;&lt;span class="symbol"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="variable"&gt;sunday&lt;/span&gt;;                     &lt;code class="comment"&gt;// 2013-02-03T00:00:00+0100&lt;/code&gt;

&lt;span class="reserved"&gt;echo&lt;/span&gt; &lt;span class="variable"&gt;$time&lt;/span&gt;&lt;span class="symbol"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="variable"&gt;timestamp&lt;/span&gt;;                  &lt;code class="comment"&gt;// 1359921825&lt;/code&gt;
&lt;span class="reserved"&gt;echo&lt;/span&gt; &lt;span class="variable"&gt;$time&lt;/span&gt;;                             &lt;code class="comment"&gt;// 2013-02-03T21:03:45+0100&lt;/code&gt;
&lt;span class="variable"&gt;$time&lt;/span&gt;&lt;span class="symbol"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="variable"&gt;timestamp&lt;/span&gt; &lt;span class="symbol"&gt;+=&lt;/span&gt; &lt;span class="number"&gt;3600&lt;/span&gt; &lt;span class="symbol"&gt;*&lt;/span&gt; &lt;span class="number"&gt;4&lt;/span&gt;;
&lt;span class="reserved"&gt;echo&lt;/span&gt; &lt;span class="variable"&gt;$time&lt;/span&gt;;                             &lt;code class="comment"&gt;// 2013-02-04T01:03:45+0100&lt;/code&gt;

&lt;span class="reserved"&gt;echo&lt;/span&gt; &lt;span class="variable"&gt;$time&lt;/span&gt;&lt;span class="symbol"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="variable"&gt;zone&lt;/span&gt;;                       &lt;code class="comment"&gt;// Europe/Paris&lt;/code&gt;
&lt;span class="reserved"&gt;echo&lt;/span&gt; &lt;span class="variable"&gt;$time&lt;/span&gt;&lt;span class="symbol"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="variable"&gt;zone&lt;/span&gt;&lt;span class="symbol"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="variable"&gt;offset&lt;/span&gt;;               &lt;code class="comment"&gt;// 3600&lt;/code&gt;
&lt;span class="reserved"&gt;echo&lt;/span&gt; &lt;span class="variable"&gt;$time&lt;/span&gt;&lt;span class="symbol"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="variable"&gt;zone&lt;/span&gt;&lt;span class="symbol"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="variable"&gt;location&lt;/span&gt;;             &lt;code class="comment"&gt;// FR,48.86667,2.33333&lt;/code&gt;
&lt;span class="reserved"&gt;echo&lt;/span&gt; &lt;span class="variable"&gt;$time&lt;/span&gt;&lt;span class="symbol"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="variable"&gt;zone&lt;/span&gt;&lt;span class="symbol"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="variable"&gt;location&lt;/span&gt;&lt;span class="symbol"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="variable"&gt;latitude&lt;/span&gt;;   &lt;code class="comment"&gt;// 48.86667&lt;/code&gt;
&lt;span class="variable"&gt;$time&lt;/span&gt;&lt;span class="symbol"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="variable"&gt;zone&lt;/span&gt; &lt;span class="symbol"&gt;=&lt;/span&gt; &lt;span class="string"&gt;'Asia/Tokyo'&lt;/span&gt;;
&lt;span class="reserved"&gt;echo&lt;/span&gt; &lt;span class="variable"&gt;$time&lt;/span&gt;;                             &lt;code class="comment"&gt;// 2013-02-04T09:03:45+0900&lt;/code&gt;

&lt;span class="variable"&gt;$time&lt;/span&gt;&lt;span class="symbol"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="variable"&gt;hour&lt;/span&gt; &lt;span class="symbol"&gt;+=&lt;/span&gt; &lt;span class="number"&gt;72&lt;/span&gt;;
&lt;span class="reserved"&gt;echo&lt;/span&gt; &lt;span class="string"&gt;&amp;quot;Rendez-vous in 72 hours: $time&amp;quot;&lt;/span&gt;;  &lt;code class="comment"&gt;// Rendez-vous in 72 hours: 2013-02-07T05:03:45+0900&lt;/code&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;h2&gt;Dates &lt;em&gt;vides&lt;/em&gt;&lt;/h2&gt;

&lt;p&gt;Afin de faciliter le travail avec MySQL, les dates &lt;em&gt;vides&lt;/em&gt; comme &lt;code&gt;0000-00-00 00:00:00&lt;/code&gt; sont supportées.&lt;/p&gt;

&lt;pre class="php"&gt;&lt;code&gt;&lt;span class="delimiter"&gt;&amp;lt;?php&lt;/span&gt;

&lt;span class="variable"&gt;$time&lt;/span&gt; &lt;span class="symbol"&gt;=&lt;/span&gt; &lt;span class="reserved"&gt;new&lt;/span&gt; &lt;span class="function"&gt;DateTime&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="string"&gt;'0000-00-00'&lt;/span&gt;, &lt;span class="string"&gt;'utc'&lt;/span&gt;&lt;span class="symbol"&gt;)&lt;/span&gt;;
&lt;code class="comment"&gt;// or&lt;/code&gt;
&lt;span class="variable"&gt;$time&lt;/span&gt; &lt;span class="symbol"&gt;=&lt;/span&gt; DateTime::&lt;span class="function"&gt;none&lt;/span&gt;&lt;span class="symbol"&gt;()&lt;/span&gt;;
&lt;span class="reserved"&gt;echo&lt;/span&gt; &lt;span class="variable"&gt;$time&lt;/span&gt;;                             &lt;code class="comment"&gt;// -0001-11-30T00:00:00Z&lt;/code&gt;
&lt;span class="reserved"&gt;echo&lt;/span&gt; &lt;span class="variable"&gt;$time&lt;/span&gt;&lt;span class="symbol"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="variable"&gt;is_empty&lt;/span&gt;;                   &lt;code class="comment"&gt;// true&lt;/code&gt;
&lt;span class="reserved"&gt;echo&lt;/span&gt; &lt;span class="variable"&gt;$time&lt;/span&gt;&lt;span class="symbol"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="variable"&gt;as_date&lt;/span&gt;;                    &lt;code class="comment"&gt;// 0000-00-00&lt;/code&gt;
&lt;span class="reserved"&gt;echo&lt;/span&gt; &lt;span class="variable"&gt;$time&lt;/span&gt;&lt;span class="symbol"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="variable"&gt;as_db&lt;/span&gt;;                      &lt;code class="comment"&gt;// 0000-00-00 00:00:00&lt;/code&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Pour en savoir plus, notamment découvrir les classes qui constituent ce paquet, merci de consulter son &lt;a href="https://github.com/ICanBoogie/DateTime#readme"&gt;&lt;span class="caps"&gt;README&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/wdblog/~4/C-xEub198OQ" height="1" width="1"/&gt;</content>
	<feedburner:origLink>http://www.weirdog.com/blog/icanboogie/icanboogie-datetime.html</feedburner:origLink></entry>
	<entry>
		<title>Implémenter belongs_to en quelques lignes grâce à Prototype</title>
		<link href="http://feedproxy.google.com/~r/wdblog/~3/YmXCvt77cF0/implementer-belongs-to-avec-prototype.html" />
		<id>tag:weirdog.com,2013-02-14:implementer-belongs-to-avec-prototype</id>
		<updated>2013-02-27T14:59:19Europe/Paris</updated>
		<published>2013-02-14T11:20:22Europe/Paris</published>
						<content type="html" xml:lang="fr">&lt;p&gt;L'implémentation d'ActiveRecord dans &lt;a href="http://icanboogie.org" target="_blank"&gt;ICanBoogie&lt;/a&gt; permet de faire beaucoup de choses, notamment en terme de construction de requêtes, malheureusement la partie association péchait un peu. Aujourd'hui, la situation s'arrange quelque peu avec l'implémentation de la relation &lt;em&gt;appartient à&lt;/em&gt; (&lt;em&gt;belongs to&lt;/em&gt;), et comme vous allez le voir cela a été très simple à mettre en œuvre grâce aux fonctionnalités de &lt;a href="https://github.com/ICanBoogie/Prototype"&gt;Prototype&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;Définir une relation d'appartenance&lt;/h2&gt;

&lt;p&gt;L'attribut &lt;code&gt;BELONGS_TO&lt;/code&gt; permet de définir une relation d'appartenance. Considérons un modèle « guests » définit comme suit :&lt;/p&gt;

&lt;pre class="php"&gt;&lt;code&gt;&lt;span class="delimiter"&gt;&amp;lt;?php&lt;/span&gt;

&lt;span class="reserved"&gt;use&lt;/span&gt; ICanBoogie\ActiveRecord\Model;

&lt;span class="variable"&gt;$guests_attributes&lt;/span&gt; &lt;span class="symbol"&gt;=&lt;/span&gt; array
&lt;span class="symbol"&gt;(&lt;/span&gt;
    Model::BELONGS_TO &lt;span class="symbol"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="string"&gt;'events'&lt;/span&gt;,
    Model::SCHEMA &lt;span class="symbol"&gt;=&amp;gt;&lt;/span&gt; array
    &lt;span class="symbol"&gt;(&lt;/span&gt;
        &lt;span class="string"&gt;'fields'&lt;/span&gt; &lt;span class="symbol"&gt;=&amp;gt;&lt;/span&gt; array
        &lt;span class="symbol"&gt;(&lt;/span&gt;
            &lt;span class="string"&gt;'event_id'&lt;/span&gt; &lt;span class="symbol"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="function"&gt;array&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="string"&gt;'foreign'&lt;/span&gt;, &lt;span class="string"&gt;'primary'&lt;/span&gt; &lt;span class="symbol"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="reserved"&gt;true&lt;/span&gt;&lt;span class="symbol"&gt;)&lt;/span&gt;,
            &lt;span class="string"&gt;'email'&lt;/span&gt; &lt;span class="symbol"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="function"&gt;array&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="string"&gt;'varchar'&lt;/span&gt;, &lt;span class="string"&gt;'primary'&lt;/span&gt; &lt;span class="symbol"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="reserved"&gt;true&lt;/span&gt;&lt;span class="symbol"&gt;)&lt;/span&gt;,
            &lt;code class="comment"&gt;// …&lt;/code&gt;
        &lt;span class="symbol"&gt;)&lt;/span&gt;
    &lt;span class="symbol"&gt;)&lt;/span&gt;
&lt;span class="symbol"&gt;)&lt;/span&gt;;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Ici, l'attribut &lt;code&gt;BELONGS_TO&lt;/code&gt; définit que les enregistrements du modèle « guests » appartiennent à des enregistrements du modèle « events ». Il s'agit d'une relation simple, établie à partir du champ &lt;code&gt;event_id&lt;/code&gt;, qui est aussi la clé primaire du modèle « events » :&lt;/p&gt;

&lt;pre class="php"&gt;&lt;code&gt;&lt;span class="delimiter"&gt;&amp;lt;?php&lt;/span&gt;

&lt;span class="reserved"&gt;use&lt;/span&gt; ICanBoogie\ActiveRecord\Model;

&lt;span class="variable"&gt;$events_attributes&lt;/span&gt; &lt;span class="symbol"&gt;=&lt;/span&gt; array
&lt;span class="symbol"&gt;(&lt;/span&gt;
    Model::SCHEMA &lt;span class="symbol"&gt;=&amp;gt;&lt;/span&gt; array
    &lt;span class="symbol"&gt;(&lt;/span&gt;
        &lt;span class="string"&gt;'fields'&lt;/span&gt; &lt;span class="symbol"&gt;=&amp;gt;&lt;/span&gt; array
        &lt;span class="symbol"&gt;(&lt;/span&gt;
            &lt;span class="string"&gt;'event_id'&lt;/span&gt; &lt;span class="symbol"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="string"&gt;'serial'&lt;/span&gt;,
            &lt;code class="comment"&gt;// …&lt;/code&gt;
        &lt;span class="symbol"&gt;)&lt;/span&gt;
    &lt;span class="symbol"&gt;)&lt;/span&gt;
&lt;span class="symbol"&gt;)&lt;/span&gt;;&lt;/code&gt;&lt;/pre&gt;

&lt;h2&gt;Ajout automatique du getter correspondant&lt;/h2&gt;

&lt;p&gt;Lorsque l'attribut est défini, un getter est automatiquement ajouté au prototype des enregistrements du modèle. Par exemple, pour le modèle « events » le getter &lt;code&gt;get_event&lt;/code&gt; sera ajouté, ce qui permettra d'obtenir l'objet &lt;em&gt;évènement&lt;/em&gt; auquel appartient un invité par la propriété magique  &lt;code&gt;event&lt;/code&gt;.&lt;/p&gt;

&lt;pre class="php"&gt;&lt;code&gt;&lt;span class="delimiter"&gt;&amp;lt;?php&lt;/span&gt;

&lt;span class="variable"&gt;$guest&lt;/span&gt; &lt;span class="symbol"&gt;=&lt;/span&gt; &lt;span class="variable"&gt;$core&lt;/span&gt;&lt;span class="symbol"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="variable"&gt;models[&lt;/span&gt;&lt;span class="string"&gt;'guest'&lt;/span&gt;&lt;span class="symbol"&gt;]-&amp;gt;&lt;/span&gt;&lt;span class="variable"&gt;one&lt;/span&gt;;

&lt;span class="function"&gt;var_dump&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="variable"&gt;$guest&lt;/span&gt;&lt;span class="symbol"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="variable"&gt;event&lt;/span&gt;&lt;span class="symbol"&gt;)&lt;/span&gt;;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Voici le code qui a était ajouté à la classe &lt;code&gt;Model&lt;/code&gt; :&lt;/p&gt;

&lt;pre class="php"&gt;&lt;code&gt;&lt;span class="delimiter"&gt;&amp;lt;?php&lt;/span&gt;

&lt;span class="reserved"&gt;namespace&lt;/span&gt; ICanBoogie\ActiveRecord;

&lt;span class="reserved"&gt;use&lt;/span&gt; ICanBoogie\ActiveRecord;

&lt;span class="reserved"&gt;class&lt;/span&gt; Model &lt;span class="reserved"&gt;extends&lt;/span&gt; Table implements \ArrayAccess
&lt;span class="symbol"&gt;{&lt;/span&gt;
    &lt;code class="comment"&gt;// …&lt;/code&gt;

    &lt;span class="reserved"&gt;public&lt;/span&gt; &lt;span class="reserved"&gt;function&lt;/span&gt; &lt;span class="function"&gt;belongs_to&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="variable"&gt;$belongs_to&lt;/span&gt;&lt;span class="symbol"&gt;)&lt;/span&gt;
    &lt;span class="symbol"&gt;{&lt;/span&gt;
        &lt;span class="variable"&gt;$activerecord_class&lt;/span&gt; &lt;span class="symbol"&gt;=&lt;/span&gt; &lt;span class="variable"&gt;$this&lt;/span&gt;&lt;span class="symbol"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="variable"&gt;activerecord_class&lt;/span&gt;;
        &lt;span class="variable"&gt;$getter_name&lt;/span&gt; &lt;span class="symbol"&gt;=&lt;/span&gt; &lt;span class="string"&gt;'get_'&lt;/span&gt; . &lt;span class="function"&gt;\ICanBoogie\singularize&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="variable"&gt;$belongs_to&lt;/span&gt;&lt;span class="symbol"&gt;)&lt;/span&gt;;

        &lt;span class="reserved"&gt;if&lt;/span&gt; &lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="variable"&gt;$activerecord_class&lt;/span&gt; &lt;span class="symbol"&gt;==&lt;/span&gt; &lt;span class="string"&gt;'ICanBoogie\ActiveRecord'&lt;/span&gt;&lt;span class="symbol"&gt;)&lt;/span&gt;
        &lt;span class="symbol"&gt;{&lt;/span&gt;
            throw &lt;span class="reserved"&gt;new&lt;/span&gt; &lt;span class="function"&gt;ActiveRecordException&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="string"&gt;'The Active Record class cannot be &amp;lt;code&amp;gt;ICanBoogie\ActiveRecord&amp;lt;/code&amp;gt; for a &amp;lt;em&amp;gt;belongs to&amp;lt;/em&amp;gt; relationship.'&lt;/span&gt;&lt;span class="symbol"&gt;)&lt;/span&gt;;
        &lt;span class="symbol"&gt;}&lt;/span&gt;

        &lt;span class="variable"&gt;$prototype&lt;/span&gt; &lt;span class="symbol"&gt;=&lt;/span&gt; \ICanBoogie\Prototype::&lt;span class="function"&gt;get&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="variable"&gt;$activerecord_class&lt;/span&gt;&lt;span class="symbol"&gt;)&lt;/span&gt;;

        &lt;span class="variable"&gt;$prototype[&lt;/span&gt;&lt;span class="variable"&gt;$getter_name]&lt;/span&gt; &lt;span class="symbol"&gt;=&lt;/span&gt; &lt;span class="function"&gt;function&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;ActiveRecord &lt;span class="variable"&gt;$ar&lt;/span&gt;&lt;span class="symbol"&gt;)&lt;/span&gt; &lt;span class="function"&gt;use&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="variable"&gt;$belongs_to&lt;/span&gt;&lt;span class="symbol"&gt;)&lt;/span&gt;
        &lt;span class="symbol"&gt;{&lt;/span&gt;
            &lt;span class="variable"&gt;$model&lt;/span&gt; &lt;span class="symbol"&gt;=&lt;/span&gt; &lt;span class="function"&gt;get_model&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="variable"&gt;$belongs_to&lt;/span&gt;&lt;span class="symbol"&gt;)&lt;/span&gt;;
            &lt;span class="variable"&gt;$primary&lt;/span&gt; &lt;span class="symbol"&gt;=&lt;/span&gt; &lt;span class="variable"&gt;$model&lt;/span&gt;&lt;span class="symbol"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="variable"&gt;primary&lt;/span&gt;;
            &lt;span class="variable"&gt;$key&lt;/span&gt; &lt;span class="symbol"&gt;=&lt;/span&gt; &lt;span class="variable"&gt;$ar&lt;/span&gt;&lt;span class="symbol"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="variable"&gt;$primary&lt;/span&gt;;

            &lt;span class="reserved"&gt;return&lt;/span&gt; &lt;span class="variable"&gt;$key&lt;/span&gt; ? &lt;span class="variable"&gt;$model[&lt;/span&gt;&lt;span class="variable"&gt;$key]&lt;/span&gt; : null;
        &lt;span class="symbol"&gt;}&lt;/span&gt;;
    &lt;span class="symbol"&gt;}&lt;/span&gt;

    &lt;code class="comment"&gt;// …&lt;/code&gt;
&lt;span class="symbol"&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Avec cette dizaine de lignes, les active record n'auront plus à définir de getter pour leurs relations d'appartenance. Pratique.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/wdblog/~4/YmXCvt77cF0" height="1" width="1"/&gt;</content>
	<feedburner:origLink>http://www.weirdog.com/blog/icanboogie/implementer-belongs-to-avec-prototype.html</feedburner:origLink></entry>
	<entry>
		<title>transitionspro.fr tourne sous Icybee</title>
		<link href="http://feedproxy.google.com/~r/wdblog/~3/Eq7JEm5AR1U/transitionspro-tourne-icybee.html" />
		<id>tag:weirdog.com,2013-02-01:transitionspro-tourne-icybee</id>
		<updated>2013-02-01T09:56:37Europe/Paris</updated>
		<published>2013-02-01T09:53:03Europe/Paris</published>
						<content type="html" xml:lang="fr">&lt;p&gt;Le site dédié aux professionnels de l'optique de Transitions tourne maintenant sous &lt;a href="http://icybee.org"&gt;Icybee&lt;/a&gt; !&lt;/p&gt;
&lt;p align="center"&gt;
&lt;a href="http://www.transitionspro.fr"&gt;
&lt;img src="http://weirdog.com/repository/files/image/487-transitions.jpeg" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;On y retrouve des informations sur la marque et sur sa technologie de verres à teinte variable, mais la plus grande partie du site n'est accessible que pour les membres du club.&lt;/p&gt;
&lt;p&gt;Une réalisation spéciale puisqu'il s'agit du premier site réalisé avec &lt;a href="http://icybee.org"&gt;Icybee&lt;/a&gt; chez &lt;a href="http://www.monkees.fr"&gt;Monkees&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.transitionspro.fr"&gt;www.transitionspro.fr&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/wdblog/~4/Eq7JEm5AR1U" height="1" width="1"/&gt;</content>
	<feedburner:origLink>http://www.weirdog.com/blog/icybee/transitionspro-tourne-icybee.html</feedburner:origLink></entry>
	<entry>
		<title>Icybee plait à mes nouveaux collègues</title>
		<link href="http://feedproxy.google.com/~r/wdblog/~3/yEQh10-dOz4/icybee-plait-collegues.html" />
		<id>tag:weirdog.com,2012-12-19:icybee-plait-collegues</id>
		<updated>2012-12-19T14:39:58Europe/Paris</updated>
		<published>2012-12-19T14:30:25Europe/Paris</published>
						<content type="html" xml:lang="fr">&lt;p&gt;Cela fait trois mois que j'ai quitté &lt;a href="http://www.hima360.com/"&gt;Hima360&lt;/a&gt; pour rejoindre &lt;a href="http://www.monkees.fr/"&gt;Monkees&lt;/a&gt;, pour la première fois nous utilisons mon CMS &lt;a href="http://icybee.org/"&gt;Icybee&lt;/a&gt; afin de répondre au mieux et au plus vite aux exigences d'un gros projet, et voici le mot que je viens de recevoir d'une de mes collègues :&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;Dis, je voulais te dire, plus je l'utilise, plus je trouve ton CMS top, hyper fluide, facile à utiliser, clair...&lt;br /&gt;Dommage qu'on ait pas d'autres projets en vue avec BO mais pour les prochains, fini Drupal! Vive Icybee!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Ça fait plaisir :) Vivement les prochains projets !&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/wdblog/~4/yEQh10-dOz4" height="1" width="1"/&gt;</content>
	<feedburner:origLink>http://www.weirdog.com/blog/icybee/icybee-plait-collegues.html</feedburner:origLink></entry>
	<entry>
		<title>cuisinevirtuelle.fr, mon premier projet chez Monkees</title>
		<link href="http://feedproxy.google.com/~r/wdblog/~3/NagHq1A2k5U/cuisinevirtuelle.html" />
		<id>tag:weirdog.com,2012-12-06:cuisinevirtuelle</id>
		<updated>2012-12-06T14:52:17Europe/Paris</updated>
		<published>2012-12-06T11:53:50Europe/Paris</published>
						<content type="html" xml:lang="fr">&lt;p&gt;Mon premier projet chez &lt;a href="http://www.monkees.fr/"&gt;Monkees&lt;/a&gt; est enfin en ligne ! Il s'agit d'une cuisine virtuelle qui permet d'évaluer son repas en fonction de son type de diabète. C'est aussi mon premier projet avec &lt;a href="http://silex.sensiolabs.org/"&gt;Silex&lt;/a&gt;, alors c'est doublement chouette. Le site utilise également mes logiciels &lt;a href="http://brickrouge.org/"&gt;Brickrouge&lt;/a&gt; (pour générer les éléments HTML et faire vivre les widgets) et &lt;a href="https://github.com/ICanBoogie/ActiveRecord/"&gt;ICanBoogie\ActiveRecord&lt;/a&gt; (pour l'ORM).&lt;/p&gt;
&lt;p&gt;Venez donc découvrir la &lt;a href="http://www.cuisinevirtuelle.fr/"&gt;cuisine virtuelle&lt;/a&gt; des laboratoires Roche !&lt;/p&gt;
&lt;p align="center"&gt;&lt;a href="http://www.cuisinevirtuelle.fr"&gt;
&lt;img src="http://weirdog.com/api/images/483/thumbnail?w=600&amp;amp;method=fixed-width&amp;amp;format=jpeg&amp;amp;quality=95&amp;amp;background=" width="600" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/wdblog/~4/NagHq1A2k5U" height="1" width="1"/&gt;</content>
	<feedburner:origLink>http://www.weirdog.com/blog/la-vie/cuisinevirtuelle.html</feedburner:origLink></entry>
</feed>
