<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet title="XSL formatting" type="text/xsl" href="https://dotclear.watch/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>DotclearWatch / Blog - Mot-clé - process</title>
    <link>https://dotclear.watch/</link>
    <atom:link href="https://dotclear.watch/feed/tag/process/rss2" rel="self" type="application/rss+xml" />
    <description>Suivez l'évolution du moteur de blogs Dotclear.</description>
    <language>fr</language>
    <pubDate>Mon, 06 Apr 2026 09:30:20 +0200</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.36] Modification des Utility et Process</title>
        <link>https://dotclear.watch/Billet/%5B2.36%5D-Modification-des-Utility-et-Process</link>
        <guid isPermaLink="false">urn:md5:dd15ff21d3bb2a4b4b58828f6f461ff4</guid>
        <pubDate>Sat, 18 Oct 2025 11:47:00 +0200</pubDate>
        <dc:creator>Jean-Christian Denis</dc:creator>
                  <category>2.36</category>
                          <category>2.36</category>
                  <category>abstract</category>
                  <category>process</category>
                  <category>trait</category>
                  <category>utility</category>
                <description>&lt;p&gt;Depuis Dotclear 2.36 les classes de context sont accessibles directement en tant que méthodes de ces context, cela implique des changements dans leur fontionnement qui se répercutent jusque sur les thèmes et plugins.&lt;/p&gt; &lt;p&gt;&lt;a class=&quot;ref-post&quot; href=&quot;https://dotclear.watch/Billet/2.36&quot; title=&quot;Article rédigé pour Dotclear 2.36&quot;&gt;&lt;img alt=&quot;badge Dotclear 2.36&quot; src=&quot;https://img.shields.io/badge/Dotclear-2.36-blue?style=for-the-badge&quot; /&gt; &lt;/a&gt;&lt;/p&gt;

&lt;p&gt;L'arborescence de Dotclear contient un nouvel espace de nom &lt;strong&gt;Dotclear\Helper\Process&lt;/strong&gt; qui embarque differentes classes utiles au fonctionnement des Utility et Process :&lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;Dotclear\Helper\Process\AbstractProcess&lt;/li&gt;
	&lt;li&gt;Dotclear\Helper\Process\AbstractSingleton&lt;/li&gt;
	&lt;li&gt;Dotclear\Helper\Process\AbstractUtility&lt;/li&gt;
	&lt;li&gt;Dotclear\Helper\Process\TraitProcess&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;Utility&lt;/h3&gt;

&lt;p&gt;Normalement nul besoin de se préoccuper de cette partie, elle appartient au core de Dotclear, mais c'est toujours bon de savoir comment cela fonctionne.&lt;/p&gt;

