<?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.40</title>
    <link>https://dotclear.watch/</link>
    <atom:link href="http://dotclear.watch/feed/tag/2.40/rss2" rel="self" type="application/rss+xml" />
    <description>Suivez l'évolution du moteur de blogs Dotclear.</description>
    <language>fr</language>
    <pubDate>Fri, 13 Nov 2026 10:02:46 +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>2.40</title>
        <link>https://dotclear.watch/Billet/2.40</link>
        <guid isPermaLink="false">urn:md5:410aa43383375ab5f446bf95b3ef13df</guid>
        <pubDate>Fri, 13 Nov 2026 10:00:00 +0100</pubDate>
        <dc:creator>Jean-Christian Denis</dc:creator>
                  <category>Versions</category>
                          <category>2.40</category>
                <description>&lt;p&gt;Sortie le 13 novembre 2026, cette version de Dotclear renforce la sécurité et poursuit l'amélioration de l'expérience utilisateur.&lt;/p&gt; &lt;p&gt;&lt;img alt=&quot;badge version 2.40&quot; src=&quot;https://img.shields.io/badge/Version-2.40-blue?style=for-the-badge&quot;&gt; &lt;img alt=&quot;badge date 13 novembre 2026&quot; src=&quot;https://img.shields.io/badge/Date-13%20novembre%202026-green?style=for-the-badge&quot;&gt;&lt;/p&gt;

&lt;h5&gt;Résumé&lt;/h5&gt;
&lt;p&gt;Une version qui corrige plusieurs problèmes de sécurité, poursuit l'amélioration continue de l'expérience utilisateur et de l'accessibilité, et apporte son lot de corrections de bugs. Côté code, les helpers de formulaire s'enrichissent, de nouveaux behaviors V2 arrivent et plusieurs anciens deviennent dépréciés.&lt;br&gt;
Pour ce qui sera possiblement gênant suivant les cas :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Suppression du 6e argument (&lt;em&gt;opts&lt;/em&gt;) de &lt;strong&gt;WidgetsElement::setting()&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Suppression des 2e et 3e arguments (&lt;em&gt;alt_not_home&lt;/em&gt; et &lt;em&gt;alt_home&lt;/em&gt;) de &lt;strong&gt;WidgetsElement::checkHomeOnly()&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Les méthodes &lt;strong&gt;XmlTag::nodes()&lt;/strong&gt;, &lt;strong&gt;node()&lt;/strong&gt; et &lt;strong&gt;name()&lt;/strong&gt; sont renommées&lt;/li&gt;
&lt;li&gt;Le gabarit RSS 2 n'utilise plus XSLT (mustek, dotty et glaz)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;

&lt;h5&gt;Sécurité&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;La clé de récupération n'utilise plus les fonctions faibles &lt;strong&gt;md5()&lt;/strong&gt; et &lt;strong&gt;uniqid()&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Filtrage des IPs locales pour les rétroliens et pingbacks&lt;/li&gt;
&lt;li&gt;Vérification renforcée des noms de fichiers avant l'extraction d'une archive zip&lt;/li&gt;
&lt;li&gt;L'export plat n'utilise plus un dossier temporaire non protégé dans le dossier public&lt;/li&gt;
&lt;li&gt;Certaines tâches de maintenance réservées au super administrateur pouvaient être lancées par un administrateur&lt;/li&gt;
&lt;li&gt;Correction d'une faille XSS par réflexion sur les webmentions&lt;/li&gt;
&lt;li&gt;Nettoyage de l'auteur des commentaires&lt;/li&gt;
&lt;li&gt;Vérification insensible à la casse des extensions de médias (ex : x.PHP.jpg)&lt;/li&gt;
&lt;/ul&gt;

