<?xml version="1.0" encoding="utf-8"?><rss xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:noNamespaceSchemaLocation="rss2.xsd" 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>DotclearWatch / Blog - Mot-clé - 2.39</title>
    <link>https://dotclear.watch/</link>
    <atom:link href="http://dotclear.watch/feed/tag/2.39/rss2" rel="self" type="application/rss+xml" />
    <description>Suivez l'évolution du moteur de blogs Dotclear.</description>
    <language>fr</language>
    <pubDate>Wed, 11 Nov 2026 11:00:11 +0100</pubDate>
    <copyright>Tous droits réservés © Jean-Christian Denis</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>Dotclear</generator>
          <item>
        <title>Sortie de Dotclear 2.39</title>
        <link>https://dotclear.watch/Billet/Sortie-de-Dotclear-2.39</link>
        <guid isPermaLink="false">urn:md5:b85a087a6555da8e2be58d198739b3bd</guid>
        <pubDate>Thu, 13 Aug 2026 10:05:00 +0200</pubDate>
        <dc:creator>Jean-Christian Denis</dc:creator>
                  <category>Actualités</category>
                          <category>2.39</category>
                  <category>release</category>
                <description>&lt;p&gt;Ce jeudi 13 août 2026 sort la version 2.39 du moteur de blogs Dotclear.&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://dotclear.org/post/2026/08/13/Dotclear-2.39&quot; hreflang=&quot;fr&quot; title=&quot;Annonce officielle de Dotclear 2.39&quot;&gt;Cette version&lt;/a&gt; apporte un nouveau jeu de gabarits nommé &lt;strong&gt;glaz&lt;/strong&gt;, des outils pour faire pivoter ou retourner les images dans la médiathèque, une nouvelle constante &lt;strong&gt;DC_MODERN&lt;/strong&gt; pour traquer les vieilleries de son installation, et une meilleure détection des formulaires non enregistrés. Côté code, c'est une version importante pour les développeurs de plugins et thèmes. On reparle de ces changements dans un &lt;a href=&quot;https://dotclear.watch/Billet/2.39&quot; hreflang=&quot;fr&quot; title=&quot;Détail de la version 2.39&quot;&gt;billet dédié&lt;/a&gt;.&lt;br&gt;
&lt;br&gt;
Et bon anniversaire Dotclear !&lt;/p&gt;</description>
        
              </item>
          <item>
        <title>2.39</title>
        <link>https://dotclear.watch/Billet/2.39</link>
        <guid isPermaLink="false">urn:md5:ec72228596ea4e681f291c0e9fb56cfa</guid>
        <pubDate>Thu, 13 Aug 2026 10:00:00 +0200</pubDate>
        <dc:creator>Jean-Christian Denis</dc:creator>
                  <category>Versions</category>
                          <category>2.39</category>
                <description>&lt;p&gt;Sortie le 13 août 2026, cette version de Dotclear fait un grand pas vers un code plus moderne et plus strict.&lt;/p&gt; &lt;p&gt;&lt;img alt=&quot;badge version 2.39&quot; src=&quot;https://img.shields.io/badge/Version-2.39-blue?style=for-the-badge&quot;&gt; &lt;img alt=&quot;badge date 13 aout 2026&quot; src=&quot;https://img.shields.io/badge/Date-13%20aout%202026-green?style=for-the-badge&quot;&gt;&lt;/p&gt;

&lt;h5&gt;Résumé&lt;/h5&gt;
&lt;p&gt;Côté utilisateur, un nouveau jeu de gabarits &lt;strong&gt;glaz&lt;/strong&gt;, des outils de rotation et de retournement d'images dans la médiathèque et une meilleure surveillance des formulaires non enregistrés. Côté développeur, c'est une version chargée : typage renforcé, nouvelles classes pour les menus, icônes, notices et filtres de préférences utilisateur, et une bonne série de dépréciés. Le nouveau drapeau &lt;strong&gt;DC_MODERN&lt;/strong&gt; permet de vérifier dès maintenant si vos plugins et thèmes se passent du code obsolète.&lt;br&gt;
Pour ce qui sera possiblement gênant suivant les cas :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Les plugins qui fournissent leurs propres fichiers de gabarit doivent ajouter ceux du jeu &lt;strong&gt;glaz&lt;/strong&gt; (voir &lt;code&gt;default-templates/glaz&lt;/code&gt; des plugins pages et tags)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Structure::table()&lt;/strong&gt; n'enregistre une nouvelle table que si elle ne l'est pas déjà&lt;/li&gt;
&lt;li&gt;La pile d'instances Codemirror (global &lt;em&gt;codemirror_instance&lt;/em&gt;) est déplacée dans &lt;strong&gt;dotclear.codemirror&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Les anciennes méthodes de formulaire (legacy) n'acceptent plus de tableau associatif de paramètres optionnels&lt;/li&gt;
&lt;li&gt;Les variables globales &lt;strong&gt;__top_behaviors&lt;/strong&gt; et &lt;strong&gt;__shutdown&lt;/strong&gt; ne sont plus prises en compte&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Filters::userOptions()&lt;/strong&gt; est déprécié et ne retourne plus que null&lt;/li&gt;
&lt;li&gt;La classe &lt;strong&gt;UserPrefFilter&lt;/strong&gt; est obligatoire pour les filtres de préférences utilisateur&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;UrlHandler-&amp;gt;type&lt;/strong&gt; n'est plus public, il faut utiliser &lt;strong&gt;getType()&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Record-&amp;gt;index()&lt;/strong&gt; ne retourne plus null&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;

