Série - Adapter le code pour Dotclear 2.24

Fil des billets - Fil des commentaires

jeudi 20 octobre 2022

Adapter son code pour la 2.24

Je commence une série de billets, qui seront également publiés sur le blog Dotclear1, à propos de l’adaptation de votre code (plugins et thèmes) à la nouvelle version 2.24 de Dotclear.

À savoir :

  1. Ça va essentiellement concerner le code PHP

  2. Je vais y aller très progressivement et régulièrement2

  3. J’essaierai de vous fournir, autant que possible, des indications pour faire les recherches et remplacements nécessaires.

  4. Il y aura ici une nouvelle série qui regroupera tous les billets en question.


  1. Au fur et à mesure mais avec un léger décalage pour les laisser murir un peu ici. ↩︎

  2. Peut-être pas un billet par jour mais ça sera assez rapproché. ↩︎

vendredi 21 octobre 2022

Adapter son code pour la 2.24 n° 2

On commence aujourd’hui avec une petite mise en bouche, la variable $core, et son équivalent $GLOBALS[‘core’].

Depuis la 2.23 on peut, et même il est vivement recommandé d’utiliser à la place dcCore::app() qui est disponible partout, tout le temps et qui permet au passage d’ignorer superbement la variable $core fournie dans certaines méthodes et fonctions de votre code.

En résumé, faites une recherche avec l’expression régulière :

(\\?\$core|\\?\$GLOBALS\['core'\]|\\?\$this->core)

Ou si vous ne savez pas comment faire, les expressions suivantes1 :

  1. \$core
  2. $core
  3. \$GLOBALS['core']
  4. $GLOBALS['core']
  5. \$this->core
  6. $this->core

Et remplacez les correspondances2 trouvées par :

dcCore::app().

Attention : ne touchez à rien dans les paramètres des fonctions/méthodes, ça n’est pas utile et ça provoquerait des erreurs.

Un exemple, $core est présent lignes 1 (paramètre de fonction) et 8 :

    public static function adminDashboardFavorites($core, $favs)
    {
        $favs->register('Typo', [
            'title'       => __('Typographic replacements'),
            'url'         => 'plugin.php?p=typo',
            'small-icon'  => [urldecode(dcPage::getPF('typo/icon.svg')), urldecode(dcPage::getPF('typo/icon-dark.svg'))],
            'large-icon'  => [urldecode(dcPage::getPF('typo/icon.svg')), urldecode(dcPage::getPF('typo/icon-dark.svg'))],
            'permissions' => $core->auth->makePermissions([
                dcAuth::PERMISSION_CONTENT_ADMIN,
            ]),
        ]);
    }

Je ne touche à rien ligne 1, par contre je remplace ligne 8 :

    public static function adminDashboardFavorites($core, $favs)
    {
        $favs->register('Typo', [
            'title'       => __('Typographic replacements'),
            'url'         => 'plugin.php?p=typo',
            'small-icon'  => [urldecode(dcPage::getPF('typo/icon.svg')), urldecode(dcPage::getPF('typo/icon-dark.svg'))],
            'large-icon'  => [urldecode(dcPage::getPF('typo/icon.svg')), urldecode(dcPage::getPF('typo/icon-dark.svg'))],
            'permissions' => dcCore::app()->auth->makePermissions([
                dcAuth::PERMISSION_CONTENT_ADMIN,
            ]),
        ]);
    }

Si jamais vous aviez des :

global $core;

Voire, si vous avez remplacé aussi ces lignes en :

global dcCore::app();

Alors vous pouvez les supprimer.

Vous pouvez d’ailleurs le faire dès maintenant — si vous testez avec une version 2.23.? — et indiquer que votre plugin (ou votre thème) nécessite3 a minima la version 2.23, avec un :

        'requires' => [['core', '2.23']],

Mais si vous allez poursuivre avec moi — ou si vous testez avec une version 2.24-dev — alors autant mettre immédiatement ceci :

        'requires' => [['core', '2.24']],

Ça vous évitera d’avoir à le faire plus tard.

Notez que si vous voulez tester vos modifications de ce jour en situation réelle, avec une 2.23.1 par exemple, alors conservez 2.23 pour la dépendance, vous ferez la modification une fois que vos tests seront concluants.


Et c’est là que vous vous dites : Ah mais si le $core que j’ai en paramètre de mes fonctions ne sert plus à rien, on pourrait l’enlever ?.

Deux réflexions :

  1. Si c’est du code interne chez vous, alors vous pouvez faire le nécessaire, à savoir virer ce paramètre de la fonction et le virer partout où la fonction est appelée. N’oubliez pas de tester tout de même ;-)

  2. Si c’est du code externe, comme par exemple une fonction de rappel d’un behavior, alors on en causera plus tard, c’est un peu prématuré d’y toucher à ce stade.


N’hésitez pas à commenter et critiquer — il se peut que je sois passé sur des trucs qui me paraissent évidents alors que ce n’est pas le cas pour tout le monde —, j’amenderai ce billet si nécessaire en fonction de vos retours !


  1. La forme avec l’antislash au début (\) est utile pour les thèmes (et parfois les plugins) qui utilisent des espaces de nom. ↩︎

  2. Je pense que vous ne devriez pas en trouver beaucoup en ce qui concerne la 5e et la 6e ↩︎

  3. À modifier ou à insérer dans le fichier _define.php↩︎

