<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet title="XSL formatting" type="text/xsl" href="http://www.morefnu.org/feed/rss2/xslt" ?><rss version="2.0"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xmlns:wfw="http://wellformedweb.org/CommentAPI/"
  xmlns:content="http://purl.org/rss/1.0/modules/content/"
  xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
  <title>Morefnu.org</title>
  <link>http://www.morefnu.org/</link>
  <atom:link href="http://www.morefnu.org/feed/rss2" rel="self" type="application/rss+xml"/>
  <description>Dyslexics have more fnu!</description>
  <language>fr</language>
  <pubDate>Tue, 07 Feb 2012 09:48:08 +0100</pubDate>
  <copyright></copyright>
  <docs>http://blogs.law.harvard.edu/tech/rss</docs>
  <generator>Dotclear</generator>
  
    
  <item>
    <title>Nouvelles du front</title>
    <link>http://www.morefnu.org/post/2010/12/10/Nouvelles-du-front</link>
    <guid isPermaLink="false">urn:md5:1ea3728ada8b3247457c67ccc382dddd</guid>
    <pubDate>Fri, 10 Dec 2010 09:39:00 +0100</pubDate>
    <dc:creator>Dsls</dc:creator>
        <category>Dotclear 2</category>
            
    <description>    &lt;p&gt;Peu de nouvelles sur ce blog, cependant beaucoup de boulot en coulisses.&lt;/p&gt;


&lt;p&gt;Sur dotclear : il y a actuellement plusieurs réflexions internes sur certains point du core :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;La refonte de l'interface d'administration, qui donne lieu à pas mal de discussions passionnées en ce moment en interne&lt;/li&gt;
&lt;li&gt;La refonte du gestionnaire de médias, encore à l'état de discussions, mais les grandes lignes se dégagent&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;J'ai pour ma part testé quelques pistes expérimentales concernant le moteur de templates du core de dotclear, avec pour objectif un remplacement pur et simple par un moteur qui a le vent en poupe en ce moment, à savoir &lt;a href=&quot;http://www.twig-project.org/&quot;&gt;Twig&lt;/a&gt;. L'idée est bien sûr d'assurer une rétro-compatibilité avec la syntaxe actuelle des thèmes, et de permettre de rendre les templates plus flexibles notamment grâce aux mécanismes d'héritages proposés en natif par Twig.&lt;/p&gt;


&lt;p&gt;Ces travaux sur le core sont assez chronophages, mais je vois passer ça et là quelques questions sur Gallery et MyMeta.&lt;/p&gt;


&lt;p&gt;Le plugin MyMeta va prochainement sortir dans une nouvelle version, corrigeant quelques bugs signalés.&lt;/p&gt;


&lt;p&gt;Quant à Gallery, il est probable qu'il soit (encore) revu à bas niveau.
Resituons le contexte :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Une galerie est un billet, dont les métadonnées pointent vers des billets-images (via la table dc_meta). Une miniature de présentation de la galerie est alors un média attaché à la galerie (via la table dc_post_media)&lt;/li&gt;
&lt;li&gt;Un billet-image est un billet d'un type particulier, qui contient en pièce jointe le média concerné (via la table post_media).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Le problème de cette situation est qu'il est indispensable d'avoir des billets-images pour créer une galerie. Le choix avait été à l'époque de ne pas toucher aux tables natives de dotclear.&lt;/p&gt;


&lt;p&gt;Je suis en train de songer à un changement de modèle :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Une galerie est un billet, dont les images sont directement des pièces jointes (table dc_post_media)&lt;/li&gt;
&lt;li&gt;Si on souhaite activer les descriptions/commentaires sur une image, on crée alors un billet-image associé à cette image.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Cela rend alors le passage par les billets-images facultatif.&lt;/p&gt;


&lt;p&gt;Pour cette évolution, la table &amp;quot;dc_post_media&amp;quot; sera probablement étendue : une nouvelle colonne qualifiant le lien billet-image sera définie (lien type pièce-jointe, lien type &amp;quot;embedded&amp;quot;, miniature de présentation, image de galerie, ...), et peut-être même aussi une colonne de position de ce lien.&lt;/p&gt;


&lt;p&gt;Autre point : on ne peut pas associer directement une image à une galerie actuellement : il faut que l'image corresponde au filtre défini par la galerie. Cela déroute un peu les utilisateurs. Je songe à définir 2 types de galerie : les galeries &amp;quot;dynamiques&amp;quot;, auxquelles sont associées les images dynamiquement selon un certain nombre de filtres (en gros, les galeries telles qu'elles sont définies dans la version actuelle), et les galeries statiques, où il faudra faire le lien galerie-image à la main.&lt;/p&gt;


&lt;p&gt;Coté dates, la seule réponse que j'aurais est &amp;quot;courant 2011&amp;quot;, pour le moment le temps libre est rare, et les travaux niveau core vont monopoliser pas mal de ce temps ...&lt;/p&gt;</description>
    
    
    
          <comments>http://www.morefnu.org/post/2010/12/10/Nouvelles-du-front#comment-form</comments>
      <wfw:comment>http://www.morefnu.org/post/2010/12/10/Nouvelles-du-front#comment-form</wfw:comment>
      <wfw:commentRss>http://www.morefnu.org/feed/atom/comments/1980</wfw:commentRss>
      </item>
    
  <item>
    <title>Ajouter des fonctions au plugin ExpAt</title>
    <link>http://www.morefnu.org/post/2010/09/24/Ajouter-des-fonctions-au-plugin-ExpAt</link>
    <guid isPermaLink="false">urn:md5:6972a582d3a217ffef4c53643ea10275</guid>
    <pubDate>Fri, 24 Sep 2010 09:26:00 +0200</pubDate>
    <dc:creator>Dsls</dc:creator>
        <category>ExpAt</category>
            
    <description>    &lt;p&gt;ExpAt est extensible. La version actuelle possède un nombre minimal de fonctions/objets, mais elle s'enrichira au cours du temps.&lt;/p&gt;


&lt;p&gt;Il reste toutefois possible dans la version actuelle du plugin, d'ajouter ses propres fonctions, via le _public.php de son thème ou d'un plugin donné.&lt;/p&gt;


&lt;p&gt;L'approche générale est d'utiliser l'objet $core-&amp;gt;expatDict, qui est le dictionnaire du plugin ExpAt&lt;/p&gt;


&lt;p&gt;La déclaration d'une fonction est très simple, il suffit d'utiliser le behavior expatDictInit :&lt;/p&gt;
&lt;pre class=&quot;brush: php&quot;&gt;$core-&amp;gt;addBehavior(&amp;quot;expatDictInit&amp;quot;,array(&amp;quot;myExpat&amp;quot;,&amp;quot;expatDictInit&amp;quot;));
class myExpat {
  public static function expatDictInit($dict) {
    $dict-&amp;gt;registerFunction(new expatBasicFunction(&amp;quot;map_name&amp;quot;,&amp;quot;function&amp;quot;));
  }
}&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;map_name est le nom de la fonction tel qu'il devra être entré dans les expressions du template&lt;/li&gt;
&lt;li&gt;function est le nom de la fonction généré dans le template compilé.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Exemple : en déclarant le code&lt;/p&gt;
&lt;pre class=&quot;brush: php&quot;&gt;$core-&amp;gt;addBehavior(&amp;quot;expatDictInit&amp;quot;,array(&amp;quot;myExpat&amp;quot;,&amp;quot;expatDictInit&amp;quot;));
function isSame($a,$b) {
 return $a==$b;
}

class myExpat {
  public static function expatDictInit($dict) {
    $dict-&amp;gt;registerFunction(new expatBasicFunction(&amp;quot;test&amp;quot;,&amp;quot;isSame&amp;quot;));
  }
}&lt;/pre&gt;


&lt;p&gt;Il devient alors possible de faire un test du type &amp;lt;tpl:If expr=&amp;quot;test(entry.id,12)&amp;quot;&amp;gt;...&amp;lt;/tpl:if&amp;gt;. L'exemple choisi ici est idiot (on peut faire tout bêtement &amp;quot;entry.id==12&amp;quot;à, mais il montre les possibilité d'extension du plugin.&lt;/p&gt;


&lt;p&gt;Il est également possible de définir de nouveaux objets, cela fera l'objet d'un nouveau billet...&lt;/p&gt;</description>
    
    
    
          <comments>http://www.morefnu.org/post/2010/09/24/Ajouter-des-fonctions-au-plugin-ExpAt#comment-form</comments>
      <wfw:comment>http://www.morefnu.org/post/2010/09/24/Ajouter-des-fonctions-au-plugin-ExpAt#comment-form</wfw:comment>
      <wfw:commentRss>http://www.morefnu.org/feed/atom/comments/1978</wfw:commentRss>
      </item>
    
  <item>
    <title>Plugin ExpAt pour Dotclear 2.2</title>
    <link>http://www.morefnu.org/post/2010/09/15/Plugin-ExpAt-pour-Dotclear-2.2</link>
    <guid isPermaLink="false">urn:md5:754b680720bf790cbd92c18055695805</guid>
    <pubDate>Wed, 15 Sep 2010 08:17:00 +0200</pubDate>
    <dc:creator>Dsls</dc:creator>
        <category>ExpAt</category>
        <category>compilateur</category><category>dotclear</category><category>expat</category><category>klingon</category><category>plugin</category>    
    <description>    &lt;h4&gt;Le constat&lt;/h4&gt;


&lt;p&gt;Dotclear propose, via son langage de templates, un certain nombre de balises permettant d'afficher
conditionnellement un contenu donné.&lt;/p&gt;


&lt;p&gt;Exemple dans le home.html :&lt;/p&gt;
&lt;pre class=&quot;brush: html&quot;&gt;&amp;lt;!-- # Entry with an excerpt --&amp;gt;
&amp;lt;tpl:EntryIf extended=&amp;quot;1&amp;quot;&amp;gt;
	&amp;lt;div class=&amp;quot;post-content&amp;quot;&amp;gt;{{tpl:EntryExcerpt}}&amp;lt;/div&amp;gt;
	&amp;lt;p class=&amp;quot;read-it&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;{{tpl:EntryURL}}&amp;quot;
	title=&amp;quot;{{tpl:lang Continue reading}} {{tpl:EntryTitle encode_html=&amp;quot;1&amp;quot;}}&amp;quot;&amp;gt;{{tpl:lang Continue
	reading}}&amp;lt;/a&amp;gt;...&amp;lt;/p&amp;gt;
&amp;lt;/tpl:EntryIf&amp;gt;
&amp;lt;!-- # Entry without excerpt --&amp;gt;
&amp;lt;tpl:EntryIf extended=&amp;quot;0&amp;quot;&amp;gt;
	&amp;lt;div class=&amp;quot;post-content&amp;quot;&amp;gt;{{tpl:EntryContent}}&amp;lt;/div&amp;gt;
&amp;lt;/tpl:EntryIf&amp;gt;&lt;/pre&gt;

&lt;p&gt;Ce bout de code teste si le billet a un extrait (via &amp;lt;tpl:EntryIf extended=&amp;quot;1&amp;quot;&amp;gt;...&amp;lt;/tpl:EntryIf&amp;gt;).&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Si c'est le cas, on n'affiche que l'extrait du billet&lt;/li&gt;
&lt;li&gt;Sinon on affiche le contenu du billet.&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Maintenant, une colle : je voudrais afficher le premier billet complètement si c'est le premier de la page,
mais garder le comportement normal dans les autres billets. Je vous épargne le code complet à écrire, mais
dans le dernier tpl:EntryIf, il faudrait pouvoir dire : &amp;quot;si le billet n'a pas d'extrait, ou s'il a un extrait mais qu'il est le premier de la liste&amp;quot;...
difficile à exprimer simplement avec les balises existantes, à moins de faire quelques redites dans le code.&lt;/p&gt;


&lt;h4&gt;Une solution&lt;/h4&gt;


&lt;p&gt;Voici donc une nouvelle extension : &lt;strong&gt;ExpAt&lt;/strong&gt;, c'est à dire &amp;quot;&lt;strong&gt;Exp&lt;/strong&gt;ressions in &lt;strong&gt;At&lt;/strong&gt;tributes&amp;quot;.
Il s'agit d'un nouveau moyen d'écrire les tests dans les balises dotclear.&lt;/p&gt;


&lt;p&gt;Là où on écrivait avant :&lt;/p&gt;
&lt;pre class=&quot;brush: html&quot;&gt;&amp;lt;tpl:EntryIf selected=&amp;quot;1&amp;quot; extended=&amp;quot;1&amp;quot; operator=&amp;quot;||&amp;quot;&amp;gt;...&amp;lt;/tpl:EntryIf&amp;gt;&lt;/pre&gt;

&lt;p&gt;On peut maintenant écrire :&lt;/p&gt;
&lt;pre class=&quot;brush: html&quot;&gt;&amp;lt;tpl:EntryIf expr=&amp;quot;selected || extended&amp;quot;&amp;gt;...&amp;lt;/tpl:EntryIf&amp;gt;&lt;/pre&gt;

&lt;p&gt;Revenons au problème initial : afficher le premier billet complètement si c'est le premier de la page,
mais garder le comportement normal dans les autres billets. Voilà le code template à effectuer :&lt;/p&gt;
&lt;pre class=&quot;brush: html&quot;&gt;&amp;lt;!-- # Entry with an excerpt --&amp;gt;
&amp;lt;tpl:EntryIf expr=&amp;quot;extended&amp;quot;&amp;gt;
	&amp;lt;div class=&amp;quot;post-content&amp;quot;&amp;gt;{{tpl:EntryExcerpt}}&amp;lt;/div&amp;gt;
	&amp;lt;tpl:EntryIf expr=&amp;quot;index!=0&amp;quot;&amp;gt;
		&amp;lt;p class=&amp;quot;read-it&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;{{tpl:EntryURL}}&amp;quot;
		title=&amp;quot;{{tpl:lang Continue reading}} {{tpl:EntryTitle encode_html=&amp;quot;1&amp;quot;}}&amp;quot;&amp;gt;{{tpl:lang Continue
		reading}}&amp;lt;/a&amp;gt;...&amp;lt;/p&amp;gt;
	&amp;lt;/tpl:EntryIf&amp;gt;
