Résumé
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.
Pour ce qui sera possiblement gênant suivant les cas :
- Suppression du 6e argument (opts) de WidgetsElement::setting()
- Suppression des 2e et 3e arguments (alt_not_home et alt_home) de WidgetsElement::checkHomeOnly()
- Les méthodes XmlTag::nodes(), node() et name() sont renommées
- Le gabarit RSS 2 n'utilise plus XSLT (mustek, dotty et glaz)
Sécurité
- La clé de récupération n'utilise plus les fonctions faibles md5() et uniqid()
- Filtrage des IPs locales pour les rétroliens et pingbacks
- Vérification renforcée des noms de fichiers avant l'extraction d'une archive zip
- L'export plat n'utilise plus un dossier temporaire non protégé dans le dossier public
- Certaines tâches de maintenance réservées au super administrateur pouvaient être lancées par un administrateur
- Correction d'une faille XSS par réflexion sur les webmentions
- Nettoyage de l'auteur des commentaires
- Vérification insensible à la casse des extensions de médias (ex : x.PHP.jpg)
Nouveautés
- Nouvelle valeur de gabarit tpl:BlogLanguageDirection, à utiliser avec
dir="{{tpl:BlogLanguageDirection}}", ajoutée à la balise html de mustek, dotty et glaz - Nouveaux éléments Aside, Dialog, Nav et Datalist dans les helpers de formulaire
- Nouveaux attributs command et commandfor pour Btn, target et rel pour Link, et attributs aria-* pour les helpers de formulaire
- Getters et setters typés (Str, Int, Bool et Float) pour la classe Cursor
- Nouvelles méthodes SqlStatement::between() et SqlStatement::caseWhen()
- Nouvelle méthode App::config()->tplsets() qui liste les jeux de gabarits disponibles
- Nouvelle méthode App::backend()->isPopup() pour savoir si la page d'admin est ouverte en popup
- Nouveaux behaviors coreContentFilterV2, adminSimpleMenuBeforeEditV2, adminPageNotificationErrorV2 et versions V2 des behaviors admin*SortbyCombo
- Les sous-catégories sont incluses dans le flux des commentaires si le paramètre du blog le demande
- Affichage des différences entre un fichier et celui du thème parent dans l'éditeur de thème
- Option pour ne pas vider l'URL d'une entrée quand son titre ou sa date change
- Option pour désactiver la navigation entre les entrées avec les flèches du clavier
- Lien de support affiché pour les thèmes activés, s'il existe
- Menu d'accès rapide aux notices et nombre de notices dans le titre de la page
- Prise en charge des langues écrites de droite à gauche dans l'administration et le thème Berlin
Changements
- Suppression du mécanisme de verrouillage des mises à jour des thèmes, devenu inutile
- Le moteur de gabarits accepte un argument de constructeur pour le mode debug
- App::frontend()->search_count est maintenant de type int
- Mise en page des filtres (billets, commentaires, médias, blogs, utilisateurs, …) en flex
- Révision de la présentation des préférences utilisateur (présentation et comportement)
- Champs plus larges dans l'admin (titres, emails, URLs, …)
- Cache des fichiers de traduction chargés
- Le CSS de l'admin n'est plus généré avec SASS
- Ajout de tests de bout en bout avec Playwright et règles PHPStan plus strictes
- Nombreuses corrections : import Wordpress, type MIME des MP3 et du RSS 2, éditeur de thème, ligne de commande, etc…
Dépréciés
- Le champ options de la table des utilisateurs, utiliser la table des préférences utilisateur
- Le behavior coreContentFilter, utiliser coreContentFilterV2
- Le behavior adminSimpleMenuBeforeEdit, utiliser adminSimpleMenuBeforeEditV2
- Les behaviors adminPostsSortbyCombo, adminCommentsSortbyCombo, adminBlogsSortbyCombo et adminUsersSortbyCombo, utiliser leurs versions V2
- Le behavior adminPageNotificationError, utiliser adminPageNotificationErrorV2
- App::backend()->popup, utiliser App::backend()->isPopup()
Retirés
- Le 6e argument de WidgetsElement::setting() et les 2e et 3e arguments de WidgetsElement::checkHomeOnly()
- Le mécanisme de verrouillage des mises à jour des thèmes
- La gestion de l'attribut inutilisé disable de tpl:IfWidgets
Tous les détails sont dans le CHANGELOG et le billet d'annonce officiel.
Exemples
Le behavior coreContentFilterV2 remplace coreContentFilter, il reçoit désormais des objets Content plutôt que des tableaux par référence :
App::behavior()->addBehavior('coreContentFilterV2', function (string $context, array $contents): string {
foreach ($contents as $content) {
if ($content->getFormat() === 'html') {
$content->setContent(str_replace('Dotclaer', 'Dotclear', $content->getContent()));
}
}
return '';
});
Les behaviors admin*SortbyComboV2 reçoivent un ArrayObject :
App::behavior()->addBehavior('adminPostsSortbyComboV2', function (ArrayObject $combo): string {
$combo[__('Word count')] = 'post_words';
return '';
});
Pour les widgets, la méthode checkHomeOnly() ne prend plus qu'un argument :
// Avant 2.40
if (!$w->checkHomeOnly(App::url()->getType(), 1, 0)) {
return '';
}
// Depuis 2.40
if (!$w->checkHomeOnly(App::url()->getType())) {
return '';
}
Et pour setting(), le 5e argument est maintenant un tableau d'options typé :
$w->setting('order', __('Order:'), 'asc', 'combo', [
__('Ascending') => 'asc',
__('Descending') => 'desc',
]);
Enfin pour les thèmes qui ont leur propre fichier __layout.html, on peut ajouter la direction de la langue du blog :
<html lang="{{tpl:BlogLanguage}}" dir="{{tpl:BlogLanguageDirection}}">
Rappel
Dotclear a toujours besoin de main d'œuvre, dans différents domaines, à différents niveaux.
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 config.php de votre installation Dotclear et de passer la directive DC_UPDATE_VERSION de stable à unstable :
// Update channel (stable, unstable, testing)
define('DC_UPDATE_VERSION', 'unstable');
Il existe également des images Docker prêtes à l'emploi. On peut aussi rappeler que le plugin DotclearWatch permet à l'équipe de suivre l'utilisation de Dotclear.
Enfin un coup de pouce financier 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.
Aidez nous à vous aider !
Merci.