samedi 22 octobre 2022

Adapter son code pour la 2.24 n° 3

On continue cette fois avec la variable $_ctx (ou son équivalent $GLOBALS['_ctx']) qui est à remplacer par dcCore::app()->ctx, partout dans votre code, y compris dans celui qui génère du code PHP pour les balises template.

Exemple pris dans le code d’une des balises du thème Ductile1.

Avant :

return '<?php if (strlen(' . sprintf($full, '$_ctx->posts->getContent(' . $urls . ')') . ') > ' .
        'strlen(' . sprintf($short, '$_ctx->posts->getContent(' . $urls . ')') . ')) : ?>' .
        $content .
        '<?php endif; ?>';

Après :

return '<?php if (strlen(' . sprintf($full, 'dcCore::app()->ctx->posts->getContent(' . $urls . ')') . ') > ' .
        'strlen(' . sprintf($short, 'dcCore::app()->ctx->posts->getContent(' . $urls . ')') . ')) : ?>' .
        $content .
        '<?php endif; ?>';

L’expression régulière de recherche à utiliser étant :

((\\*?)\$_ctx|\$GLOBALS\['_ctx'\])

Si vous n’aimez pas les expressions régulières, alors cherchez ceci :

$GLOBALS['_ctx']
$_ctx
\$GLOBALS['_ctx']
\$_ctx

Et à remplacer par :

dcCore::app()->ctx

Par ailleurs n’oubliez pas de supprimer les lignes contenant :

global $_ctx;

Elles ne serviront plus.


Comme pour la variable $core (voir à ce sujet le billet précédent), vous pouvez ne toucher à rien pour l’instant, la variable globale étant toujours déclarée.

Notez qu’elle sera supprimée dans le futur, donc tant que vous y êtes, sautez le pas ;-)


  1. Les plugins et thèmes de la version 2.23 ont déjà été modifiés en conséquence, vous pouvez un œil à leur code si nécessaire. ↩︎

dimanche 23 octobre 2022

Adapter son code pour la 2.24 n° 4

On continue avec la variable globale $_lang (ou son équivalent $GLOBALS['_lang']) qui est à remplacer par dcCore::app()->lang, partout dans votre code.

Exemple pris dans le code d’une des balises du thème Ductile1.

Avant :

\l10n::set(__DIR__ . '/locales/' . $_lang . '/main');

Après :

\l10n::set(__DIR__ . '/locales/' . \dcCore::app()->lang . '/main');

L’expression régulière de recherche à utiliser étant :

((\\*?)\$_lang|\$GLOBALS\['_lang'\])

Si vous n’aimez pas les expressions régulières, alors cherchez ceci :

$GLOBALS['_lang']
$_lang
\$GLOBALS['_lang']
\$_lang

Et à remplacer par :

dcCore::app()->lang

Par ailleurs n’oubliez pas de supprimer les lignes contenant :

global $_lang;

Elles ne serviront plus.


Comme pour la variable $core (voir à ce sujet le billet correspondant), vous pouvez ne toucher à rien pour l’instant, la variable globale étant toujours déclarée.

Notez qu’elle sera supprimée dans le futur, donc tant que vous y êtes, sautez le pas ;-)


  1. Les plugins et thèmes de la version 2.23 ont déjà été modifiés en conséquence, vous pouvez un œil à leur code si nécessaire. ↩︎

lundi 24 octobre 2022

Adapter son code pour la 2.24 n° 5

On continue avec la variable globale $_menu (ou son équivalent $GLOBALS['_menu']) qui est à remplacer par dcCore::app()->menu, partout dans votre code.

Exemple pris dans le code du plugin Tags1.

Avant :

$_menu['Blog']->addItem(
    __('Tags'),
    dcCore::app()->adminurl->get('admin.plugin.tags', ['m' => 'tags']),
    [dcPage::getPF('tags/icon.svg'), dcPage::getPF('tags/icon-dark.svg')],
    …

Après :

dcCore::app()->menu['Blog']->addItem(
    __('Tags'),
    dcCore::app()->adminurl->get('admin.plugin.tags', ['m' => 'tags']),
    [dcPage::getPF('tags/icon.svg'), dcPage::getPF('tags/icon-dark.svg')],
    …

L’expression régulière de recherche à utiliser étant :

((\\*?)\$_menu|\$GLOBALS\['_menu'\])

Si vous n’aimez pas les expressions régulières, alors cherchez ceci :

$GLOBALS['_menu']
$_menu
\$GLOBALS['_menu']
\$_menu

Et à remplacer par :

dcCore::app()->menu

Par ailleurs n’oubliez pas de supprimer les lignes contenant :

global $_menu;

Elles ne serviront plus.


On reviendra sur la gestion des menus un peu plus tard, quand on abordera les constantes à utiliser avec la 2.24, et uniquement cette dernière.


Comme pour la variable $core (voir à ce sujet le billet correspondant), vous pouvez ne toucher à rien pour l’instant, la variable globale étant toujours déclarée.

Notez qu’elle sera supprimée dans le futur, donc tant que vous y êtes, sautez le pas ;-)


  1. Les plugins de la version 2.23 ont déjà été modifiés en conséquence, vous pouvez un œil à leur code si nécessaire. ↩︎

page 1 de 6 -

Haut de page