&amp;lt;/tpl:EntryIf&amp;gt;
&amp;lt;!-- # Entry without excerpt --&amp;gt;
&amp;lt;tpl:EntryIf expr=&amp;quot;!extended || (extended &amp;amp;&amp;amp; index!=0)&amp;quot;&amp;gt;
	&amp;lt;div class=&amp;quot;post-content&amp;quot;&amp;gt;{{tpl:EntryContent}}&amp;lt;/div&amp;gt;
&amp;lt;/tpl:EntryIf&amp;gt;&lt;/pre&gt;


&lt;h4&gt;Le moteur d'expressions&lt;/h4&gt;


&lt;p&gt;Le moteur d'expressions permet les opérations suivantes :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Opérations arithmétiques : +, -, *, /, %&lt;/li&gt;
&lt;li&gt;Opérations logiques : || (or), &amp;amp;&amp;amp; (and), ^^ (xor)&lt;/li&gt;
&lt;li&gt;Comparaisons : &amp;amp;lt; (&amp;quot;&amp;lt;&amp;quot;), &amp;amp;gt; (&amp;quot;&amp;gt;&amp;quot;), &amp;amp;le; (&amp;quot;&amp;lt;=&amp;quot;), &amp;amp;ge; (&amp;quot;&amp;gt;=&amp;quot;), ==, !=&lt;/li&gt;
&lt;li&gt;Gestion des parenthèses&lt;/li&gt;
&lt;li&gt;négation logique : !expression&lt;/li&gt;
&lt;li&gt;Variables : voir &lt;a href=&quot;http://www.morefnu.org/pages/ExpAt-reference&quot;&gt;référence&lt;/a&gt; pour la liste des variables définies&lt;/li&gt;
&lt;li&gt;Fonctions : voir &lt;a href=&quot;http://www.morefnu.org/pages/ExpAt-reference&quot;&gt;référence&lt;/a&gt; pour la liste des fonctions définies&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;&amp;quot;One last thing...&amp;quot;&lt;/h4&gt;


&lt;p&gt;Au fait, pourquoi s'embêter avec &amp;lt;tpl:EntryIf&amp;gt;, &amp;lt;tpl:CategoryIf&amp;gt;, &amp;lt;tpl:SysIf&amp;gt;, ... ?
ExpAt définit tout simplement &lt;strong&gt;&amp;lt;tpl:If&amp;gt;&lt;/strong&gt;, il suffit alors de préfixer les attributs par l'objet souhaité : entry pour tpl:EntryIf, category pour tpl:CategoryIf. En clair, &amp;lt;EntryIf&amp;gt; permet d'omettre &amp;quot;entry&amp;quot;, &amp;lt;categoryIf&amp;gt; permet d'omettre &amp;quot;category&amp;quot;, ...&lt;/p&gt;


&lt;p&gt;Ainsi :&lt;/p&gt;

&lt;pre&gt;&amp;lt;tpl:EntryIf expr=&amp;quot;!extended || (extended &amp;amp;&amp;amp; index!=0)&amp;quot;&amp;gt;&lt;/pre&gt;

&lt;p&gt;équivaut à :&lt;/p&gt;

&lt;pre&gt;&amp;lt;tpl:If expr=&amp;quot;!entry.extended || (entry.extended &amp;amp;&amp;amp; entry.index!=0)&amp;quot;&amp;gt;&lt;/pre&gt;


&lt;p&gt;Et on peut bien sûr combiner le tout, par exemple dans un category.html :&lt;/p&gt;

&lt;pre&gt;&amp;lt;tpl:If expr=&amp;quot;entry.extended &amp;amp;&amp;amp; category.nb_post==1&amp;quot;&amp;gt;&lt;/pre&gt;

&lt;h4&gt;&amp;quot;One very last thing...&amp;quot;&lt;/h4&gt;

&lt;p&gt;Sur le &lt;a href=&quot;http://forum.dotclear.net/viewtopic.php?id=43367&quot;&gt;forum&lt;/a&gt; a été évoqué un souhait pertinent : je veux afficher le résumé d'un billet (ie. les 300 premiers caractères), et afficher &amp;quot;...&amp;quot; si le contenu du billet dépasse les 300 caractères.
Comment faire ?&lt;/p&gt;


&lt;p&gt;ExpAt introduit quelques petits concepts supplémentaires.&lt;/p&gt;


&lt;h3&gt;L'affichage&lt;/h3&gt;

&lt;p&gt;C'est bien beau de ne faire que des tests, l'idéal serait quand même de pouvoir afficher quelque chose.
&lt;strong&gt;{{tpl:Echo expr=&amp;quot;&amp;lt;expression&amp;gt;&amp;quot;}}&lt;/strong&gt; est là pour ça :)&lt;/p&gt;


&lt;h3&gt;Les variables&lt;/h3&gt;

&lt;p&gt;ExpAt permet de stocker le résultat d'une expression dans une variable, via le template :&lt;/p&gt;


&lt;p&gt;&lt;strong&gt;{{tpl:Set var=&amp;quot;nomvariable&amp;quot; expr=&amp;quot;expression&amp;quot;}}&lt;/strong&gt;&lt;/p&gt;


&lt;p&gt;La variable est ensuite déclarée comme attribut de l'objet &amp;quot;my&amp;quot;, et donc accessible ensuite via my.variable.&lt;/p&gt;


&lt;h4&gt;Cas pratique&lt;/h4&gt;

&lt;p&gt;Bon, maintenant, un cas d'application: afficher l'extrait d'un billet, par exemple les 300 premiers caractères de ce billet, et afficher '...' ensuite si ce billet dépasse 300 caractères, en ajoutant un lien pour le lire en entier.&lt;/p&gt;


&lt;p&gt;Voilà le code que ça peut donner :&lt;/p&gt;
&lt;pre class=&quot;brush: html&quot;&gt;{{tpl:Set var=&amp;quot;content&amp;quot; expr=&amp;quot;encode_html(remove_html(entry.content))&amp;quot;}}
{{tpl:Set var=&amp;quot;content_length&amp;quot; expr=&amp;quot;strlen(my.content)&amp;quot;}}
&amp;lt;div class=&amp;quot;post-content&amp;quot;&amp;gt;
       {{tpl:Echo expr=&amp;quot;substr(my.content,0,300)&amp;quot;}}
       &amp;lt;tpl:If expr=&amp;quot;my.content_length &amp;amp;gt; 300&amp;quot;&amp;gt;&amp;amp;nbsp; [...]&amp;lt;/tpl:If&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;tpl:If expr=&amp;quot;my.content_length &amp;amp;gt; 300&amp;quot;&amp;gt;
     &amp;lt;p class=&amp;quot;read-it&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;{{tpl:EntryURL}}&amp;quot;
     title=&amp;quot;{{tpl:lang Continue reading}} {{tpl:EntryTitle
encode_html=&amp;quot;1&amp;quot;}}&amp;quot;&amp;gt;{{tpl:lang Continue
     reading}}&amp;lt;/a&amp;gt;...&amp;lt;/p&amp;gt;
&amp;lt;/tpl:If&amp;gt;&lt;/pre&gt;

&lt;p&gt;En clair :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;On stocke le contenu billet dans my.content et sa taille dans my.content_length&lt;/li&gt;
&lt;li&gt;On test la valeur de my.content_length, et on affiche les &amp;quot;...&amp;quot; seulement si on est supérieur à 300...&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;La suite&lt;/h4&gt;

&lt;p&gt;La version actuelle du plugin montre les choses qu'il est possible de faire, mais la liste des objets/fonctions est réduite. J'attends maintenant vos besoins pour les enrichir :)&lt;/p&gt;


&lt;h4&gt;Crédits&lt;/h4&gt;

&lt;p&gt;Le compilateur d'expression repose sur un analyseur syntaxique et sémantique généré avec &lt;a href=&quot;http://sourceforge.net/projects/lime-php/&quot;&gt;LIME-php&lt;/a&gt;.&lt;/p&gt;


&lt;h4&gt;Téléchargement&lt;/h4&gt;


&lt;p&gt;Le plugin est pour l'instant disponible &lt;a href=&quot;http://www.morefnu.org/public/archives/dotclear2/plugins/expat/plugin-expat-0.4.zip&quot;&gt;ici&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Le support du plugin se fait &lt;a href=&quot;http://forum.dotclear.net/viewtopic.php?pid=292344&quot;&gt;sur le forum dotclear&lt;/a&gt;&lt;/p&gt;</description>
    
    
    
          <comments>http://www.morefnu.org/post/2010/09/15/Plugin-ExpAt-pour-Dotclear-2.2#comment-form</comments>
      <wfw:comment>http://www.morefnu.org/post/2010/09/15/Plugin-ExpAt-pour-Dotclear-2.2#comment-form</wfw:comment>
      <wfw:commentRss>http://www.morefnu.org/feed/atom/comments/1976</wfw:commentRss>
      </item>
    
  <item>
    <title>Plugin &quot;Grumph&quot; pour dotclear</title>
    <link>http://www.morefnu.org/post/2010/09/09/Plugin-Grumph-pour-dotclear</link>
    <guid isPermaLink="false">urn:md5:b855e807a52f12595f4113d8a4195fa5</guid>
    <pubDate>Thu, 09 Sep 2010 19:38:00 +0200</pubDate>
    <dc:creator>Dsls</dc:creator>
        <category>Grumph</category>
            
    <description>    &lt;p&gt;Grumph est un plugin filtrant les resources d'un billet, et les gardant au chaud à coté de ce billet.&lt;/p&gt;




&lt;p&gt;Grumph est l'acronyme de &amp;quot;Grab Resources and Urls to Manage Posts Handily&amp;quot;&lt;/p&gt;




&lt;p&gt;Les resources récupérées sont :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Les images&lt;/li&gt;
&lt;li&gt;Les vidéos (html5)&lt;/li&gt;
&lt;li&gt;Les sons (html5)&lt;/li&gt;
&lt;li&gt;Les objets&lt;/li&gt;
&lt;li&gt;Les liens&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Il est alors possible d'en faire des traitements spécifiques via les balises templates définies pour l'occasion :&lt;/p&gt;


&lt;h4&gt;Nouvelles balises de template&lt;/h4&gt;


&lt;h3&gt;&amp;lt;tpl:EntryResources&amp;gt; ... &amp;lt;/tpl:EntryResources&amp;gt;&lt;/h3&gt;


&lt;p&gt;liste les ressources du billet&lt;/p&gt;


&lt;p&gt;Attributs possibles&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;internal = (0|1) : ne sélectionne que les ressources internes au blog&lt;/li&gt;
&lt;li&gt;scope = (all|excerpt|content) : ne sélectionne que les ressources de l'entête, du contenu ou des deux&lt;/li&gt;
&lt;li&gt;type=link,image,video,audio,object : ne sélectionne que les types de ressources spécifiés (plusieurs valeurs possibles séparées par une virgule)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt; Les autres balises sont utilisables uniquement dans une boucle tpl:EntryResources :&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;&amp;lt;tpl:ResHeader&amp;gt;...&amp;lt;/tpl:ResHeader&amp;gt;&lt;/h3&gt;