&lt;h5&gt;Nouveautés&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Nouveau jeu de gabarits &lt;strong&gt;glaz&lt;/strong&gt; (plus de conteneur #wrapper, __layout.html qui décrit les grands blocs, nouveau fichier _entry-footer.html, une classe en doublon de chaque id, etc…)&lt;/li&gt;
&lt;li&gt;Nouvelle constante &lt;strong&gt;DC_MODERN&lt;/strong&gt; (dans &lt;code&gt;inc/config.php&lt;/code&gt;) pour ne pas charger le code PHP et JS obsolète, désactivée par défaut&lt;/li&gt;
&lt;li&gt;Bouton pour créer des liens symboliques vers les thèmes livrés si le dossier de thèmes du blog n'est pas celui par défaut&lt;/li&gt;
&lt;li&gt;Rotation et retournement d'images dans la gestion des médias&lt;/li&gt;
&lt;li&gt;Contextes spécifiques pour les pages de configuration des plugins et thèmes : &lt;strong&gt;PLUGIN_CONFIG&lt;/strong&gt; et &lt;strong&gt;THEME_CONFIG&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Méthodes typées &lt;strong&gt;strField()&lt;/strong&gt;, &lt;strong&gt;intField()&lt;/strong&gt; et &lt;strong&gt;boolField()&lt;/strong&gt; pour &lt;strong&gt;MetaRecord::field()&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Méthodes typées getXXX (str, int, bool, float) pour les paramètres de blog et les préférences utilisateur&lt;/li&gt;
&lt;li&gt;Méthode &lt;strong&gt;UrlHandler::isType()&lt;/strong&gt; pour tester le type d'URL courant&lt;/li&gt;
&lt;li&gt;Méthode &lt;strong&gt;SqlStatement::satinizeIn()&lt;/strong&gt; pour préparer une liste destinée à &lt;strong&gt;SqlStatement::in()&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Méthode &lt;strong&gt;count()&lt;/strong&gt; sur la classe Listing de l'admin&lt;/li&gt;
&lt;li&gt;Nouvelles classes &lt;strong&gt;MenuItem&lt;/strong&gt; et &lt;strong&gt;Icon&lt;/strong&gt; pour la gestion des menus et des icônes (favoris compris)&lt;/li&gt;
&lt;li&gt;Nouvelle classe &lt;strong&gt;Notice&lt;/strong&gt; avec &lt;strong&gt;Notices::addNewNotice()&lt;/strong&gt; et le behavior &lt;strong&gt;adminPageNotificationV2&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Nouveau behavior &lt;strong&gt;adminFiltersListsV3&lt;/strong&gt; (à utiliser à la place de adminFiltersListsV2)&lt;/li&gt;
&lt;li&gt;Option &lt;em&gt;defer&lt;/em&gt; pour les méthodes &lt;strong&gt;jsLoad()&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Les URLs des dépôts de plugins et thèmes viennent du fichier release.json, avec repli sur les paramètres du blog&lt;/li&gt;
&lt;li&gt;Bouton dans l'entête pour afficher les informations de débogage&lt;/li&gt;
&lt;/ul&gt;

&lt;h5&gt;Changements&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Les options utilisateur standards migrent vers la table des préférences utilisateur (le plugin Tags aussi)&lt;/li&gt;
&lt;li&gt;Les classes javascript &lt;strong&gt;jsToolBar&lt;/strong&gt;, &lt;strong&gt;jsButton&lt;/strong&gt;, &lt;strong&gt;jsSpace&lt;/strong&gt;, &lt;strong&gt;jsCombo&lt;/strong&gt;, &lt;strong&gt;jsDialog&lt;/strong&gt; et &lt;strong&gt;metaEditor&lt;/strong&gt; passent dans l'objet global &lt;strong&gt;dotclear&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;La longueur des champs de table est toujours un entier (0 si non pertinent)&lt;/li&gt;
&lt;li&gt;Les erreurs de chargement de fichiers de modules sont ignorées silencieusement&lt;/li&gt;
&lt;li&gt;Optimisation de la vérification des mises à jour des modules&lt;/li&gt;
&lt;li&gt;Mise à jour de Codemirror (5.65.7 vers 5.65.21)&lt;/li&gt;
&lt;li&gt;Sécurité : suppression des affectations innerHtml (prévention XSS)&lt;/li&gt;
&lt;li&gt;Révision des couleurs, des icônes et de la grille du tableau de bord&lt;/li&gt;
&lt;li&gt;Les langues autres que l'anglais et le français sont traduites automatiquement&lt;/li&gt;
&lt;li&gt;Passage de PHPStan au niveau max&lt;/li&gt;
&lt;li&gt;Nombreuses corrections : authentification sans blog par défaut, maintenance, médias, ThemeConfig::publicCssUrlHelper(), etc…&lt;/li&gt;
&lt;/ul&gt;

&lt;h5&gt;Dépréciés&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Notices::addNotice()&lt;/strong&gt;, utiliser &lt;strong&gt;Notices::addNewNotice()&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;La classe globale &lt;strong&gt;metaEditor&lt;/strong&gt;, utiliser &lt;strong&gt;dotclear.MetaEditor&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;La classe globale &lt;strong&gt;jsToolBar&lt;/strong&gt;, utiliser &lt;strong&gt;dotclear.ToolBar&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;$GLOBALS['_l10n']&lt;/strong&gt; et &lt;strong&gt;$_l10n&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ConnectionInterface::escape()&lt;/strong&gt;, utiliser &lt;strong&gt;escapeStr()&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;La classe &lt;strong&gt;form&lt;/strong&gt;, utiliser &lt;strong&gt;Dotclear\Helper\Html\Form\*&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Auth::getOption()&lt;/strong&gt; et &lt;strong&gt;Auth::getOptions()&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Favorite::smallIcon()&lt;/strong&gt; et &lt;strong&gt;Favorite::largeIcon()&lt;/strong&gt;, utiliser &lt;strong&gt;Favorite::menuIcon()&lt;/strong&gt; et &lt;strong&gt;Favorite::dashboardIcon()&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Filters::userOptions()&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Pour vérifier que votre installation se passe de tout ça, il suffit de décommenter la ligne suivante dans le fichier &lt;code&gt;inc/config.php&lt;/code&gt; :&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;define('DC_MODERN', true);&lt;/code&gt;&lt;/pre&gt;

&lt;h5&gt;Retirés&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;La prise en compte des variables globales &lt;strong&gt;__top_behaviors&lt;/strong&gt; et &lt;strong&gt;__shutdown&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Tous les détails sont dans le &lt;a href=&quot;https://codeberg.org/Dotclear/dotclear/src/branch/2.39/CHANGELOG&quot; hreflang=&quot;en&quot; title=&quot;Changelog Dotclear 2.39&quot;&gt;CHANGELOG&lt;/a&gt; et le &lt;a href=&quot;https://dotclear.org/post/2026/08/13/Dotclear-2.39&quot; hreflang=&quot;fr&quot; title=&quot;Annonce officielle de Dotclear 2.39&quot;&gt;billet d'annonce officiel&lt;/a&gt;.&lt;/p&gt;

&lt;h5&gt;Rappel&lt;/h5&gt;
&lt;p&gt;Dotclear a toujours besoin de main d'œuvre, dans différents domaines, à différents niveaux.&lt;br&gt;
&lt;br&gt;
Donc si vous avez un peu de temps pour tester, je rappelle qu'il y a des versions de développement mises à jour en permanence, il suffit de modifier le fichier &lt;code&gt;config.php&lt;/code&gt; de votre installation Dotclear et de passer la directive &lt;strong&gt;DC_UPDATE_VERSION&lt;/strong&gt; de &lt;em&gt;stable&lt;/em&gt; à &lt;em&gt;unstable&lt;/em&gt; :&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;// Update channel (stable, unstable, testing)
define('DC_UPDATE_VERSION', 'unstable');&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Il existe également des &lt;a href=&quot;https://docker.dotclear.watch/Billet/247/Les-images&quot; hreflang=&quot;fr&quot; title=&quot;Les images Docker de Dotclear&quot;&gt;images Docker&lt;/a&gt; prêtes à l'emploi. On peut aussi rappeler que le plugin &lt;a href=&quot;https://dotclear.watch/Pages/Aidez-nous&quot; hreflang=&quot;fr&quot; title=&quot;Le plugin DotclearWatch&quot;&gt;DotclearWatch&lt;/a&gt; permet à l'équipe de suivre l'utilisation de Dotclear.&lt;br&gt;
&lt;br&gt;
Enfin un &lt;a href=&quot;https://fr.dotclear.org/donate&quot; hreflang=&quot;fr&quot; title=&quot;Faire un don&quot;&gt;coup de pouce financier&lt;/a&gt; est toujours le bienvenu pour maintenir les hébergements et noms de domaines officiels Dotclear.&lt;br&gt;
&lt;br&gt;
Aidez nous à vous aider !&lt;br&gt;
Merci.&lt;/p&gt;</description>
        
              </item>
      </channel>
</rss>