&lt;h5&gt;Nouveautés&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Nouvelle valeur de gabarit &lt;strong&gt;tpl:BlogLanguageDirection&lt;/strong&gt;, à utiliser avec &lt;code&gt;dir=&quot;{{tpl:BlogLanguageDirection}}&quot;&lt;/code&gt;, ajoutée à la balise html de mustek, dotty et glaz&lt;/li&gt;
&lt;li&gt;Nouveaux éléments &lt;strong&gt;Aside&lt;/strong&gt;, &lt;strong&gt;Dialog&lt;/strong&gt;, &lt;strong&gt;Nav&lt;/strong&gt; et &lt;strong&gt;Datalist&lt;/strong&gt; dans les helpers de formulaire&lt;/li&gt;
&lt;li&gt;Nouveaux attributs &lt;strong&gt;command&lt;/strong&gt; et &lt;strong&gt;commandfor&lt;/strong&gt; pour Btn, &lt;strong&gt;target&lt;/strong&gt; et &lt;strong&gt;rel&lt;/strong&gt; pour Link, et attributs &lt;strong&gt;aria-*&lt;/strong&gt; pour les helpers de formulaire&lt;/li&gt;
&lt;li&gt;Getters et setters typés (Str, Int, Bool et Float) pour la classe &lt;strong&gt;Cursor&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Nouvelles méthodes &lt;strong&gt;SqlStatement::between()&lt;/strong&gt; et &lt;strong&gt;SqlStatement::caseWhen()&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Nouvelle méthode &lt;strong&gt;App::config()-&amp;gt;tplsets()&lt;/strong&gt; qui liste les jeux de gabarits disponibles&lt;/li&gt;
&lt;li&gt;Nouvelle méthode &lt;strong&gt;App::backend()-&amp;gt;isPopup()&lt;/strong&gt; pour savoir si la page d'admin est ouverte en popup&lt;/li&gt;
&lt;li&gt;Nouveaux behaviors &lt;strong&gt;coreContentFilterV2&lt;/strong&gt;, &lt;strong&gt;adminSimpleMenuBeforeEditV2&lt;/strong&gt;, &lt;strong&gt;adminPageNotificationErrorV2&lt;/strong&gt; et versions V2 des behaviors &lt;strong&gt;admin*SortbyCombo&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Les sous-catégories sont incluses dans le flux des commentaires si le paramètre du blog le demande&lt;/li&gt;
&lt;li&gt;Affichage des différences entre un fichier et celui du thème parent dans l'éditeur de thème&lt;/li&gt;
&lt;li&gt;Option pour ne pas vider l'URL d'une entrée quand son titre ou sa date change&lt;/li&gt;
&lt;li&gt;Option pour désactiver la navigation entre les entrées avec les flèches du clavier&lt;/li&gt;
&lt;li&gt;Lien de support affiché pour les thèmes activés, s'il existe&lt;/li&gt;
&lt;li&gt;Menu d'accès rapide aux notices et nombre de notices dans le titre de la page&lt;/li&gt;
&lt;li&gt;Prise en charge des langues écrites de droite à gauche dans l'administration et le thème Berlin&lt;/li&gt;
&lt;/ul&gt;

&lt;h5&gt;Changements&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Suppression du mécanisme de verrouillage des mises à jour des thèmes, devenu inutile&lt;/li&gt;
&lt;li&gt;Le moteur de gabarits accepte un argument de constructeur pour le mode debug&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;App::frontend()-&amp;gt;search_count&lt;/strong&gt; est maintenant de type int&lt;/li&gt;
&lt;li&gt;Mise en page des filtres (billets, commentaires, médias, blogs, utilisateurs, …) en flex&lt;/li&gt;
&lt;li&gt;Révision de la présentation des préférences utilisateur (présentation et comportement)&lt;/li&gt;
&lt;li&gt;Champs plus larges dans l'admin (titres, emails, URLs, …)&lt;/li&gt;
&lt;li&gt;Cache des fichiers de traduction chargés&lt;/li&gt;
&lt;li&gt;Le CSS de l'admin n'est plus généré avec SASS&lt;/li&gt;
&lt;li&gt;Ajout de tests de bout en bout avec Playwright et règles PHPStan plus strictes&lt;/li&gt;
&lt;li&gt;Nombreuses corrections : import Wordpress, type MIME des MP3 et du RSS 2, éditeur de thème, ligne de commande, etc…&lt;/li&gt;
&lt;/ul&gt;

&lt;h5&gt;Dépréciés&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Le champ &lt;strong&gt;options&lt;/strong&gt; de la table des utilisateurs, utiliser la table des préférences utilisateur&lt;/li&gt;
&lt;li&gt;Le behavior &lt;strong&gt;coreContentFilter&lt;/strong&gt;, utiliser &lt;strong&gt;coreContentFilterV2&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Le behavior &lt;strong&gt;adminSimpleMenuBeforeEdit&lt;/strong&gt;, utiliser &lt;strong&gt;adminSimpleMenuBeforeEditV2&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Les behaviors &lt;strong&gt;adminPostsSortbyCombo&lt;/strong&gt;, &lt;strong&gt;adminCommentsSortbyCombo&lt;/strong&gt;, &lt;strong&gt;adminBlogsSortbyCombo&lt;/strong&gt; et &lt;strong&gt;adminUsersSortbyCombo&lt;/strong&gt;, utiliser leurs versions V2&lt;/li&gt;
&lt;li&gt;Le behavior &lt;strong&gt;adminPageNotificationError&lt;/strong&gt;, utiliser &lt;strong&gt;adminPageNotificationErrorV2&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;App::backend()-&amp;gt;popup&lt;/strong&gt;, utiliser &lt;strong&gt;App::backend()-&amp;gt;isPopup()&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h5&gt;Retirés&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Le 6e argument de &lt;strong&gt;WidgetsElement::setting()&lt;/strong&gt; et les 2e et 3e arguments de &lt;strong&gt;WidgetsElement::checkHomeOnly()&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Le mécanisme de verrouillage des mises à jour des thèmes&lt;/li&gt;
&lt;li&gt;La gestion de l'attribut inutilisé &lt;em&gt;disable&lt;/em&gt; de &lt;strong&gt;tpl:IfWidgets&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.40/CHANGELOG&quot; hreflang=&quot;en&quot; title=&quot;Changelog Dotclear 2.40&quot;&gt;CHANGELOG&lt;/a&gt; et le &lt;a href=&quot;https://dotclear.org/post/2026/11/13/Dotclear-2.40&quot; hreflang=&quot;fr&quot; title=&quot;Annonce officielle de Dotclear 2.40&quot;&gt;billet d'annonce officiel&lt;/a&gt;.&lt;/p&gt;