&lt;p&gt;Affiche le contenu de la balise avant la première ressource trouvée (pas d'affichage si pas de ressources)&lt;/p&gt;


&lt;h3&gt;&amp;lt;tpl:ResFooter&amp;gt;...&amp;lt;/tpl:ResFooter&amp;gt;&lt;/h3&gt;

&lt;p&gt;Affiche le contenu de la balise après la dernière ressource trouvée (pas d'affichage si pas de ressources)&lt;/p&gt;


&lt;h3&gt;{{tpl:ResURL}}&lt;/h3&gt;

&lt;p&gt;Affiche l'URL de la ressource en cours&lt;/p&gt;



&lt;h3&gt;{{tpl:ResTitle}}&lt;/h3&gt;

&lt;p&gt;Affiche le titre de la ressource en cours&lt;/p&gt;


&lt;h3&gt;{{tpl:ResType}}&lt;/h3&gt;

&lt;p&gt;Affiche le type de la ressource en cours.&lt;/p&gt;


&lt;h4&gt;Administration&lt;/h4&gt;


&lt;p&gt;Le plugin nécessite de mettre à jour la table dc_post pour stocker en cache, la page d'administration du plugin permet de mettre à jour les billets.&lt;/p&gt;


&lt;p&gt;Il est disponible &lt;a href=&quot;http://www.morefnu.org/public/archives/dotclear2/plugins/grumph/plugin-grumph-1.0.zip&quot;&gt;ici&lt;/a&gt;, et prochainement sur dotaddict.&lt;/p&gt;</description>
    
    
    
          <comments>http://www.morefnu.org/post/2010/09/09/Plugin-Grumph-pour-dotclear#comment-form</comments>
      <wfw:comment>http://www.morefnu.org/post/2010/09/09/Plugin-Grumph-pour-dotclear#comment-form</wfw:comment>
      <wfw:commentRss>http://www.morefnu.org/feed/atom/comments/1975</wfw:commentRss>
      </item>
    
  <item>
    <title>Le truc PHP du jour : hériter dynamiquement d'une classe</title>
    <link>http://www.morefnu.org/post/2010/08/30/Le-truc-PHP-du-jour-%3A-h%C3%A9riter-dynamiquement-d-une-classe</link>
    <guid isPermaLink="false">urn:md5:09720896bcaefd85036f867d1b3d730e</guid>
    <pubDate>Mon, 30 Aug 2010 13:43:00 +0200</pubDate>
    <dc:creator>Dsls</dc:creator>
        <category>Techno</category>
        <category>gruik</category><category>PHP</category>    
    <description>    &lt;p&gt;Aussi moche soit-il, PHP s'est imposé chez bon nombre d'hébergeurs, et souvent, &amp;quot;il faut faire avec&amp;quot;.&lt;/p&gt;


&lt;p&gt;L'astuce du jour : comment définir une classe héritant dynamiquement d'une autre classe ?&lt;/p&gt;


&lt;p&gt;Forcément, le code suivant ne fonctionne pas :&lt;/p&gt;
&lt;pre class=&quot;brush: php&quot;&gt;&amp;lt;?php
	$classToInherit = &amp;quot;parentClass&amp;quot;;

	class parentClass {
		public function hello() {
			echo &amp;quot;Hello, world !&amp;quot;;
		}
	}

	class childClass extends $classToInherit {
		public function hello() {
			parent::hello();
			echo &amp;quot;Hello, too!&amp;quot;;
		}
	}

	$o = new childClass();
	$o-&amp;gt;hello();
?&amp;gt;&lt;/pre&gt;

&lt;p&gt;Ce serait trop simple...&lt;/p&gt;


&lt;p&gt;Qu'à cela ne tienne, il existe une fonction qui va nous permettre de ruser, la fonction &lt;a href=&quot;http://fr.php.net/manual/fr/function.class-alias.php&quot;&gt;class_alias&lt;/a&gt;. Et voilà le travail :&lt;/p&gt;
&lt;pre class=&quot;brush: php&quot;&gt;&amp;lt;?php
	$classToInherit = &amp;quot;parentClass&amp;quot;;

	class parentClass {
		public function hello() {
			echo &amp;quot;Hello, world !&amp;quot;;
		}
	}

	class_alias($classToInherit,&amp;quot;myCustomClass&amp;quot;);
	
	class childClass extends myCustomClass {
		public function hello() {
			parent::hello();
			echo &amp;quot;Hello, too!&amp;quot;;
		}
	}

	$o = new childClass();
	$o-&amp;gt;hello();
?&amp;gt;&lt;/pre&gt;


&lt;p&gt;(J'entends déjà les &amp;quot;dans les vrais langages, on peut faire ça proprement&amp;quot;, et je suis entièrement d'accord :)&lt;/p&gt;</description>
    
    
    
          <comments>http://www.morefnu.org/post/2010/08/30/Le-truc-PHP-du-jour-%3A-h%C3%A9riter-dynamiquement-d-une-classe#comment-form</comments>
      <wfw:comment>http://www.morefnu.org/post/2010/08/30/Le-truc-PHP-du-jour-%3A-h%C3%A9riter-dynamiquement-d-une-classe#comment-form</wfw:comment>
      <wfw:commentRss>http://www.morefnu.org/feed/atom/comments/1974</wfw:commentRss>
      </item>
    
  <item>
    <title>Débugger de l'Ajax avec firebug</title>
    <link>http://www.morefnu.org/post/2010/08/30/D%C3%A9bugger-de-l-Ajax-avec-firebug</link>
    <guid isPermaLink="false">urn:md5:c2bb6982c04e86ca65e1d868a55c63c6</guid>
    <pubDate>Mon, 30 Aug 2010 08:44:00 +0200</pubDate>
    <dc:creator>Dsls</dc:creator>
        <category>Coin Dotclear</category>
        <category>ajax</category><category>firebug</category><category>firefox</category><category>php</category>    
    <description>    &lt;p&gt;Cet article est d'abord un article intéressé. En effet, dans le cadre du plugin gallery, une bonne partie de l'interface d'administration repose sur des requêtes asynchrones répétées, notamment pour gérer la création/mise à jour des miniatures des images, opérations coûteuses, et pas gérables en une seule page PHP dès lors qu'il commence à y avoir un nombre conséquent de miniatures à générer.&lt;/p&gt;


&lt;p&gt;Le plugin Gallery pour dotclear2 repose sur une couche de traitement ajax qui va gérer une queue d'événements. Pour ce qui est des aspects techniques, il repose sur &lt;a href=&quot;http://www.protofunc.com/scripts/jquery/ajaxManager3/&quot;&gt;jquery.ajaxmanager&lt;/a&gt;.&lt;/p&gt;


&lt;p&gt;Seulement voilà, qui dit Ajax dit moins de visibilité sur les erreurs potentielles. Ce petit article est là pour tracer les éventuelles erreurs invisibles.&lt;/p&gt;


&lt;p&gt;Il faut d'abord 2 outils : firefox, et l'incontournable &lt;a href=&quot;http://getfirebug.com/&quot;&gt;firebug&lt;/a&gt; (les versions utilisées ici sont firefox 3.6.6 et firebug 1.5.4). L'exemple d'application est ici la page de génération des nouvelles images du plugin gallery en action.&lt;/p&gt;


&lt;p&gt;1. Commencez par activer firebug, via la touche F12, et activez la console si ce n'est pas déjà fait :
&lt;img src=&quot;http://www.morefnu.org/public/images/fbug/.fbug_enable_console_m.jpg&quot; alt=&quot;fbug_enable_console.png&quot; style=&quot;display:block; margin:0 auto;&quot; title=&quot;fbug_enable_console.png&quot; /&gt;&lt;/p&gt;


&lt;p&gt;2. Allez ensuite sur la page générant des appels ajax, et déclenchez-les (pour le plugin gallery, un clic sur soumettre après avoir sélectionné le répertoire dans l'onglet &amp;quot;gestion des nouvelles images&amp;quot; en déclenche un certain nombre). L'onglet &amp;quot;Console&amp;quot; affiche alors les requêtes Ajax effectuées. Dans notre exemple, 5 requêtes &amp;quot;GET&amp;quot; sont faites :
&lt;img src=&quot;http://www.morefnu.org/public/images/fbug/.fbug_ajax_requests_m.jpg&quot; alt=&quot;fbug_ajax_requests.png&quot; style=&quot;display:block; margin:0 auto;&quot; title=&quot;fbug_ajax_requests.png&quot; /&gt;&lt;/p&gt;


&lt;p&gt;3. En dépliant chaque requête il est possible de voir ce qui a été envoyé, et ce qui a été reçu :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;L'onglet &amp;quot;Paramètres&amp;quot; résume les paramètres transmis à l'URL&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;http://www.morefnu.org/public/images/fbug/.fbug_params_m.jpg&quot; alt=&quot;fbug_params.png&quot; style=&quot;display:block; margin:0 auto;&quot; title=&quot;fbug_params.png&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;L'onglet &amp;quot;En-têtes&amp;quot; indique les headers renvoyés en réponse à la requête&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;http://www.morefnu.org/public/images/fbug/.fbug_headers_m.jpg&quot; alt=&quot;fbug_headers.png&quot; style=&quot;display:block; margin:0 auto;&quot; title=&quot;fbug_headers.png&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;L'onglet &amp;quot;contenu&amp;quot; indique le contenu de la réponse&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;http://www.morefnu.org/public/images/fbug/.fbug_answer_m.jpg&quot; alt=&quot;fbug_answer.png&quot; style=&quot;display:block; margin:0 auto;&quot; title=&quot;fbug_answer.png&quot; /&gt;&lt;/p&gt;</description>
    
    
    
          <comments>http://www.morefnu.org/post/2010/08/30/D%C3%A9bugger-de-l-Ajax-avec-firebug#comment-form</comments>
      <wfw:comment>http://www.morefnu.org/post/2010/08/30/D%C3%A9bugger-de-l-Ajax-avec-firebug#comment-form</wfw:comment>
      <wfw:commentRss>http://www.morefnu.org/feed/atom/comments/1973</wfw:commentRss>
      </item>
    
  <item>
    <title>Plugin Gallery 0.4 pour dotclear 2.2</title>
    <link>http://www.morefnu.org/post/2010/08/27/Plugin-Gallery-0.4-pour-dotclear-2.2</link>
    <guid isPermaLink="false">urn:md5:c753202d9d34575d8ea52a6e9082aebc</guid>
    <pubDate>Fri, 27 Aug 2010 16:11:00 +0200</pubDate>
    <dc:creator>Dsls</dc:creator>
        <category>Gallery</category>
        <category>dotclear2</category><category>gallery</category><category>plugin</category>    
    <description>    &lt;p&gt;Enfin ... après une longue période de gestation depuis la 0.3.8, la version 0.4 du plugin Gallery vient de voir le jour.
Merci à tous les contributeurs du forum qui ont pu m'aider à chasser les quelques bugs trouvés.&lt;/p&gt;


&lt;p&gt;Changements notables depuis la 0.3.8 :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Compatibilité avec dotclear 2.2 (et uniquement celle-là, comprenez par là qu'avec dotclear 2.1.X il faudra se contenter de gallery 0.3.8)&lt;/li&gt;
&lt;li&gt;Onglet &amp;quot;gestion des nouvelles images&amp;quot; mis à jour, avec de nouveaux traitements asynchrones&lt;/li&gt;
&lt;li&gt;Correction des url de flux&lt;/li&gt;
&lt;li&gt;Ajout du nombre d'images sur l'accueil du tableau de bord&lt;/li&gt;
&lt;li&gt;Quelques corrections au niveau des thèmes&lt;/li&gt;
&lt;li&gt;Support de jquery 1.4.2&lt;/li&gt;
&lt;li&gt;Quelques blindages coté code.&lt;/li&gt;
&lt;li&gt;Passage à &lt;a href=&quot;http://www.protofunc.com/scripts/jquery/ajaxManager3/&quot;&gt;jquery.ajaxmanager v3&lt;/a&gt; pour la gestion des nouvelles images&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;En gros, rien de bien visible (si ce n'est l'onglet &amp;quot;Gestion des nouvelles images&amp;quot;), mais une version consolidée et compatible dotclear 2.2&lt;/p&gt;


&lt;p&gt;Le plugin est disponible sur &lt;a href=&quot;http://plugins.dotaddict.org/dc2/details/gallery&quot;&gt;dotaddict&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Coté support, ça se passe &lt;a href=&quot;http://forum.dotclear.net/viewtopic.php?id=43249&quot;&gt;ici&lt;/a&gt;&lt;/p&gt;</description>
    
    
    
          <comments>http://www.morefnu.org/post/2010/08/27/Plugin-Gallery-0.4-pour-dotclear-2.2#comment-form</comments>
      <wfw:comment>http://www.morefnu.org/post/2010/08/27/Plugin-Gallery-0.4-pour-dotclear-2.2#comment-form</wfw:comment>
      <wfw:commentRss>http://www.morefnu.org/feed/atom/comments/1972</wfw:commentRss>
      </item>
    
  <item>
    <title>Version mobile, première</title>
    <link>http://www.morefnu.org/post/2010/06/30/Version-mobile%2C-premi%C3%A8re</link>
    <guid isPermaLink="false">urn:md5:fffcdc3056f34b0288a0fc4ebe46087d</guid>
    <pubDate>Wed, 30 Jun 2010 10:41:00 +0000</pubDate>
    <dc:creator>Dsls</dc:creator>
        <category>Dotclear 2</category>
        <category>dotclear2</category><category>htaccess</category><category>mobile</category><category>thème</category>    
    <description>    &lt;p&gt;Depuis ce matin, &lt;del&gt;les gens&lt;/del&gt; &lt;del&gt;les quelques gens&lt;/del&gt; &lt;del&gt;les rares gens qui viennent sur ce site&lt;/del&gt; si vous vous connectez sur ce site depuis un smartphone, vous serez redirigés vers la version mobile du site, à savoir &lt;a href=&quot;http://m.morefnu.org&quot; title=&quot;http://m.morefnu.org&quot;&gt;http://m.morefnu.org&lt;/a&gt;.&lt;/p&gt;


&lt;p&gt;Cette redirection automatique est l'objet de quelques aménagements de ce blog :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;J'ai repris l'astuce de tips.dotaddict.org, &lt;a href=&quot;http://tips.dotaddict.org/fiche/Un-blog,-deux-th%C3%A8mes,-deux-URLs&quot;&gt;&amp;quot;Un blog 2 thèmes, 2 URLs&amp;quot;&lt;/a&gt;, avec une légère modification. Contrairement au tip, ma seconde URL est dans un répertoire distinct (qui n'est pas un sous-répertoire du répertoire du blog). Pour que les thèmes et le répertoire public soient toujours visibles, j'ai effectué un lien symbolique dans ce nouveau répertoire vers les répertoires originaux du blog principal&lt;/li&gt;
&lt;li&gt;Pour la redirection automatique, rien de plus simple, quelques petites lignes dans le .htaccess à la racine du site principal:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;brush: plain&quot;&gt;RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_COOKIE} !(no_mobile)
RewriteCond %{HTTP_USER_AGENT} ^.*(iPhone|BlackBerry|Palm|Android).*$
RewriteRule ^(.*)$ http://m.morefnu.org/$1 [R=301,L]&lt;/pre&gt;


&lt;p&gt;Et voilà ... enfin pour le moment : les plus perspicaces auront noté la ligne&lt;/p&gt;
&lt;pre class=&quot;brush: plain&quot;&gt;RewriteCond %{HTTP_COOKIE} !(no_mobile)&lt;/pre&gt;

&lt;p&gt;Qui permet de refuser le mode mobile si le cookie &amp;quot;no_mobile&amp;quot; est positionné sur le site. Ce qu'il reste encore à faire :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ajouter un lien sur le site mobile pour repasser en mode normal, et positionner le cookie&lt;/li&gt;
&lt;li&gt;Ajouter un lien sur le site normal quand le cookie est positionné, pour passer sur la partie mobile.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Au passage, un grand merci à Guillaume pour &lt;a href=&quot;http://blog.guillaumebizet.fr/post/2009/04/01/Th%C3%A8me-iPhone-pour-Dotclear2-:-dc2iPhone&quot;&gt;son thème dc2iphone&lt;/a&gt;.&lt;/p&gt;


&lt;p&gt;Dernier point : le tip mentionné, pour être compatible avec dotclear 2.2, nécessite de modifier la fonction modifConfig de la manière suivante :&lt;/p&gt;

&lt;pre class=&quot;brush: php&quot;&gt;function modifConfig($blog) {
        $blog-&amp;gt;url = 'http://monsitemobile/';
        $blog-&amp;gt;settings-&amp;gt;system-&amp;gt;theme = 'dc2iphone';
}&lt;/pre&gt;</description>
    
    
    
          <comments>http://www.morefnu.org/post/2010/06/30/Version-mobile%2C-premi%C3%A8re#comment-form</comments>
      <wfw:comment>http://www.morefnu.org/post/2010/06/30/Version-mobile%2C-premi%C3%A8re#comment-form</wfw:comment>
      <wfw:commentRss>http://www.morefnu.org/feed/atom/comments/1971</wfw:commentRss>
      </item>
    
  <item>
    <title>MyMeta 0.4.1</title>
    <link>http://www.morefnu.org/post/2010/06/28/MyMeta-0.4</link>
    <guid isPermaLink="false">urn:md5:6ad00a7c28567e3cc406687979634c34</guid>
    <pubDate>Mon, 28 Jun 2010 10:59:00 +0000</pubDate>
    <dc:creator>Dsls</dc:creator>
        <category>My Meta</category>
        <category>dotclear</category><category>metadata</category><category>plugin</category>    
    <description>    &lt;p&gt;La phase de beta-test est finie, l'heure est venue de sortir mymeta 0.4&lt;/p&gt;


&lt;p&gt;Pour les changements majeurs, &lt;a href=&quot;http://www.morefnu.org/post/2010/06/08/Plugin-MyMeta-0.4beta&quot;&gt;ce billet&lt;/a&gt; les résume déjà.&lt;/p&gt;


&lt;p&gt;Depuis la beta3, quelques petits autres changements sont apparus :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;La possibilité de restreindre les mymeta affichés dans le widget à une section donnée (widget liste de mymeta)&lt;/li&gt;
&lt;li&gt;La suppression de la classe pour la taille des tags quand des mymeta sont affichées en liste (widget valeurs de mymeta)&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Le plugin est disponible &lt;a href=&quot;http://www.morefnu.org/public/archives/dotclear2/plugins/mymeta/plugin-mymeta-0.4.1.zip&quot;&gt;ici&lt;/a&gt;, et bientôt sur le lab.&lt;/p&gt;


&lt;p&gt;&lt;em&gt;Note&lt;/em&gt; : la version 0.4.1 corrige un problème signalé par Mirovinben, en cas d'installation sur un multiblog. La mise à jour vers la 0.4.1 du plugin se fera pour le blog courant. Pour les autres blogs, il faudra passer par la page d'administration du plugin au moins une fois pour que les settings soient migrés correctement.&lt;/p&gt;</description>
    
    
    
          <comments>http://www.morefnu.org/post/2010/06/28/MyMeta-0.4#comment-form</comments>
      <wfw:comment>http://www.morefnu.org/post/2010/06/28/MyMeta-0.4#comment-form</wfw:comment>
      <wfw:commentRss>http://www.morefnu.org/feed/atom/comments/1969</wfw:commentRss>
      </item>
    
  <item>
    <title>Plugin QuickCat pour dotclear</title>
    <link>http://www.morefnu.org/post/2010/06/22/Plugin-QuickCat-pour-dotclear</link>
    <guid isPermaLink="false">urn:md5:7d6577080d1e8999a074fbec47fd5ed5</guid>
    <pubDate>Tue, 22 Jun 2010 11:01:00 +0200</pubDate>
    <dc:creator>Dsls</dc:creator>
        <category>QuickCat</category>
            
    <description>    &lt;p&gt;Ce plugin permet de créer une nouvelle catégorie à la volée, lors de l'édition d'un billet.&lt;/p&gt;


&lt;p&gt;Le plugin crée une nouvelle entrée dans le combo &amp;quot;Catégorie&amp;quot; dans l'édition d'un billet.&lt;/p&gt;


&lt;p&gt;&lt;img src=&quot;http://www.morefnu.org/public/images/quickcat/.quickcat_newcat_m.jpg&quot; alt=&quot;quickcat_newcat.png&quot; style=&quot;float:left; margin: 0 1em 1em 0;&quot; title=&quot;quickcat_newcat.png, juin 2010&quot; /&gt;
&lt;img src=&quot;http://www.morefnu.org/public/images/quickcat/.quickcat_form_m.jpg&quot; alt=&quot;quickcat_form.png&quot; style=&quot;float:left; margin: 0 1em 1em 0;&quot; title=&quot;quickcat_form.png, juin 2010&quot; /&gt;&lt;/p&gt;
&lt;div style=&quot;clear:both;&quot;&gt;&lt;/div&gt;



&lt;p&gt;Le plugin est disponible &lt;a href=&quot;http://www.morefnu.org/public/archives/dotclear2/plugins/quickcat/plugin-quickcat-1.0.zip&quot;&gt;ici&lt;/a&gt; et très bientot directement sur dotaddict :)&lt;/p&gt;


&lt;p&gt;Il a été teste sur 2.2beta, avec IE7, firefox 3.6 et Chrome, mais marche peut-être sur une 2.1 et d'autres navigateurs ...&lt;/p&gt;</description>
    
    
    
          <comments>http://www.morefnu.org/post/2010/06/22/Plugin-QuickCat-pour-dotclear#comment-form</comments>
      <wfw:comment>http://www.morefnu.org/post/2010/06/22/Plugin-QuickCat-pour-dotclear#comment-form</wfw:comment>
      <wfw:commentRss>http://www.morefnu.org/feed/atom/comments/1968</wfw:commentRss>
      </item>
    
  <item>
    <title>Sur le chemin de la 2.2 : une histoire de compilateurs</title>
    <link>http://www.morefnu.org/post/2010/06/17/Sur-le-chemin-de-la-2.2-%3A-une-histoire-de-compilateurs</link>
    <guid isPermaLink="false">urn:md5:83e00698a7f581c996855cb66c4bca57</guid>
    <pubDate>Thu, 17 Jun 2010 11:19:00 +0200</pubDate>
    <dc:creator>Dsls</dc:creator>
        <category>Dotclear 2</category>
        <category>2.2beta</category><category>dotclear2</category><category>preview</category>    
    <description>&lt;p&gt;S'il y a bien un point qui a été débattu sur dotclear 2 par rapport à dotclear 1, c'est bien la couche intermédiaire qu'il ajoute pour les développeurs de thèmes, à savoir son moteur de templates.&lt;/p&gt;


&lt;p&gt;Pour faire son propre thème, plus besoin de coder des pages en PHP, un nouveau langage intermédiaire a été introduit.
Et cela, d'abord pour des raisons de souplesse : ce langage est converti en code php, ce dernier étant stocké en cache. Le theme-designer n'a pas à maîtriser PHP pour faire son thème
Ensuite, parce qu'empêcher l'utilisation de PHP, c'est aussi empêcher d'insérer du code potentiellement vulnérable.&lt;/p&gt;


&lt;p&gt;Dans le principe, c'est plutôt simple : lorsqu'un utilisateur va sur une page du blog, dotclear va chercher le fichier de template correspondant, le transforme en un fichier PHP, et exécute ce dernier.
Le fichier PHP est bien entendu placé en cache afin de ne pas repasser systématiquement par la case compilation.&lt;/p&gt;


&lt;p&gt;Je vais essayer de décrire les rouages du compilateur/moteur de templates dans ce billet, ainsi que les évolutions qui lui ont été apportées depuis la 2.1.7.&lt;/p&gt;


&lt;p&gt;(Attention, contenu très technique inside)&lt;/p&gt;    &lt;h3&gt;Le compilateur de la version 2.1.7&lt;/h3&gt;

&lt;p&gt;Avec dotclear 2.1, le moteur de templates est diablement court en terme de code, et pas moins efficace.
Son fonctionnement est le suivant :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Le moteur récupère la liste des blocs déclarés&lt;/li&gt;
&lt;li&gt;Pour chaque bloc déclaré, il recherche &amp;lt;tpl:Nomdubloc&amp;gt;...&amp;lt;/tpl:Nomdubloc&amp;gt; (j'ai volontairement omis les attributs, pour simplifier)&lt;/li&gt;
&lt;li&gt;A chaque bloc trouvé, remplace ce bloc par ce que retourne le traitement de ce bloc (qui a été enregistré via $core-&amp;gt;tpl-&amp;gt;addBlock)&lt;/li&gt;
&lt;li&gt;Le moteur récupère la liste des valeurs déclarées&lt;/li&gt;
&lt;li&gt;Pour chaque bloc déclaré, il recherche {{tpl:NomdeLavaleur}}&lt;/li&gt;
&lt;li&gt;A chaque valeur trouvée, il appelle le traitement correspondant à la valeur&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Techniquement, les recherches/appels s'effectuent via la méthode PHP preg_replace_callback. Les expressions régulières utilisées sont :&lt;/p&gt;
&lt;pre class=&quot;brush: php&quot;&gt;$this-&amp;gt;tag_block = '&amp;lt;tpl:(%s)(?:(\s+.*?)&amp;gt;|&amp;gt;)(.*?)&amp;lt;/tpl:%s&amp;gt;';
$this-&amp;gt;tag_value = '{{tpl:(%s)(\s(.*?))?}}';&lt;/pre&gt;

&lt;p&gt;(les %s sont remplacés par le nom du bloc/tag en cours)&lt;/p&gt;


&lt;p&gt;&lt;strong&gt;Avantages du compilateur v2.1.7&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;il a été grandement éprouvé, et fonctionne a priori partout&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Inconvénients&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Les performances sont inversement proportionnelles au nombre de blocs/valeurs déclarés. Chaque nouveau bloc entraînera un appel à preg_replace_callback supplémentaire&lt;/li&gt;
&lt;li&gt;Il n'est pas possible d'imbriquer 2 blocs ayant le même nom&lt;/li&gt;
&lt;li&gt;un appel de gestion d'un bloc ne garantit pas que le contenu de ce bloc est du code compilé. Un traitement de bloc peut très bien recevoir comme contenu des &amp;lt;tpl:Block&amp;gt;...&amp;lt;/tpl:Block&amp;gt; ou {{tpl:Value}}&lt;/li&gt;
&lt;li&gt;les blocs/valeurs inconnus ne sont pas détectés, ils sont laissée tels quels dans le code généré&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;Le compilateur de la version 2.2beta1&lt;/h3&gt;

&lt;p&gt;L'évolution apportée dans le compilateur de la 2.2beta1 consiste principalement à optimiser le compilateur précédent, et à permettre l'imbrication des balises homonymes.&lt;/p&gt;


&lt;p&gt;Son fonctionnement est le suivant :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Le moteur cherche dans le template une chaîne du type &amp;lt;tpl:'quelquechose'&amp;gt;[...]&amp;lt;/tpl:'quelquechose'&amp;gt;, en imposant que [...] ne contienne ni &amp;lt;tpl:quelquechose&amp;gt;, ni &amp;lt;/tpl:quelquechose&amp;gt;. En clair, si 2 tags homonymes sont imbriqués, on choisit le plus imbriqué&lt;/li&gt;
&lt;li&gt;Pour chaque bloc trouvé, s'il a été enregistré on remplace le bloc par le traitement correspondant&lt;/li&gt;
&lt;li&gt;tant qu'on a fait au moins un remplacement, on réitère en 1.&lt;/li&gt;
&lt;li&gt;Le moteur cherche dans le template une chaîne du type {{tpl:'quelquechose'}}&lt;/li&gt;
&lt;li&gt;Pour chaque texte trouvé, si la valeur correspondante a été trouvée, on appelle le traitement correspondant&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Techniquement, les recherches/appels s'effectuent toujours via preg_replace_callback. Les expressions régulières utilisées sont :&lt;/p&gt;
&lt;pre class=&quot;brush: php&quot;&gt;$this-&amp;gt;tag_block = '&amp;lt;tpl:(\w+)(?:(\s+.*?)&amp;gt;|&amp;gt;)((?:[^&amp;lt;]|&amp;lt;(?!/?tpl:\1)|(?R))*)&amp;lt;/tpl:\1&amp;gt;';
$this-&amp;gt;tag_value = '{{tpl:(\w+)(\s(.*?))?}}';&lt;/pre&gt;

&lt;p&gt;Attention au mal de crâne : la regexp utilise une structure récursive (?R). Une autre illustration de ces structures (dont s'est fortement inspiré celle de doclear) est montrée &lt;a href=&quot;http://fr.php.net/manual/en/function.preg-replace-callback.php&quot;&gt;dans la documentation PHP (exemple 3)&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;&lt;strong&gt;Avantages du compilateur v2.2beta1&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Support des balises homonymes imbriquées&lt;/li&gt;
&lt;li&gt;Gain de performances élevé (environ 3 fois plus rapide que la version précédente)&lt;/li&gt;
&lt;li&gt;On peut détecter les blocs/valeurs inconnus&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Inconvénients&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;un appel de gestion d'un bloc ne garantit pas que le contenu de ce bloc est du code compilé. Un traitement de bloc peut très bien recevoir comme contenu des &amp;lt;tpl:Block&amp;gt;...&amp;lt;/tpl:Block&amp;gt; ou &lt;q&gt;tpl:Value&lt;/q&gt;&lt;/li&gt;
&lt;li&gt;on ne peut pas détecter certaines erreurs, comme un bloc non fermé. Le code correspondant sera alors laissé intact&lt;/li&gt;
&lt;li&gt;et l'inconvénient &lt;em&gt;majeur&lt;/em&gt; : la regexp utilisée entraîne une forte consommation de mémoire sur la pile par le PCRE. Les appels aux traitements de blocs/valeurs s'effectuant au sein de l'appel à preg_replace_callback, il peut arriver fréquemment des erreurs de dépassement de pile. Cela se traduit dans le meilleur des cas par un comportement bizarre, et dans le pire des cas par une erreur 500, voire d'un crash d'apache.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;Le nouveau compilateur&lt;/h3&gt;


&lt;p&gt;La situation laissée par le compilateur de la 2.2beta1 n'est pas acceptable en l'état. Même s'il est possible de contourner le problème dans certains cas, cela laisse sur la touche certains utilisateurs.&lt;/p&gt;


&lt;p&gt;Avant de parler du nouveau compilateur, un petit retour aux fondements de la compilation. Les 2 &amp;quot;compilateurs&amp;quot; précédemment cités ne sont pas de vrais compilateurs au sens puriste du terme. Ce sont plutôt de gros moteurs de recherche/remplacement.
Lorsqu'on parle de compilateur, on évoque en général plusieurs phases :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;L'analyse lexicale, qui consiste à transformer le code en entrée en séquence de jetons (token). c'est en général pris en charge par un Lexer (exemple d'outils : lex/flex)&lt;/li&gt;
&lt;li&gt;L'analyse syntaxique, qui consiste à vérifier l'enchaînement des jetons à partir d'une grammaire, et à générer une structure d'arbre interprétant le code en entrée (exemple d'outils : yacc/bison)&lt;/li&gt;
&lt;li&gt;L'analyse sémantique, qui enrichit l'arbre précédent d'informations sémantiques (ex: tables de symboles, vérifications de typage, ...)&lt;/li&gt;
&lt;li&gt;la génération du code, en parcourant l'arbre enrichi.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;(J'ai volontairement simplifié les étapes, il y a d'autres étapes intermédiaires dans un processus complet)&lt;/p&gt;


&lt;p&gt;Malheureusement, au niveau de PHP, on est assez mal loti côté outils qui faciliteraient notre compilation. Par ailleurs, la grammaire des templates dotclear est relativement basique, on a des blocs, des valeurs, et du texte... pas besoin d'avoir ces 3 étapes, donc. En revanche, elles vont grandement servir d'inspiration. N'oublions pas non plus qu'il n'est pas souhaité faire une usine à gaz, les performances doivent rester correctes.&lt;/p&gt;


&lt;p&gt;Le nouveau compilateur fonctionne donc de la manière suivante :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Découpage lexical du template. A ce niveau, on profite de preg_split pour saucissonner le fichier. on récupère ainsi un tableau contenant des &amp;quot;tokens&amp;quot; qui sont soit du texte, soit un tag d'ouverture ou de fermeture de bloc, soit un tag de valeur.&lt;/li&gt;
&lt;li&gt;On parcourt la liste des tokens, en construisant progressivement un arbre php (une structure &amp;quot;classique&amp;quot; d'arbre objet a été définie pour l'occasion)&lt;/li&gt;
&lt;li&gt;On demande à l'arbre de se compiler. Si c'est une liste de tokens ou un bloc, on retourne la concaténation des compilation des enfants&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Techniquement, le preg_split utilisé est le suivant :&lt;/p&gt;
&lt;pre class=&quot;brush: php&quot;&gt;$blocks = preg_split(
	'#(&amp;lt;tpl:\w+[^&amp;gt;]*&amp;gt;)|(&amp;lt;/tpl:\w+&amp;gt;)|({{tpl:\w+[^}]*}})#msu',$fc,-1,
	PREG_SPLIT_DELIM_CAPTURE|PREG_SPLIT_NO_EMPTY);&lt;/pre&gt;


&lt;p&gt;&lt;strong&gt;Avantages du nouveau compilateur&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;on se rapproche plus d'une vraie compilation&lt;/li&gt;
&lt;li&gt;on a un contrôle poussé de la grammaire : il est possible de trouver des blocs/valeurs inexistants, et de contrôler que les blocs sont correctement fermés&lt;/li&gt;
&lt;li&gt;on a la garantie que quand on appelle un bloc, son contenu a été compilé auparavant.&lt;/li&gt;
&lt;li&gt;les performances sont moindres que le compilateur 2.2beta1, mais on note toutefois un gain de performances de l'ordre de 15%&lt;/li&gt;
&lt;li&gt;les regexp utilisées sont plus légères que le compilateur 2.2beta1. De plus, les blocs et valeurs sont traités en dehors du moteur PCRE.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Inconvénients&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;le compilateur est tout frais, et même si plusieurs ont validé son bon fonctionnement, il peut rester quelques défauts&lt;/li&gt;
&lt;li&gt;ce compilateur consomme un peu plus de mémoire (heap) que les précédents.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Reste à valider que tout fonctionne correctement avec ce nouveau compilateur :)&lt;/p&gt;</description>
    
    
    
          <comments>http://www.morefnu.org/post/2010/06/17/Sur-le-chemin-de-la-2.2-%3A-une-histoire-de-compilateurs#comment-form</comments>
      <wfw:comment>http://www.morefnu.org/post/2010/06/17/Sur-le-chemin-de-la-2.2-%3A-une-histoire-de-compilateurs#comment-form</wfw:comment>
      <wfw:commentRss>http://www.morefnu.org/feed/atom/comments/1967</wfw:commentRss>
      </item>
    
  <item>
    <title>Sur le chemin de la 2.2 : balises et behaviors</title>
    <link>http://www.morefnu.org/post/2010/06/17/Sur-le-chemin-de-la-2.2-%3A-balises-de-template-et-behaviors</link>
    <guid isPermaLink="false">urn:md5:88d8b62e9f703d9a2d58d1e53fe1a2eb</guid>
    <pubDate>Thu, 17 Jun 2010 09:55:00 +0200</pubDate>
    <dc:creator>Dsls</dc:creator>
        <category>Dotclear 2</category>
        <category>2.2beta</category><category>dotclear2</category><category>preview</category>    
    <description>&lt;p&gt;Après une petite pause, suite des évolutions de dotclear 2.2beta :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;pour les auteurs de thèmes, les nouveautés côté balises de templates&lt;/li&gt;
&lt;li&gt;pour les auteurs de plugins, la liste des nouveaux behaviors&lt;/li&gt;
&lt;/ul&gt;    &lt;h3&gt;Changements côté balises de templates&lt;/h3&gt;

&lt;p&gt;Peu de changements de ce côté, outre quelques réparations de bugs, si ce n'est une évolution de taille : les critères de tri des balises tpl:Comments et tpl:Entries ont été améliorés.&lt;/p&gt;


&lt;p&gt;Il est désormais possible de spécifier plusieurs critères de tri.&lt;/p&gt;


&lt;p&gt;Exemple : si on souhaite afficher les billets sélectionnés d'abord, et conserver ensuite le tri par date décroissante, il suffit d'utiliser la structure :&lt;/p&gt;
&lt;pre class=&quot;brush: php&quot;&gt;&amp;lt;tpl:Entries sortby=&amp;quot;selected desc,date desc&amp;quot;&amp;gt;
[...]
&amp;lt;/tpl:Entries&amp;gt;&lt;/pre&gt;

&lt;p&gt;Pour des raisons de compatibilité, l'attribut order permet de spécifier le sens de tri à prendre par défaut s'il n'est pas précisé (&amp;quot;asc&amp;quot; ou &amp;quot;desc&amp;quot;)
Les critères de tri disponibles pour les billets sont :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&amp;quot;title&amp;quot; : tri par titre de billet&lt;/li&gt;
&lt;li&gt;&amp;quot;selected&amp;quot; : tri par billet sélectionné&lt;/li&gt;
&lt;li&gt;&amp;quot;author&amp;quot; : tri par auteur&lt;/li&gt;
&lt;li&gt;&amp;quot;date&amp;quot; : tri par date&lt;/li&gt;
&lt;li&gt;&amp;quot;id&amp;quot; : tri par id de billet&lt;/li&gt;
&lt;li&gt;&amp;quot;comment&amp;quot; : tri par nombre de commentaires&lt;/li&gt;
&lt;li&gt;&amp;quot;trackback&amp;quot; : tri par nombre de rétroliens&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Les critères de tri disponibles pour les commentaires sont :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&amp;quot;author&amp;quot; : tri par auteur&lt;/li&gt;
&lt;li&gt;&amp;quot;date&amp;quot; : tri par date&lt;/li&gt;
&lt;li&gt;&amp;quot;id&amp;quot; : tri par id de billet&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Par ailleurs, les auteurs de plugins seront ravis d'apprendre que les critères sont extensibles via le behavior &lt;em&gt;templateCustomSortByAlias&lt;/em&gt; créé pour l'occasion.
Nous y reviendrons dans un prochain billet.&lt;/p&gt;


&lt;h3&gt;Les behaviors&lt;/h3&gt;


&lt;p&gt;Ci-dessous, la liste des nouveaux behaviors introduits, en plus de &lt;a href=&quot;http://www.morefnu.org/post/2010/06/02/Sur-le-chemin-de-la-2.2-%3A-urlHandlers-et-gestion-d-erreurs&quot;&gt;ceux déjà décrits précédemment&lt;/a&gt;. La documentation exhaustive de chaque behavior sera disponible sur le &lt;a href=&quot;http://fr.dotclear.org/documentation/2.0/resources/plugins/behaviors&quot;&gt;site de documentation&lt;/a&gt;&lt;/p&gt;


&lt;h4&gt;Coté administration&lt;/h4&gt;

&lt;p&gt;L'administration des commentaires bénéficie désormais de ses propres behaviors&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;adminCommentHeaders&lt;/strong&gt; : enrichit les headers de la page d'édition d'un commentaire.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;La liste des commentaires peut maintenant accueillir des actions personnalisées. Les behaviors définis sont similaires à ceux utilisés pour les actions des billets :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;adminCommentsActionsCombo&lt;/strong&gt; : enrichit la liste des actions pour les commentaires.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;adminCommentsActions&lt;/strong&gt; : ajoute un traitement particulier pour une action donnée&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;adminCommentsActionsContent&lt;/strong&gt; : permet l'affichage d'une page intermédiaire lors du traitement personnalisé, avant soumission (ex : saisie d'un champ)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Un petit oublié dans les versions précédentes :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;adminBeforeCommentDelete&lt;/strong&gt; : action avant la suppression d'un commentaire&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;adminPostsActionsHeaders&lt;/strong&gt; :&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Et un début de behaviors pour la gestion des utilisateurs&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;adminUsersActionsCombo&lt;/strong&gt; :enrichit la liste des actions pour les utilisateurs.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;Au niveau du core&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;coreBeforeCategoryCreate&lt;/strong&gt; et &lt;strong&gt;coreAfterCategoryCreate&lt;/strong&gt; : appelés avant et après la création d'une catégorie&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;coreBeforeCategoryUpdate&lt;/strong&gt; et &lt;strong&gt;coreAfterCategoryUpdate&lt;/strong&gt; : appelés avant et après la mise à jour d'une catégorie&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;coreBeforeLogCreate&lt;/strong&gt; et &lt;strong&gt;coreAfterLogCreate&lt;/strong&gt; : appelés avant et après la création d'un log&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;coreBeforePostCreate&lt;/strong&gt; et &lt;strong&gt;coreAfterPostCreate&lt;/strong&gt; : appelés avant et après la création d'un billet&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;coreBeforePostUpdate&lt;/strong&gt; et &lt;strong&gt;coreAfterPostUpdate&lt;/strong&gt; : appelés avant et après la mise à jour d'un billet&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;Gestionnaire de médias&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;coreMediaConstruct&lt;/strong&gt; : appelé à l'initialisation de dcMedia&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;Partie publique&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;templateCustomSortByAlias&lt;/strong&gt; : ajout des critères de tri personnalisés&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;urlHandlerGetArgsDocument&lt;/strong&gt; : permet de modifier très tôt l'URL appelée pour y faire des traitements spécifiques&lt;/li&gt;
&lt;/ul&gt;</description>
    
    
    
          <comments>http://www.morefnu.org/post/2010/06/17/Sur-le-chemin-de-la-2.2-%3A-balises-de-template-et-behaviors#comment-form</comments>
      <wfw:comment>http://www.morefnu.org/post/2010/06/17/Sur-le-chemin-de-la-2.2-%3A-balises-de-template-et-behaviors#comment-form</wfw:comment>
      <wfw:commentRss>http://www.morefnu.org/feed/atom/comments/1966</wfw:commentRss>
      </item>
    
  <item>
    <title>Plugin IntegrityCheck 1.0 pour dotclear2</title>
    <link>http://www.morefnu.org/post/2010/06/11/Plugin-IntegrityCheck-1.0-pour-dotclear2</link>
    <guid isPermaLink="false">urn:md5:5680fa203cb5d257dcaba25e5ce26e3b</guid>
    <pubDate>Fri, 11 Jun 2010 15:09:00 +0000</pubDate>
    <dc:creator>Dsls</dc:creator>
        <category>dotclear2</category><category>plugin</category>    
    <description>    &lt;p&gt;Ce plugin permet de vérifier que les fichier natifs de dotclear 2 n'ont pas été altérés depuis l'installation.&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;http://www.morefnu.org/public/images/icheck/icheck_good.png&quot; title=&quot;icheck_good.png&quot;&gt;&lt;img src=&quot;http://www.morefnu.org/public/images/icheck/.icheck_good_s.jpg&quot; alt=&quot;icheck_good.png&quot; style=&quot;float:left; margin: 0 1em 1em 0;&quot; title=&quot;icheck_good.png, juin 2010&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;http://www.morefnu.org/public/images/icheck/icheck_bad.png&quot; title=&quot;icheck_bad.png&quot;&gt;&lt;img src=&quot;http://www.morefnu.org/public/images/icheck/.icheck_bad_s.jpg&quot; alt=&quot;icheck_bad.png&quot; style=&quot;float:left; margin: 0 1em 1em 0;&quot; title=&quot;icheck_bad.png, juin 2010&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div style=&quot;clear:both;&quot;&gt;&lt;/div&gt;


&lt;p&gt;Il sert notamment à vérifier qu'une éventuelle défaillance d'un plugin ne vient pas d'un mauvais transfert d'un fichier du core, ou d'un oubli de transfert.&lt;/p&gt;


&lt;p&gt;Il est compatible depuis la version 2.1.5 de dotclear (et peut-être même les versions antérieures), jusqu'à la dernière 2.2beta.&lt;/p&gt;


&lt;p&gt;Le plugin est disponible &lt;a href=&quot;http://www.morefnu.org/public/archives/dotclear2/plugins/integrityCheck/plugin-integrityCheck-1.0.zip&quot;&gt;ici&lt;/a&gt;&lt;/p&gt;</description>
    
    
    
          <comments>http://www.morefnu.org/post/2010/06/11/Plugin-IntegrityCheck-1.0-pour-dotclear2#comment-form</comments>
      <wfw:comment>http://www.morefnu.org/post/2010/06/11/Plugin-IntegrityCheck-1.0-pour-dotclear2#comment-form</wfw:comment>
      <wfw:commentRss>http://www.morefnu.org/feed/atom/comments/1965</wfw:commentRss>
      </item>
    
  <item>
    <title>MyMeta 0.4beta : les changements techniques</title>
    <link>http://www.morefnu.org/post/2010/06/09/MyMeta-0.4beta-%3A-les-changements-techniques</link>
    <guid isPermaLink="false">urn:md5:64ed9e2df78645b1ae46901abe2f0624</guid>
    <pubDate>Wed, 09 Jun 2010 15:55:00 +0200</pubDate>
    <dc:creator>Dsls</dc:creator>
        <category>My Meta</category>
        <category>dotclear2</category><category>metadata</category><category>plugin</category>    
    <description>&lt;p&gt;Après avoir brièvement présenté la version 0.4beta, les détails techniques pour ceux qui ont déjà du code MyMeta fonctionnel...&lt;/p&gt;    &lt;p&gt;Pour éviter les confusions par la suite, et parce qu'il y a des ambigüités avec la terminologie Metadata, les termes utilisé dans MyMeta sont :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Identifiant de mymeta : correspond à la colonne &amp;quot;ID&amp;quot; dans l'administration, c'est aussi la valeur renseignée dans la colonne meta_type en base de données&lt;/li&gt;
&lt;li&gt;Type de mymeta : type de données entrées dans l'administration (chaîne, liste de valeurs, checkbox, ...)&lt;/li&gt;
&lt;li&gt;Valeur de mymeta : valeur spécifiée dans la colonne mymeta correspondante lors de l'édition d'un billet, c'est aussi la valeur renseignée dans la colonne meta_id en base de données&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: en écrivant cette documentation, je me rends compte qu'il reste pas mal d'incohérences, et du code à simplifier. La documentation sera mise à jour en conséquence lors de la 0.4 finale. La présentation de ce billet ne me plaît pas non plus, je ferai plus clair dès que j'ai le temps ;)&lt;/p&gt;


&lt;h3&gt;Blocs&lt;/h3&gt;

&lt;h4&gt;&amp;lt;tpl:MyMetaData&amp;gt;...&amp;lt;/tpl:MyMetaData&amp;gt;&lt;/h4&gt;

&lt;h5&gt;Contextes d'utilisation&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Dans un fichier de template de type mymetas.html&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;Paramètres&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;les mêmes que pour tpl:Tags (anciennement tpl:MetaData)&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;Description&lt;/h5&gt;

&lt;p&gt;Récupère l'ensemble des valeurs de mymeta pour le mymeta en cours&lt;/p&gt;


&lt;h4&gt;&amp;lt;tpl:MyMetaIf&amp;gt;...&amp;lt;/tpl:MyMetaIf&amp;gt;&lt;/h4&gt;

&lt;h5&gt;Contextes d'utilisation&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Au sein de blocs où le contexte &amp;quot;posts&amp;quot; est défini (tpl:Entries par exemple)&lt;/li&gt;
&lt;li&gt;Dans le template post.html&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;Paramètres&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;type (obligatoire): ID du mymeta à tester&lt;/li&gt;
&lt;li&gt;defined=&amp;quot;true&amp;quot; : affiche le contenu du bloc si le mymeta est défini&lt;/li&gt;
&lt;li&gt;value : affiche le contenu du bloc si le mymeta a bien la valeur renseignée&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;Description&lt;/h5&gt;

&lt;p&gt;Teste la valeur ou l'existence d'une valeur de mymeta pour le billet en cours&lt;/p&gt;


&lt;h3&gt;Valeurs&lt;/h3&gt;


&lt;h4&gt;{{tpl:MetaType}}&lt;/h4&gt;

&lt;h5&gt;Contextes d'utilisation&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Dans une boucle tpl:MyMetaData ou similaire (tpl:Tags, ou tpl:EntryTags par exemple)&lt;/li&gt;
&lt;li&gt;Dans un fichier de template de type mymeta.html&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;Paramètres&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;aucun&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;Description&lt;/h5&gt;

&lt;p&gt;Affiche le type de métadonnée (qui est l'ID du mymeta, et correspond au meta_type en base).&lt;/p&gt;


&lt;h4&gt;{{tpl:MyMetaTypePrompt}}&lt;/h4&gt;

&lt;h5&gt;Contextes d'utilisation&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Si le paramètre id est défini, n'importe où&lt;/li&gt;
&lt;li&gt;Sinon :
&lt;ul&gt;
&lt;li&gt;dans une boucle tpl:MyMetaData&lt;/li&gt;
&lt;li&gt;dans les templates mymetas.html et mymeta.html&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;Paramètres&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;id (facultatif) : identifiant du mymeta&lt;/li&gt;
&lt;li&gt;type : identique à type, déprécié&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;Description&lt;/h5&gt;

&lt;p&gt;Affiche l'invite d'un mymeta (s'il est activé):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Si id est spécifié, affiche l'invite du mymeta correspondant&lt;/li&gt;
&lt;li&gt;Sinon, affiche l'invite du mymeta dans le contexte de la page ou de la boucle tpl:MyMetaData&lt;/li&gt;
&lt;/ul&gt;


&lt;h4&gt;{{tpl:MyMetaValue}}&lt;/h4&gt;

&lt;h5&gt;Contextes d'utilisation&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;dans une boucle tpl:MyMetaData&lt;/li&gt;
&lt;li&gt;dans les templates mymetas.html et mymeta.html&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;Paramètres&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;id (facultatif) : identifiant du mymeta&lt;/li&gt;
&lt;li&gt;type : identique à type, déprécié&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;Description&lt;/h5&gt;

&lt;p&gt;Affiche la valeur d'un mymeta (s'il est activé):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Si id est spécifié, affiche la valeur du mymeta correspondant&lt;/li&gt;
&lt;li&gt;Sinon, affiche la valeut du mymeta dans le contexte de la page ou de la boucle tpl:MyMetaData&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: cette balise a un comportement différent dans MyMeta 0.3. Dans un contexte de billet, en 0.4, il faut utiliser tpl:EntryMyMetaValue&lt;/p&gt;


&lt;h4&gt;{{tpl:MyMetaURL}}&lt;/h4&gt;

&lt;h5&gt;Contextes d'utilisation&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;dans une boucle tpl:MyMetaData&lt;/li&gt;
&lt;li&gt;dans les templates mymetas.html et mymeta.html&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;Paramètres&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;id (facultatif) : identifiant du mymeta&lt;/li&gt;
&lt;li&gt;type : identique à type, déprécié&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;Description&lt;/h5&gt;

&lt;p&gt;Affiche l'URL d'un mymeta (s'il est activé):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Si id est spécifié, affiche l'URL du mymeta correspondant&lt;/li&gt;
&lt;li&gt;Sinon, affiche la valeut du mymeta dans le contexte de la page ou de la boucle tpl:MyMetaData&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;{{tpl:EntryMyMetaValue}}&lt;/h4&gt;

&lt;h5&gt;Contextes d'utilisation&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Au sein de blocs où le contexte &amp;quot;posts&amp;quot; est défini (tpl:Entries par exemple)&lt;/li&gt;
&lt;li&gt;Dans le template post.html&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;Paramètres&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;id (obligatoire): identifiant du mymeta&lt;/li&gt;
&lt;li&gt;type : identique à type, déprécié&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;Description&lt;/h5&gt;

&lt;p&gt;Affiche la valeur d'un mymeta (s'il est activé) correspondant à l'ID donné pour le billet en cours (dans la boucle, ou le billet courant si dans le template post.html par exemple)&lt;/p&gt;</description>
    
    
    
          <comments>http://www.morefnu.org/post/2010/06/09/MyMeta-0.4beta-%3A-les-changements-techniques#comment-form</comments>
      <wfw:comment>http://www.morefnu.org/post/2010/06/09/MyMeta-0.4beta-%3A-les-changements-techniques#comment-form</wfw:comment>
      <wfw:commentRss>http://www.morefnu.org/feed/atom/comments/1964</wfw:commentRss>
      </item>
    
  <item>
    <title>Plugin MyMeta 0.4beta2</title>
    <link>http://www.morefnu.org/post/2010/06/08/Plugin-MyMeta-0.4beta</link>
    <guid isPermaLink="false">urn:md5:69ff0d1fd1d626ff206ae7549b0d309b</guid>
    <pubDate>Tue, 08 Jun 2010 00:58:00 +0200</pubDate>
    <dc:creator>Dsls</dc:creator>
        <category>My Meta</category>
        <category>dotclear2</category><category>metadata</category><category>plugin</category><category>preview</category>    
    <description>    &lt;p&gt;Il s'est passé du temps depuis la dernière version du plugin MyMeta. Pourtant le développement ne s'est pas arrêté, loin de là.&lt;/p&gt;


&lt;p&gt;La version 0.4 constitue une évolution majeure du plugin, incluant une refonte des mécanismes internes. La version 0.4-beta est disponible au téléchargement, tous les feedbacks sont les bienvenus.&lt;/p&gt;


&lt;h3&gt;Nouvelle administration&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;http://www.morefnu.org/public/images/mymeta/mymeta04_admin.png&quot; title=&quot;mymeta04_admin.png&quot;&gt;&lt;img src=&quot;http://www.morefnu.org/public/images/mymeta/.mymeta04_admin_m.jpg&quot; alt=&quot;mymeta04_admin.png&quot; style=&quot;display:block; margin:0 auto;&quot; title=&quot;mymeta04_admin.png, juin 2010&quot; /&gt;&lt;/a&gt;
L'administration du plugin a été revue pour plus de souplesse.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Il est possible d'ordonner les mymeta, et de les placer dans des sections particulières&lt;/li&gt;
&lt;li&gt;Deux nouveaux types de mymeta voient le jour : Date (enfin!) et checkbox. Le nouveau modèle plus souple permet d'ailleurs de définir de nouveaux types de mymeta sans casser la structure existante. Un plugin externe peut ainsi enregistrer ses propres types de mymeta&lt;/li&gt;
&lt;li&gt;Pour chaque mymeta, il est désormais possible de définir :
&lt;ul&gt;
&lt;li&gt;Si une page publique est définie pour afficher les valeurs du mymeta, ou la liste des billets correspondant à une valeur donnée&lt;/li&gt;
&lt;li&gt;les fichiers de template à utiliser pour ces pages publiques (par défaut mymetas.html et mymeta.html)&lt;/li&gt;
&lt;li&gt;les types de billets concernés par ce mymeta. Avec l'arrivée du &lt;a href=&quot;http://dleds.net/post/2010/06/07/Extension-Muppet-pour-Dotclear&quot;&gt;plugin muppet&lt;/a&gt;, cela prend tout son sens.&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;Il est possible d'appliquer des mymeta sur plusieurs billets, via la liste des billets&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;http://www.morefnu.org/public/images/mymeta/mymeta04_adminpostslist.png&quot; title=&quot;mymeta04_adminpostslist.png&quot;&gt;&lt;img src=&quot;http://www.morefnu.org/public/images/mymeta/.mymeta04_adminpostslist_m.jpg&quot; alt=&quot;mymeta04_adminpostslist.png&quot; style=&quot;display:block; margin:0 auto;&quot; title=&quot;mymeta04_adminpostslist.png, juin 2010&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Il est possible de renommer une valeur mymeta pour tous les billets&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;http://www.morefnu.org/public/images/mymeta/mymeta04_adminvalue.png&quot; title=&quot;mymeta04_adminvalue.png&quot;&gt;&lt;img src=&quot;http://www.morefnu.org/public/images/mymeta/.mymeta04_adminvalue_m.jpg&quot; alt=&quot;mymeta04_adminvalue.png&quot; style=&quot;display:block; margin:0 auto;&quot; title=&quot;mymeta04_adminvalue.png, juin 2010&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;Widgets&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;http://www.morefnu.org/public/images/mymeta/mymeta04_widget_value.png&quot; title=&quot;mymeta04_widget_value.png&quot;&gt;&lt;img src=&quot;http://www.morefnu.org/public/images/mymeta/.mymeta04_widget_value_m.jpg&quot; alt=&quot;mymeta04_widget_value.png&quot; style=&quot;float:left; margin: 0 1em 1em 0;&quot; title=&quot;mymeta04_widget_value.png, juin 2010&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;http://www.morefnu.org/public/images/mymeta/mymeta04_widget_list.png&quot; title=&quot;mymeta04_widget_list.png&quot;&gt;&lt;img src=&quot;http://www.morefnu.org/public/images/mymeta/.mymeta04_widget_list_m.jpg&quot; alt=&quot;mymeta04_widget_list.png&quot; style=&quot;float:left; margin: 0 1em 1em 0;&quot; title=&quot;mymeta04_widget_list.png, juin 2010&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div style=&quot;clear:both;&quot;&gt;&lt;/div&gt;


&lt;p&gt;2 widgets font leur apparition :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;la liste de MyMeta, affichant les mymeta définis pour le blog&lt;/li&gt;
&lt;li&gt;La liste de valeurs MyMeta (similaire au widget Tags), affichant l'ensemble des valeurs prises par un mymeta donné&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;Balises template&lt;/h3&gt;

&lt;p&gt;Il y a quelques changements au niveau des balises tpl pour la partie publique, je reviendrai dessus prochainement. En attendant, si vous avez inséré des balises MyMeta dans un thème, je vous invite à attendre le prochain billet sur le plugin.&lt;/p&gt;


&lt;h3&gt;Téléchargement&lt;/h3&gt;

&lt;p&gt;Le plugin en version 0.4-beta2 (compatible dotclear 2.1.6 et supérieur) est disponible ici : &lt;a href=&quot;http://www.morefnu.org/public/archives/dotclear2/plugins/mymeta/plugin-mymeta-0.4-beta2.zip&quot;&gt;MyMeta 0.4 beta&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Note: la beta2 corrige quelques bugs au niveau du widget et de l'attribut &amp;quot;key&amp;quot; de tpl:EntryMyMetaValue&lt;/p&gt;


&lt;p&gt;Tout feedback est bien sûr le bienvenu.&lt;/p&gt;


&lt;p&gt;Note : pour revenir en arrière vers la version 0.3, en cas de souci :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;dans about:config, copiez la valeur mymeta_fields_backup dans mymeta_fields&lt;/li&gt;
&lt;li&gt;installer la 0.3.x sans passer par le tableau de bord&lt;/li&gt;
&lt;/ul&gt;</description>
    
    
    
          <comments>http://www.morefnu.org/post/2010/06/08/Plugin-MyMeta-0.4beta#comment-form</comments>
      <wfw:comment>http://www.morefnu.org/post/2010/06/08/Plugin-MyMeta-0.4beta#comment-form</wfw:comment>
      <wfw:commentRss>http://www.morefnu.org/feed/atom/comments/1963</wfw:commentRss>
      </item>
    
  <item>
    <title>Sur le chemin de la 2.2 : les settings</title>
    <link>http://www.morefnu.org/post/2010/06/02/Sur-le-chemin-de-la-2.2-%3A-les-settings</link>
    <guid isPermaLink="false">urn:md5:11a00a3d2899dc542ac3b7a89863a8a5</guid>
    <pubDate>Wed, 02 Jun 2010 13:40:00 +0000</pubDate>
    <dc:creator>Dsls</dc:creator>
        <category>Dotclear 2</category>
        <category>2.2beta</category><category>dotclear2</category><category>preview</category>    
    <description>&lt;p&gt;Autre nouveauté sous le capot de dotclear 2.2, le changement dans la gestion des settings. Le sujet a déjà été traité sur la liste du lab dotclear, mais cela ne fait pas de mal d'en rappeler principes&lt;/p&gt;    &lt;p&gt;dotclear 2.1 proposait regrouper les settings en &amp;quot;namespaces&amp;quot;, mais ces namespaces n'étaient pas utilisés directement dans la récupération des settings : pour récupérer un setting, il fallait faire appel à &lt;strong&gt;$core-&amp;gt;blog-&amp;gt;settings-&amp;gt;&lt;em&gt;&amp;lt;nomdusetting&amp;gt;&lt;/em&gt;&lt;/strong&gt;.&lt;/p&gt;


&lt;p&gt;Conséquence intrinsèque, il était impossible de définir 2 settings de même nom dans 2 namespaces différents&lt;/p&gt;


&lt;p&gt;dotclear 2.2 ajoute le nom de namespace dans la récupération des settings. Là où en 2.1.7 on utilise &lt;strong&gt;$core-&amp;gt;blog-&amp;gt;settings-&amp;gt;themes_path&lt;/strong&gt; par exemple, en 2.2 on utilisera désormais &lt;strong&gt;$core-&amp;gt;blog-&amp;gt;settings-&amp;gt;&lt;em&gt;system&lt;/em&gt;-&amp;gt;themes_path&lt;/strong&gt;&lt;/p&gt;


&lt;p&gt;L'ancien mécanisme d'appel des settings sera toujours opérationnel en 2.2, mais il est fortement conseillé de faire évoluer les plugins vers les nouvelles méthodes. Pour ce faire :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Remplacer tous les appels à &lt;strong&gt;$core-&amp;gt;blog-&amp;gt;settings-&amp;gt;setNameSpace()&lt;/strong&gt; par &lt;strong&gt;$core-&amp;gt;blog-&amp;gt;settings-&amp;gt;addNameSpace()&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Remplacer les appels à &lt;strong&gt;$core-&amp;gt;blog-&amp;gt;settings-&amp;gt;&lt;em&gt;setting&lt;/em&gt;&lt;/strong&gt; par des appels à &lt;strong&gt;$core-&amp;gt;blog-&amp;gt;settings-&amp;gt;&lt;em&gt;namespace&lt;/em&gt;-&amp;gt;&lt;em&gt;setting&lt;/em&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Remplacer les appels à &lt;strong&gt;$core-&amp;gt;blog-&amp;gt;settings-&amp;gt;put()&lt;/strong&gt; par des appels à &lt;strong&gt;$core-&amp;gt;blog-&amp;gt;settings-&amp;gt;&lt;em&gt;namespace&lt;/em&gt;-&amp;gt;put()&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Par ailleurs, les nouveaux nommages des settings incluant le nom du namespace, on peut se passer complètement de l'appel à &lt;strong&gt;$core-&amp;gt;blog-&amp;gt;settings-&amp;gt;setNameSpace&lt;/strong&gt;. L'appel à &lt;strong&gt;$core-&amp;gt;blog-&amp;gt;settings-&amp;gt;addNameSpace()&lt;/strong&gt; n'est obligatoire que dans le cas d'ajout d'un setting, si on n'est pas sûr que le namespace existe déjà&lt;/p&gt;


&lt;p&gt;A noter, si votre blog est configuré en mode DEBUG, et uniquement dans ce cas (voir à cet effet les lignes à décommenter dans &lt;em&gt;inc/prepend.php&lt;/em&gt;) un NOTICE PHP apparaîtra en cas d'utilisation d'un plugin se basant sur les anciens mécanismes.&lt;/p&gt;</description>
    
    
    
          <comments>http://www.morefnu.org/post/2010/06/02/Sur-le-chemin-de-la-2.2-%3A-les-settings#comment-form</comments>
      <wfw:comment>http://www.morefnu.org/post/2010/06/02/Sur-le-chemin-de-la-2.2-%3A-les-settings#comment-form</wfw:comment>
      <wfw:commentRss>http://www.morefnu.org/feed/atom/comments/1962</wfw:commentRss>
      </item>
    
  <item>
    <title>Sur le chemin de la 2.2 : au revoir Metadata, bonjour Tags</title>
    <link>http://www.morefnu.org/post/2010/06/02/Sur-le-chemin-de-la-2.2-%3A-au-revoir-Metadata%2C-bonjour-Tags</link>
    <guid isPermaLink="false">urn:md5:3eca1a36b4e40fb595e8b09fe3a1f3ea</guid>
    <pubDate>Wed, 02 Jun 2010 09:04:00 +0000</pubDate>
    <dc:creator>Dsls</dc:creator>
        <category>Dotclear 2</category>
        <category>2.2beta</category><category>dotclear</category><category>preview</category>    
    <description>&lt;p&gt;Le passage à dotclear 2.2 est l'occasion de remettre à plat le plugin Metadata.&lt;/p&gt;


&lt;p&gt;Jusqu'alors, Metadata avait 2 rôles : la gestion des métadonnées, et la gestion des tags.
Metadata fera désormais partie intégrante du core de dotclear, sous la forme du fichier inc/core/class.dc.meta.php.&lt;/p&gt;


&lt;p&gt;Les parties spécifiques à la gestion des tags ont été déplacées au sein d'un nouveau plugin livré de base, le plugin Tags.&lt;/p&gt;    &lt;p&gt;D'autres améliorations ont été apportées :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Maintenant qu'il est intégré au core, il n'est plus besoin d'instancier la classe dcMeta à tout-va. Une instance est désormais systématiquement créée dans $core-&amp;gt;meta&lt;/li&gt;
&lt;li&gt;La méthode $core-&amp;gt;meta-&amp;gt;getMeta est dépréciée. L'ancienne méthode avait pour signature :&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;brush: php&quot;&gt;public function getMeta($type=null,$limit=null,$meta_id=null,$post_id=null) {&lt;/pre&gt;


&lt;p&gt;Il faudra désormais compter sur deux nouvelles méthodes :&lt;/p&gt;
&lt;pre class=&quot;brush: php&quot;&gt;public function getMetadata($params=array(), $count_only=false){}
public function computeMetaStats($rs) {}&lt;/pre&gt;


&lt;p&gt;Concrètement, &lt;strong&gt;getMeta&lt;/strong&gt; avait 2 rôles : récupérer des métadonnées, et calculer les statistiques de ces métadonnées (occurences d'apparition, notamment utilisées par les nuages de tags). Ces 2 rôles sont désormais séparés.&lt;/p&gt;


&lt;p&gt;&lt;strong&gt;getMetadata&lt;/strong&gt; récupère les métadonnées en fonction de certains critères. Son mécanisme est très similaire à getPosts de $core-&amp;gt;blog. $params peut prendre les attributs suivants :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;meta_type : récupère les métadonnées d'un type donné&lt;/li&gt;
&lt;li&gt;meta_id : récupère les métadonnées ayant une valeur donnée&lt;/li&gt;
&lt;li&gt;post_id : récypère les métadonnées d'un billet donné&lt;/li&gt;
&lt;li&gt;limit : limite le nombre d'entrées récupérées&lt;/li&gt;
&lt;li&gt;order : spécifie l'ordre de récupération des métadonnées&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;computeMetaStats&lt;/strong&gt; enrichit le résultat renvoyé par getMetadata en y insérant les champs statistiques percent et roundpercent.&lt;/p&gt;


&lt;p&gt;En pratique, un ancien appel à getMeta de la forme :&lt;/p&gt;
&lt;pre class=&quot;brush: php&quot;&gt;$meta = new dcMeta($core);
$rs_meta = $meta-&amp;gt;getMeta($type,$limit,$meta_id,$post_id);&lt;/pre&gt;

&lt;p&gt;sera à modifier en :&lt;/p&gt;
&lt;pre class=&quot;brush: php&quot;&gt;$rs_meta = $core-&amp;gt;meta-&amp;gt;getMetadata(array(
	'meta_type' =&amp;gt; $type,
	'meta_id' =&amp;gt; $meta_id,
	'post_id' =&amp;gt; $post_id,
	'limit' =&amp;gt; $limit));&lt;/pre&gt;

&lt;p&gt;ou, s'il y a des statistiques à récupérer, en :&lt;/p&gt;
&lt;pre class=&quot;brush: php&quot;&gt;$rs_meta = $core-&amp;gt;meta-&amp;gt;computeMetaStats(
		$core-&amp;gt;meta-&amp;gt;getMetadata(array(
			'meta_type' =&amp;gt; $type,
			'meta_id' =&amp;gt; $meta_id,
			'post_id' =&amp;gt; $post_id,
			'limit' =&amp;gt; $limit)));&lt;/pre&gt;


&lt;p&gt;L'ancienne méthode getMeta est toujours présente pour des raisons de compatibilité avec l'existant.&lt;/p&gt;</description>
    
    
    
          <comments>http://www.morefnu.org/post/2010/06/02/Sur-le-chemin-de-la-2.2-%3A-au-revoir-Metadata%2C-bonjour-Tags#comment-form</comments>
      <wfw:comment>http://www.morefnu.org/post/2010/06/02/Sur-le-chemin-de-la-2.2-%3A-au-revoir-Metadata%2C-bonjour-Tags#comment-form</wfw:comment>
      <wfw:commentRss>http://www.morefnu.org/feed/atom/comments/1961</wfw:commentRss>
      </item>
    
  <item>
    <title>Sur le chemin de la 2.2 : urlHandlers et gestion d'erreurs</title>
    <link>http://www.morefnu.org/post/2010/06/02/Sur-le-chemin-de-la-2.2-%3A-urlHandlers-et-gestion-d-erreurs</link>
    <guid isPermaLink="false">urn:md5:165d3b6f86ccee88b8ae4a0d1fc65f4d</guid>
    <pubDate>Wed, 02 Jun 2010 07:21:00 +0000</pubDate>
    <dc:creator>Dsls</dc:creator>
        <category>Dotclear 2</category>
        <category>2.2beta</category><category>dotclear2</category><category>preview</category>    
    <description>&lt;p&gt;Autant le premier article de la série était tout public, autant celui-là est principalement dédié aux développeurs de plugins.&lt;/p&gt;


&lt;p&gt;Dotclear 2.2 introduit de nouveaux mécanismes au niveau des urlhandlers, afin de faciliter la vie des plugineurs.&lt;/p&gt;    &lt;h3&gt;Nouveaux behaviors&lt;/h3&gt;


&lt;p&gt;De nouveaux behaviors ont été ajoutés à bas niveau dans la gestion des urlHandlers, ils sont au nombre de 3 : urlHandlerBeforeGetData, urlHandlerBeforeSearchCount et urlHandlerGetArgsDocument.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;urlHandleBeforeGetData est appelé juste avant de servir un fichier de template. Il permet notamment de changer au dernier moment le fichier à livrer.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Exemple pratique basé sur l'&lt;a href=&quot;http://www.turbinagaz.com/post/2008/04/29/Template-personnalise-par-categorie&quot;&gt;astuce de Pep&lt;/a&gt; pour servir un template personnalisé pour une catégorie donnée. Le code à produire devient grandement réduit, et évite de réécrire du code du core :&lt;/p&gt;
&lt;pre class=&quot;brush: php&quot;&gt;$core-&amp;gt;addBehavior('urlHandlerBeforeGetData',array('myBehaviors','beforeGetData'));
class myBehaviors
{
	public static function beforeGetData($_ctx)
	{
		global $core;
		if ($_ctx-&amp;gt;current_tpl == &amp;quot;category.html&amp;quot;) {
			$tpl = 'category-'.$_ctx-&amp;gt;categories-&amp;gt;cat_id.'.html';
			if ($core-&amp;gt;tpl-&amp;gt;getFilePath($tpl)) {
				$_ctx-&amp;gt;current_tpl = $tpl;
			}
		}
	}
}&lt;/pre&gt;

&lt;p&gt;Le handler en question récupère le contexte en paramètre, et il peut le modifier à sa guise. Dans notre cas, si category-&amp;lt;id_cat&amp;gt;.html existe, alors il est servi en lieu et place de category.html&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;urlHandlerBeforeSearchCount permet d'agir avant d'afficher le nombre de résultats dans la page search.html. avec dotclear 2.1.7, il n'était pas possible de modifier la requête de comptage des billets correspondant à la recherche. Le behavior prend en paramètre le tableau de paramètres ($params) qui sera transmis à la requête getPosts&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;urlHandlerGetArgsDocument permet de modifier les arguments &lt;strong&gt;avant&lt;/strong&gt; l'appel du handler. Le behavior prend en paramètre l'urlHandler courant, dont on peut réaffecter les attributs. On peut imaginer par exemple un plugin extraierait des informations supplémentaires à la fin de l'url d'un billet (ex: /fr, /page/xxx si le plugin gère la pagination de billet), et qui restaurerait l'url attendue par l'urlhandler, ni vu, ni connu.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;Gestion des pages d'erreur&lt;/h3&gt;

&lt;p&gt;Avec dotclear 2.1.7, il n'était pas possible de gérer des pages d'erreurs particulières, en dehors d'une modification de la page 404.html : lorsqu'un urlHandler ne savait pas quoi faire de l'url entrée, ou détectait qu'elle correspondait à une page inexistante, il renvoyait vers la dcUrlHandler::p404(), et rien n'était interceptable à ce niveau-là.&lt;/p&gt;


&lt;p&gt;doclear 2.2 introduit une gestion des pages d'erreurs, par le biais la méthode &amp;quot;registerError&amp;quot; ajoutée à clearbricks:&lt;/p&gt;
&lt;pre class=&quot;brush: php&quot;&gt;class urlHandler
{
	...
	public function registerError($handler){}
	...
}&lt;/pre&gt;


&lt;p&gt;Désormais, lorsqu'un urlHandler ne sait pas servir une page donnée (ex: page non trouvée, erreur de traitement, ...), plutôt que de rappeler dcUrlHandler::p404, il lui suffit de lever une exception, avec pour code le code d'erreur http voulu. Pour garder une compatibilité avec les anciens plugins, l'ancienne méthode dcUrlHandler::p404 a été modifiée comme suit :&lt;/p&gt;
&lt;pre class=&quot;brush: php&quot;&gt;public static function p404()
	{
		throw new Exception (&amp;quot;Page not found&amp;quot;,404);
	}&lt;/pre&gt;

&lt;p&gt;A ce niveau-là, doclear intercepte l'exception, et déroule les handlers d'erreur un par un (dernier enregistré, premier servi), jusqu'à ce qu'un handler d'erreur lui indique qu'il a traité la page. En dernier recours, c'est le le handler d'erreur par défaut de dotclear qui sert la page, en l'occurrence l'ancien p404.&lt;/p&gt;


&lt;p&gt;Au niveau du plugin, pour enregistrer un nouvel errorHandler, ça se passera au niveau du _public.php :&lt;/p&gt;
&lt;pre class=&quot;brush: php&quot;&gt;$core-&amp;gt;url-&amp;gt;registerError(array('myPublicBehaviors','error'));

class myPublicBehaviors
{
	public static function error($args,$type,$e) {
		// exemple de filtrage pour une erreur 404
		if ($e-&amp;gt;getCode() == 404) {
			if (iCanHandleErrorAndServePage) {
				// Traitement spécifiques, et renvoi de la page
				return true;
			}
	}&lt;/pre&gt;


&lt;p&gt;Les paramètres transmis au handler sont :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;$args contient les arguments transmis à l'urlHandler initial&lt;/li&gt;
&lt;li&gt;$type contient le type d'urlHandler appelé ('post', 'category', 'archive', ...). Il correspond au type enregistré lors de l'appel à $core-&amp;gt;url-&amp;gt;register&lt;/li&gt;
&lt;li&gt;$e contient l'exception levée&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Si l'errorHandler retourne true, dotclear arrête de parcourir les errorHandlers et considère le traitement comme OK. Sinon il passe par le handler suivant.&lt;/p&gt;


&lt;p&gt;Si vous voulez voir une mise en pratique de ce nouveau mécanisme d'errorHandler, allez faire un tour du coté du plugin &lt;a href=&quot;http://www.morefnu.org/post/2010/05/07/Plugin-meuh-pour-dotclear&quot;&gt;meuh&lt;/a&gt;, qui intercepte les erreurs pour voir dans une table d'alias si un billet n'avait pas l'url donnée auparavant.&lt;/p&gt;</description>
    
    
    
          <comments>http://www.morefnu.org/post/2010/06/02/Sur-le-chemin-de-la-2.2-%3A-urlHandlers-et-gestion-d-erreurs#comment-form</comments>
      <wfw:comment>http://www.morefnu.org/post/2010/06/02/Sur-le-chemin-de-la-2.2-%3A-urlHandlers-et-gestion-d-erreurs#comment-form</wfw:comment>
      <wfw:commentRss>http://www.morefnu.org/feed/atom/comments/1960</wfw:commentRss>
      </item>
    
  <item>
    <title>Sur le chemin de la 2.2 : les changements visibles</title>
    <link>http://www.morefnu.org/post/2010/06/01/Sur-le-chemin-de-la-2.2-%3A-les-changements-visibles</link>
    <guid isPermaLink="false">urn:md5:901b24ea4c505f018be28ac7f226d279</guid>
    <pubDate>Tue, 01 Jun 2010 19:43:00 +0200</pubDate>
    <dc:creator>Dsls</dc:creator>
        <category>Dotclear 2</category>
        <category>2.2beta</category><category>dotclear2</category><category>preview</category>    
    <description>&lt;p&gt;Ils sont peu nombreux, mais ils sont quand même là, coté administration. Ce (court) billet les détaille.&lt;/p&gt;    &lt;h3&gt;Administration : tableau de bord&lt;/h3&gt;

&lt;p&gt;Le &amp;quot;billet rapide&amp;quot; est désormais repliable :&lt;/p&gt;


&lt;p&gt;&lt;img src=&quot;http://www.morefnu.org/public/images/22beta/billet_rapide.png&quot; alt=&quot;billet_rapide.png&quot; title=&quot;billet_rapide.png, juin 2010&quot; /&gt;&lt;/p&gt;


&lt;h3&gt;Administration : billets/commentaires&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Gmail a fait des émules : il est désormais possible de sélectionner/désélectionner une plage de billets/commentaires. Pour ce faire, cliquez la case à cocher à coté du premier billet, et shift-cliquez sur la case à cocher à coté du dernier billet à sélectionner...&lt;/li&gt;
&lt;li&gt;Une option &amp;quot;aucune sélection&amp;quot; fait son apparition dans les listes de billets/commentaires&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Au niveau de l'édition de billets, l'auto-complétion des tags est active : entrez le début d'un tag, et il proposera les tags déjà existants. Cela fonctionne aussi lors de l'ajout de tags à un ensemble de billets.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src=&quot;http://www.morefnu.org/public/images/22beta/tag_autocomplete.png&quot; alt=&quot;tag_autocomplete.png&quot; title=&quot;tag_autocomplete.png, juin 2010&quot; /&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Coté tags, au niveau des préférences utilisateurs, il est possible de choisir si on souhaite une liste courte (toutefois extensible via un lien &amp;quot;tous les tags&amp;quot;), ou la liste complète des tags dans la barre de droite de l'édition des billets.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;Administration : utilisateurs&lt;/h3&gt;

&lt;p&gt;Le statut admin/super admin des utilisateurs est visualisable dans la liste des utilisateurs, via une &amp;quot;médaille&amp;quot;&lt;/p&gt;


&lt;p&gt;&lt;img src=&quot;http://www.morefnu.org/public/images/22beta/utilisateurs.png&quot; alt=&quot;utilisateurs.png&quot; title=&quot;utilisateurs.png, juin 2010&quot; /&gt;&lt;/p&gt;


&lt;h3&gt;Du coté des widgets&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Si le blogroll est vide, le widget &amp;quot;Liens&amp;quot; ne sera pas affiché&lt;/li&gt;
&lt;li&gt;Le widget tags propose une nouvelle option, permettant de ne pas afficher le lien &amp;quot;tous les tags&amp;quot;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;Et plus généralement&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;jquery passe en version 1.4.2, coté public et administration&lt;/li&gt;
&lt;li&gt;Si le blog est mis hors-ligne, un message d'erreur explicite s'affiche coté public.&lt;/li&gt;
&lt;/ul&gt;</description>
    
    
    
          <comments>http://www.morefnu.org/post/2010/06/01/Sur-le-chemin-de-la-2.2-%3A-les-changements-visibles#comment-form</comments>
      <wfw:comment>http://www.morefnu.org/post/2010/06/01/Sur-le-chemin-de-la-2.2-%3A-les-changements-visibles#comment-form</wfw:comment>
      <wfw:commentRss>http://www.morefnu.org/feed/atom/comments/1959</wfw:commentRss>
      </item>
    
  <item>
    <title>Sur le chemin de la 2.2 ...</title>
    <link>http://www.morefnu.org/post/2010/06/01/Sur-le-chemin-de-la-2.2</link>
    <guid isPermaLink="false">urn:md5:05399462216937b55e528e2ed8945bb3</guid>
    <pubDate>Tue, 01 Jun 2010 19:06:00 +0200</pubDate>
    <dc:creator>Dsls</dc:creator>
        <category>Dotclear 2</category>
        <category>2.2beta</category><category>dotclear2</category><category>preview</category>    
    <description>&lt;p&gt;Ce ne sera une surprise pour personne, ça a déjà été annoncé: dotclear 2.2 sortira &amp;quot;quand il sera prêt&amp;quot;. Mais visuellement rien ne sera bien différent. Et pourtant, ce sont nombre de corrections de bugs et de nouvelles fonctionnalités qui apparaissent sous le capot.&lt;/p&gt;    &lt;p&gt;Je vais donc essayer de dégrossir les nouveautés au travers de quelques billets thématiques. Ils seront pour la plupart destinés aux développeurs de plugins, afin qu'ils puissent pleinement tirer partie des nouvelles fonctionnalités, mais pas qu'eux...
Dans le désordre :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://morefnu.org/post/2010/06/01/Sur-le-chemin-de-la-2.2-:-les-changements-visibles&quot;&gt;les changements visibles&lt;/a&gt;, car il y en aura quand même un peu&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://morefnu.org/post/2010/06/02/Sur-le-chemin-de-la-2.2-:-urlHandlers-et-gestion-d-erreurs&quot;&gt;du nouveau dans les urlhandlers et la gestion des pages d'erreurs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.morefnu.org/post/2010/06/02/Sur-le-chemin-de-la-2.2-%3A-au-revoir-Metadata%2C-bonjour-Tags&quot;&gt;La &amp;quot;corification&amp;quot; des tags&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.morefnu.org/post/2010/06/02/Sur-le-chemin-de-la-2.2-%3A-les-settings&quot;&gt;la gestion des settings&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.morefnu.org/post/2010/06/17/Sur-le-chemin-de-la-2.2-%3A-balises-de-template-et-behaviors&quot;&gt;Balises de template et behaviors&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.morefnu.org/post/2010/06/17/Sur-le-chemin-de-la-2.2-:-une-histoire-de-compilateurs&quot;&gt;Le moteur de templates évolue&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Les différents billets seront postés et mis à jour au fur et à mesure du recensement des évolutions apportées au core...&lt;/p&gt;</description>
    
    
    
          <comments>http://www.morefnu.org/post/2010/06/01/Sur-le-chemin-de-la-2.2#comment-form</comments>
      <wfw:comment>http://www.morefnu.org/post/2010/06/01/Sur-le-chemin-de-la-2.2#comment-form</wfw:comment>
      <wfw:commentRss>http://www.morefnu.org/feed/atom/comments/1958</wfw:commentRss>
      </item>
    
</channel>
</rss>