&lt;p&gt;Les Utility (Backend, Frontend, Upragde, Install) sont désormais des Container, leurs Process sont des services, leurs classes de second niveau sont des services et tous sont accessibles depuis des méthodes ( voir &lt;a class=&quot;ref-post&quot; href=&quot;https://dotclear.watch/Billet/%5B2.36%5D-Modification-des-conteneurs#process&quot;&gt;Modification des containeurs&lt;/a&gt; ) Les Utility étendent la classe abstraite AbstractUtility qui embarque tout ce qu'il faut pour charger leurs services. Enfin les Utility utilisent le trait TraitProcess qui embarque ce qu'il faut pour le bon déroulement du processus requis par le core.&lt;/p&gt;

&lt;p&gt;Exemple de l'Utility Backend et de la classe de second niveau Favorites :&lt;/p&gt;

&lt;pre&gt;
&lt;code class=&quot;language-php&quot;&gt;&amp;lt;?php

declare(strict_types=1);

namespace Dotclear\Core\Backend;


class Utility extends AbstractUtility
{
    // ...

    public function getDefaultServices(): array
    {
        return [
            Favorites::class   =&amp;gt; Favorites::class,
            // ...
        ];
    }

    public function favorites(): Favorites
    {
        return $this-&amp;gt;get(Favorites::class);
    }

    // ...
}&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Accessible désormais avec :&lt;/p&gt;

&lt;pre&gt;
&lt;code class=&quot;language-php&quot;&gt;App::backend()-&amp;gt;favorites();&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt; &lt;/p&gt;

&lt;h3&gt;Process&lt;/h3&gt;

&lt;p&gt;Jusqu'à Dotclear 2.36 toutes les classes de second niveaux du core (les servcies des Utility) et toutes les classes des plugins et thèmes lièes à la gestion de modules devaient étendre la classe Process du core. Depuis Dotclear 2.36 les services des Utility peuvent avoir besoin d'étendre d'autres classes ce qui serait impossible tel quel. La classes abstraite Process s'est donc transformée en trait, afin de pouvoir être utilisé en plus d'autres classes.&lt;/p&gt;

&lt;p&gt;Exemple du plugin blogroll de la distribution :&lt;/p&gt;

&lt;pre&gt;
&lt;code class=&quot;language-php&quot;&gt;&amp;lt;?php

declare(strict_types=1);

namespace Dotclear\Plugin\blogroll;

use Dotclear\Helper\Process\TraitProcess;

class Backend
{
    use TraitProcess;

    public static function init(): bool
    {
        //...
    }
}&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Les plugins dcProxy s'occupent de faire le lien entre les plugins / thèmes qui ne sont pas à jour et l'utilisation du trait.&lt;/p&gt;

&lt;p&gt;Ce qu'il faut retenir et que là ou on utilisait :&lt;/p&gt;

&lt;pre&gt;
&lt;code class=&quot;language-php&quot;&gt;&amp;lt;?php

declare(strict_types=1);

namespace Dotclear\Plugin\MonPlugin;

Use Dotclear\Core\Process;

class Backend extends Process
{
    //...
}&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Il faut utiliser :&lt;/p&gt;

&lt;pre&gt;
&lt;code class=&quot;language-php&quot;&gt;&amp;lt;?php

declare(strict_types=1);

namespace Dotclear\Plugin\MonPlugin;

use Dotclear\Helper\Process\TraitProcess;

class Backend
{
    use TraitProcess;

    //...
}&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;.&lt;/p&gt;</description>
        
                  <comments>https://dotclear.watch/Billet/%5B2.36%5D-Modification-des-Utility-et-Process#comment-form</comments>
          <wfw:comment>https://dotclear.watch/Billet/%5B2.36%5D-Modification-des-Utility-et-Process#comment-form</wfw:comment>
          <wfw:commentRss>https://dotclear.watch/feed/atom/comments/509</wfw:commentRss>
              </item>
          <item>
        <title>Lancement de l'application</title>
        <link>https://dotclear.watch/Billet/Lancement-de-l-application</link>
        <guid isPermaLink="false">urn:md5:92d211eb1567f069a4bc9c1fd5b2935f</guid>
        <pubDate>Wed, 12 Jul 2023 22:02:00 +0100</pubDate>
        <dc:creator>Jean-Christian Denis</dc:creator>
                  <category>2.27</category>
                          <category>app</category>
                  <category>index</category>
                  <category>process</category>
                  <category>utility</category>
                <description>&lt;p&gt;La &lt;a href=&quot;https://dotclear.watch/Billet/Release-2.27&quot;&gt;version 2.27&lt;/a&gt; de Dotclear introduit un changement technique de taille dans le moteur de blog.&lt;/p&gt; &lt;p&gt;Avec l'accentuation de l'utilisation des espaces de noms PHP dans le moteur, Dotclear peut désormais travailler autrement. Antérieurement à la version 2.27, les points d'entrées était multiples et déclarés par des fichiers bien précis placés dans des dossiers tout aussi précis. Par exemple chaque page de l'administration avait sa propre page PHP correspondante et était référencée par rapport à ce fichier. A partir de la version 2.27 un simple fichier index.php avec un contenu adéquat permet de faire tout ça. Ce fichier index.php va lancer l'application Dotclear avec les paramètres qui lui correspondent. L'application va ensuite traduire ces paramètres et lancer le processus associé. Schématiquement le déroulement du script donne :&lt;br /&gt;
&lt;code&gt;index.php =&amp;gt; App =&amp;gt; Utility =&amp;gt; Process&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;L'application Dotclear utilise désormais un unique point d'entrée :&lt;/strong&gt;&lt;br /&gt;
&lt;code&gt;Dotclear\App::bootstrap('utility','process')&lt;/code&gt;;&lt;br /&gt;
&lt;br /&gt;
Un &lt;strong&gt;Utility&lt;/strong&gt; est une partie générale de Dotclear, les correspondances avec les versions antérieures sont:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;admin =&amp;gt; Backend,&lt;/li&gt;
&lt;li&gt;public =&amp;gt; Frontend,&lt;/li&gt;
&lt;li&gt;upgrade CLI =&amp;gt; Upgrade,&lt;/li&gt;
&lt;li&gt;install =&amp;gt; Install&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ensuite chaque Utility lance un &lt;strong&gt;Process&lt;/strong&gt; qui auparavant était une page, par exemple pour la page d'accueil de l'administration des blogs on aura Backend / Home. Cela peu paraître déroutant pour celui qui pratique Dotclear depuis des années, mais la logique aidant, il est assez simple de se repérer, d'autant plus que coté code, on retrouvera ce schéma. En reprenant l'exemple de la page d'accueil de l'administration qui aura comme paramètre Utility=Backend et Process=Home, on retrouve les espaces de noms et les fichiers physiques suivants :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Utility&lt;/strong&gt; = &lt;code&gt;Backend&lt;/code&gt;, &lt;strong&gt;Class&lt;/strong&gt; = &lt;code&gt;Dotclear\Core\Backend\Utility&lt;/code&gt;, &lt;strong&gt;Fichier&lt;/strong&gt; = &lt;code&gt;src/Core/Backend/Utility.php&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Process&lt;/strong&gt; = &lt;code&gt;Home&lt;/code&gt;, &lt;strong&gt;Class&lt;/strong&gt; = &lt;code&gt;Dotclear\Process\Backend\Home&lt;/code&gt;, &lt;strong&gt;Fichier&lt;/strong&gt; = &lt;code&gt;src/Process/Backend/Home.php&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Partant de ce principe pour afficher la page d'accueil de l'administration de Dotclear, il faut dans le fichier index.php indiquer où se trouve l'application et la lancer avec ces deux paramètres :&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;&amp;lt;?php
// on va cherche l&amp;#039;application Dotclear
require_once implode(DIRECTORY_SEPARATOR, [__DIR__, &amp;#039;..&amp;#039;, &amp;#039;src&amp;#039;, &amp;#039;App.php&amp;#039;]);
// on lance l&amp;#039;application pour afficher la page d&amp;#039;accueil de l&amp;#039;administration
Dotclear\App::bootstrap(&amp;#039;Backend&amp;#039;, &amp;#039;Home&amp;#039;);&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Logique.&lt;br /&gt;
&lt;br /&gt;
Ensuite pour naviguer, l'application va tenir compte du paramètre de requête HTTP nommé &lt;code&gt;process&lt;/code&gt; et le substituer à celui du fichier index.php, la navigation dans l'admin devient alors possible depuis une seule page index.php.&lt;br /&gt;
Coté public c'est encore plus simple car il n'y a pas de process en 2.27, seul l'Utility &lt;code&gt;Frontend&lt;/code&gt; est appelé, le gestionnaire d'URL public se chargeant de jouer avec les templates.&lt;br /&gt;
&lt;br /&gt;
A noter que pour les installations existantes qui feront la mise à jour en 2.27, les deux écritures restent valables. Il n'est pas obligatoire de modifier &lt;a href=&quot;https://dotclear.watch/Billet/Fichier-de-d%C3%A9finition-d-un-blog&quot;&gt;les fichiers index.php des blogs&lt;/a&gt; et la partie admin accepte également l'utilisation des anciens points d'entrée.&lt;br /&gt;
&lt;br /&gt;
&lt;em&gt;&lt;q&gt;Le contenu de ce document a été écrit suivant le code de la version 2.27 de Dotclear.&lt;/q&gt;&lt;/em&gt;&lt;/p&gt;</description>
        
              </item>
          <item>
        <title>La class Process</title>
        <link>https://dotclear.watch/Billet/La-class-Process</link>
        <guid isPermaLink="false">urn:md5:c7e57bde7d87b749d5506bb78759ec9a</guid>
        <pubDate>Tue, 11 Jul 2023 20:41:00 +0100</pubDate>
        <dc:creator>Jean-Christian Denis</dc:creator>
                  <category>2.27</category>
                          <category>2.27</category>
                  <category>class</category>
                  <category>module</category>
                  <category>plugin</category>
                  <category>process</category>
                  <category>theme</category>
                <description>&lt;p&gt;La classe &lt;strong&gt;Process&lt;/strong&gt; introduite dans les dernières versions de Dotclear devient la norme et est requise quasi partout depuis &lt;a href=&quot;https://dotclear.watch/Billet/Release-2.27&quot; hreflang=&quot;fr&quot; title=&quot;Note de release 2.27&quot;&gt;Dotclear 2.27&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;La plupart des classes de plugins et thèmes doivent étendre la classe Process, pour cela il suffit de déclarer son utilisation en début de fichier puis d'étendre votre classe.&lt;br /&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;&amp;lt;?php
use Dotclear\Core\Process;

class Manage extends Process
{
}&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Cette classe est pour l'instant très succincte mais permet de découper le déroulement du script en trois parties.&lt;br /&gt;&lt;/p&gt;

&lt;h5&gt;Première partie&lt;/h5&gt;

&lt;p&gt;Elle utilise la méthode &lt;code&gt;Process::init()&lt;/code&gt; elle permet de vérifier les droits à utiliser votre classe. Elle utilise un mécanisme mémorisant le statut de cette initialisation, verrouillant ou non l'utilisation des méthodes suivantes.&lt;br /&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;public static function init(): bool
{
    // On enregistre la permissions d&amp;#039;utiliser la classe et on renvoie le résultat
    return self::status(My::checkContext(My::MANAGE));
}&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;On voit ici l'utilisation de la &lt;a href=&quot;https://dotclear.watch/Billet/Les-classes-de-module-My&quot;&gt;classe My&lt;/a&gt; qui est un outil d'aide à l'écriture des modules simplifiant l'utilisation de certains mécanismes.&lt;br /&gt;&lt;/p&gt;

&lt;h5&gt;Seconde partie&lt;/h5&gt;

&lt;p&gt;Elle utilise la méthode &lt;code&gt;Process::process()&lt;/code&gt; qui est consacrée à la préparation et au traitement des données, telles que celles des formulaires par exemple.&lt;br /&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;public static function process(): bool
{
    // On vérifie le droit d&amp;#039;effectuer cette partie
    if (!self::status()) {
        return false;
    }

    if (!empty($_POST[&amp;#039;id&amp;#039;])) {
        // traitement de mon formulaire

        // On a réussi, on ajoute un message
        Notices::addSuccessNotice(__(&amp;#039;Victory&amp;#039;));
        // On redirige vers la page du plugin
        dcCore::-&amp;gt;admin-&amp;gt;url-&amp;gt;redirect(&amp;#039;admin.plugin.&amp;#039; . My::id());
    }

    // Cette méthode doit retourner true si on veut exécuter la troisième partie
    return true;
}&lt;/code&gt;&lt;/pre&gt;

&lt;h5&gt;La troisième partie&lt;/h5&gt;

&lt;p&gt;Elle utilise la méthode &lt;code&gt;Process::render()&lt;/code&gt; qui est consacré au rendu. C'est à dire à l'affichage dans le navigateur.&lt;br /&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;public static function render(): void
{
    // On vérifie le droit d&amp;#039;effectuer cette partie
    if (!self::status()) {
        return;
    }

    // On prépare l&amp;#039;affichage du haut de page
    Page::openModule(My::name());

    // On ajoute le menu façon Dotclear
    echo
    Page::breadcrumb(
        [
            __(&amp;#039;Plugin&amp;#039;)  =&amp;gt; &amp;#039;&amp;#039;,
            My::name() =&amp;gt; &amp;#039;&amp;#039;,
        ]
    ) .
    // On affiche d&amp;#039;éventuelle messages
    Notices::getNotices();

    // On ajoute le contenu de la page
    echo __(&amp;#039;yeah!&amp;#039;);

    // On ajoute l&amp;#039;aide de la page
    Page::helpBlock(My::id());

    // On ferme la page
    Page::closeModule();
}&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Ici on voit l'utilisation des classes d'outils My et Page qui vont grandement faciliter l'écriture des plugins et thèmes.&lt;br /&gt;
&lt;br /&gt;
A noter que seule la première méthode &lt;strong&gt;init()&lt;/strong&gt; est obligatoire. Si elle renvoie &lt;strong&gt;true&lt;/strong&gt;, c'est que la classe ne contient pas de méthode &lt;strong&gt;process()&lt;/strong&gt;, la méthode &lt;strong&gt;render()&lt;/strong&gt; sera exécuté.&lt;br /&gt;
&lt;br /&gt;
&lt;em&gt;&lt;q&gt;Le contenu de ce document a été écrit suivant le code de la version 2.27 de Dotclear.&lt;/q&gt;&lt;/em&gt;&lt;/p&gt;</description>
        
              </item>
      </channel>
</rss>