&lt;h5&gt;Exemples&lt;/h5&gt;
&lt;p&gt;Le behavior &lt;strong&gt;coreContentFilterV2&lt;/strong&gt; remplace &lt;strong&gt;coreContentFilter&lt;/strong&gt;, il reçoit désormais des objets &lt;strong&gt;Content&lt;/strong&gt; plutôt que des tableaux par référence :&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;App::behavior()-&amp;gt;addBehavior('coreContentFilterV2', function (string $context, array $contents): string {
    foreach ($contents as $content) {
        if ($content-&amp;gt;getFormat() === 'html') {
            $content-&amp;gt;setContent(str_replace('Dotclaer', 'Dotclear', $content-&amp;gt;getContent()));
        }
    }

    return '';
});&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Les behaviors &lt;strong&gt;admin*SortbyComboV2&lt;/strong&gt; reçoivent un &lt;strong&gt;ArrayObject&lt;/strong&gt; :&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;App::behavior()-&amp;gt;addBehavior('adminPostsSortbyComboV2', function (ArrayObject $combo): string {
    $combo[__('Word count')] = 'post_words';

    return '';
});&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Pour les widgets, la méthode &lt;strong&gt;checkHomeOnly()&lt;/strong&gt; ne prend plus qu'un argument :&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;// Avant 2.40
if (!$w-&amp;gt;checkHomeOnly(App::url()-&amp;gt;getType(), 1, 0)) {
    return '';
}

// Depuis 2.40
if (!$w-&amp;gt;checkHomeOnly(App::url()-&amp;gt;getType())) {
    return '';
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Et pour &lt;strong&gt;setting()&lt;/strong&gt;, le 5e argument est maintenant un tableau d'options typé :&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;$w-&amp;gt;setting('order', __('Order:'), 'asc', 'combo', [
    __('Ascending')  =&amp;gt; 'asc',
    __('Descending') =&amp;gt; 'desc',
]);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Enfin pour les thèmes qui ont leur propre fichier &lt;code&gt;__layout.html&lt;/code&gt;, on peut ajouter la direction de la langue du blog :&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;&amp;lt;html lang=&quot;{{tpl:BlogLanguage}}&quot; dir=&quot;{{tpl:BlogLanguageDirection}}&quot;&amp;gt;&lt;/code&gt;&lt;/pre&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. Et il est désormais possible de devenir membre de Dotclear.&lt;br&gt;
&lt;br&gt;
Aidez nous à vous aider !&lt;br&gt;
Merci.&lt;/p&gt;</description>
        
              </item>
          <item>
        <title>Sortie de Dotclear 2.40</title>
        <link>https://dotclear.watch/Billet/Sortie-de-Dotclear-2.40</link>
        <guid isPermaLink="false">urn:md5:3fcc7fd113268df59de05f6a8032abae</guid>
        <pubDate>Fri, 13 Nov 2026 10:00:00 +0100</pubDate>
        <dc:creator>Jean-Christian Denis</dc:creator>
                  <category>Actualités</category>
                          <category>2.40</category>
                  <category>release</category>
                <description>&lt;p&gt;Ce vendredi 13 novembre 2026 sort la version 2.40 du moteur de blogs Dotclear.&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://dotclear.org/post/2026/11/13/Dotclear-2.40&quot; hreflang=&quot;fr&quot; title=&quot;Annonce officielle de Dotclear 2.40&quot;&gt;Cette version&lt;/a&gt; met l'accent sur la sécurité avec une bonne série de correctifs, poursuit l'amélioration continue de l'expérience utilisateur et de l'accessibilité, et corrige bon nombre de bugs. Une mise à jour recommandée. On reparle de ces changements dans un &lt;a href=&quot;https://dotclear.watch/Billet/2.40&quot; hreflang=&quot;fr&quot; title=&quot;Détail de la version 2.40&quot;&gt;billet dédié&lt;/a&gt;.&lt;br&gt;
&lt;br&gt;&lt;/p&gt;</description>
        
              </item>
      </channel>
</rss>
