<?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é - backend</title>
    <link>https://dotclear.watch/</link>
    <atom:link href="https://dotclear.watch/feed/tag/backend/rss2" rel="self" type="application/rss+xml" />
    <description>Suivez l'évolution du moteur de blogs Dotclear.</description>
    <language>fr</language>
    <pubDate>Mon, 25 May 2026 06:49:11 +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>Fichier Config d'un module</title>
        <link>https://dotclear.watch/Billet/Fichier-Config-d-un-module</link>
        <guid isPermaLink="false">urn:md5:996cf791be01db13a047003087fe99f3</guid>
        <pubDate>Sun, 16 Jul 2023 14:03:00 +0100</pubDate>
        <dc:creator>Jean-Christian Denis</dc:creator>
                  <category>2.27</category>
                          <category>2.27</category>
                  <category>admin</category>
                  <category>backend</category>
                  <category>config</category>
                  <category>module</category>
                  <category>plugin</category>
                  <category>structure</category>
                  <category>theme</category>
                <description>&lt;p&gt;Le fichier &lt;strong&gt;Config.php&lt;/strong&gt;, placé dans &lt;a href=&quot;https://dotclear.watch/Billet/Structure-d-un-module&quot;&gt;le dossier src&lt;/a&gt; du module, simplifie la gestion de sa configuration.&lt;/p&gt; &lt;p&gt;Le fichier &lt;strong&gt;Config.php&lt;/strong&gt; fait partie du processus reconnu par le gestionnaire de modules, il est donc automatiquement pris en compte dans l'administration si il existe.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Il est placé dans le sous dossier &lt;code&gt;src&lt;/code&gt; du module,&lt;/li&gt;
&lt;li&gt;Il contient une classe du nom de &lt;code&gt;Config&lt;/code&gt;,&lt;/li&gt;
&lt;li&gt;Il est dans l'espace de nom PHP &lt;code&gt;Dotclear\Plugin\monPlugin&lt;/code&gt; ou &lt;code&gt;Dotclear\Theme\monTheme&lt;/code&gt;,&lt;/li&gt;
&lt;li&gt;La classe doit étendre &lt;a href=&quot;https://dotclear.watch/Billet/La-class-Process&quot;&gt;la classe Process&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;Les 3 méthodes &lt;code&gt;init()&lt;/code&gt; et &lt;code&gt;process()&lt;/code&gt; et &lt;code&gt;render()&lt;/code&gt; sont utilisées,&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cette classe simplifie la gestion de la configuration d'un module dans le sens où la partie construction de la page est déjà effectuée par le gestionnaire de modules. Seul le traitement des valeurs et le contenu du formulaire sont à la charge de la classe Config. Un lien vers cette page sera ajouté à la liste de plugins ou sur les thèmes de la page de gestion d'apparence du blog. Un lien sera également ajouté en bas de page principale de gestion du plugin si elle existe.&lt;br /&gt;
&lt;br /&gt;
Exemple complet du fichier config du thème customCSS de la distribution :&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;&amp;lt;?php
namespace Dotclear\Theme\customCSS;

use dcCore;
use Dotclear\Core\Backend\Notices;
use Dotclear\Core\Process;
use Dotclear\Helper\File\Path;
use Dotclear\Helper\Html\Html;
use Dotclear\Helper\L10n;
use Exception;
use form;

class Config extends Process
{
    public static function init(): bool
    {
        if (My::checkContext(My::CONFIG)) {
            My::l10n(&amp;#039;main&amp;#039;);
            dcCore::app()-&amp;gt;admin-&amp;gt;css_file = Path::real(dcCore::app()-&amp;gt;blog-&amp;gt;public_path) . &amp;#039;/custom_style.css&amp;#039;;

            if (!is_file(dcCore::app()-&amp;gt;admin-&amp;gt;css_file) &amp;amp;&amp;amp; !is_writable(dirname(dcCore::app()-&amp;gt;admin-&amp;gt;css_file))) {
                throw new Exception(
                    sprintf(
                        __(&amp;#039;File %s does not exist and directory %s is not writable.&amp;#039;),
                        dcCore::app()-&amp;gt;admin-&amp;gt;css_file,
                        dirname(dcCore::app()-&amp;gt;admin-&amp;gt;css_file)
                    )
                );
            }
            self::status(true);
        }

        return self::status();
    }

    public static function process(): bool
    {
        if (!self::status()) {
            return false;
        }

        if (isset($_POST[&amp;#039;css&amp;#039;])) {
            @$fp = fopen(dcCore::app()-&amp;gt;admin-&amp;gt;css_file, &amp;#039;wb&amp;#039;);
            fwrite($fp, $_POST[&amp;#039;css&amp;#039;]);
            fclose($fp);

            Notices::message(__(&amp;#039;Style sheet upgraded.&amp;#039;), true, true);
        }

        return true;
    }

    public static function render(): void
    {
        if (!self::status()) {
            return;
        }

        $css_content = is_file(dcCore::app()-&amp;gt;admin-&amp;gt;css_file) ? file_get_contents(dcCore::app()-&amp;gt;admin-&amp;gt;css_file) : &amp;#039;&amp;#039;;

        echo
        &amp;#039;&amp;lt;p class=&amp;quot;area&amp;quot;&amp;gt;&amp;lt;label&amp;gt;&amp;#039; . __(&amp;#039;Style sheet:&amp;#039;) . &amp;#039;&amp;lt;/label&amp;gt; &amp;#039; .
        form::textarea(&amp;#039;css&amp;#039;, 60, 20, Html::escapeHTML($css_content)) . &amp;#039;&amp;lt;/p&amp;gt;&amp;#039;;
    }
}&lt;/code&gt;&lt;/pre&gt;

&lt;p&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>Fichier Backend d'un module</title>
        <link>https://dotclear.watch/Billet/Fichier-Backend-d-un-module</link>
        <guid isPermaLink="false">urn:md5:fa3c0167756c3590593aa2a46afc6459</guid>
        <pubDate>Sun, 16 Jul 2023 13:36:00 +0100</pubDate>
        <dc:creator>Jean-Christian Denis</dc:creator>
                  <category>2.27</category>
                          <category>2.27</category>
                  <category>admin</category>
                  <category>backend</category>
                  <category>module</category>
                  <category>plugin</category>
                  <category>structure</category>
                  <category>theme</category>
                <description>&lt;p&gt;Le fichier &lt;strong&gt;Backend.php&lt;/strong&gt;, placé dans &lt;a href=&quot;https://dotclear.watch/Billet/Structure-d-un-module&quot;&gt;le dossier src&lt;/a&gt; du module, permet de préparer le nécessaire à son fonctionnement pour sa partie administration.&lt;/p&gt; &lt;p&gt;Le fichier &lt;strong&gt;Backend.php&lt;/strong&gt; fait partie du processus reconnu par le gestionnaire de modules, il est donc automatiquement pris en compte dans l'administration si il existe.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Il est placé dans le sous dossier &lt;code&gt;src&lt;/code&gt; du module,&lt;/li&gt;
&lt;li&gt;Il contient une classe du nom de &lt;code&gt;Backend&lt;/code&gt;,&lt;/li&gt;
&lt;li&gt;Il est dans l'espace de nom PHP &lt;code&gt;Dotclear\Plugin\monPlugin&lt;/code&gt; ou &lt;code&gt;Dotclear\Theme\monTheme&lt;/code&gt;,&lt;/li&gt;
&lt;li&gt;La classe doit étendre &lt;a href=&quot;https://dotclear.watch/Billet/La-class-Process&quot;&gt;la classe Process&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;Seules les méthodes &lt;code&gt;init()&lt;/code&gt; et &lt;code&gt;process()&lt;/code&gt; sont utilisées,&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Généralement cette classe est utilisée pour préparer des variables nécessaires au fonctionnement du module, ajouter ses menus, favoris, behaviors, pour la partie administration des blogs.&lt;br /&gt;
&lt;br /&gt;
Exemple du fichier Backend.php du plugin &lt;strong&gt;aboutConfig&lt;/strong&gt; 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\aboutConfig;

use Dotclear\Core\Backend\Menus;
use Dotclear\Core\Process;

class Backend extends Process
{
    public static function init(): bool
    {
        return self::status(My::checkContext(My::BACKEND));
    }

    public static function process(): bool
    {
        if (self::status()) {
            My::addBackendMenuItem(Menus::MENU_SYSTEM);
        }

        return self::status();
    }
}&lt;/code&gt;&lt;/pre&gt;

&lt;p&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>Gestion d'URL d'administration</title>
        <link>https://dotclear.watch/Billet/Gestion-d-URL-d-administration</link>
        <guid isPermaLink="false">urn:md5:5f4e600e6c3a229f9d4d08317752f88a</guid>
        <pubDate>Thu, 13 Jul 2023 23:08:00 +0100</pubDate>
        <dc:creator>Jean-Christian Denis</dc:creator>
                  <category>2.27</category>
                          <category>2.27</category>
                  <category>backend</category>
                  <category>url</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 embarque des changements côté URL, dont certains non rétro compatibles.&lt;/p&gt; &lt;h5&gt;Déprécié&lt;/h5&gt;

&lt;p&gt;Avec le passage aux espaces de noms PHP, la classe &lt;strong&gt;dcAdminURL&lt;/strong&gt; devient &lt;code&gt;Dotclear\Core\Backend\Url&lt;/code&gt;.&lt;br /&gt;
Et son instance se déplace également de &lt;strong&gt;dcCore::app()-&amp;gt;adminurl&lt;/strong&gt; vers &lt;code&gt;dcCore::app()-&amp;gt;admin-&amp;gt;url&lt;/code&gt;.&lt;br /&gt;
A noter que grâce au plugins dcProxyV1, les anciens noms restent accessibles.&lt;br /&gt;&lt;/p&gt;

&lt;h5&gt;Obsolète&lt;/h5&gt;

&lt;p&gt;Dûe à la mise en place de la &lt;a href=&quot;https://dotclear.watch/Billet/Lancement-de-l-application&quot;&gt;nouvelle structure de l'application&lt;/a&gt;, l'utilisation des URLs écrites directement est proscrite. C'est à dire que partout où un plugin écrivait &lt;code&gt;'plugin.php?p=monPlugin&lt;/code&gt;' le code ne fonctionnera plus. Il faut impérativement utiliser le gestionnaire d'URL &lt;code&gt;dcCore::app()-&amp;gt;admin-&amp;gt;url&lt;/code&gt; et ses méthodes.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;&amp;lt;?php
// dcCore::app()-&amp;gt;adminurl-&amp;gt;get(&amp;#039;admin.plugin.monPlugin&amp;#039;, [&amp;#039;var&amp;#039; =&amp;gt; 1]);
dcCore::app()-&amp;gt;admin-&amp;gt;url-&amp;gt;get(&amp;#039;admin.plugin.monPlugin&amp;#039;, [&amp;#039;var&amp;#039; =&amp;gt; 1]);
// ou encore mieux
My::manageURL([&amp;#039;var&amp;#039; =&amp;gt; 1]);

// Http::redirect(&amp;#039;plugin.php?p=monPlugin&amp;amp;var=1);
dcCore::app()-&amp;gt;admin-&amp;gt;url-&amp;gt;redirect(&amp;#039;admin.plugin.monPlugin&amp;#039;, [&amp;#039;var&amp;#039; =&amp;gt; 1]);
// ou encore mieux
My::redirect([&amp;#039;var&amp;#039; =&amp;gt; 1]);&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Pourquoi ? Parce que l'ajout du Process en cours est fait automatiquement par ce biais. Le code ci-dessus renverra l'URL &lt;code&gt;/index.php?process=Plugin&amp;amp;p=monPlugin&amp;amp;var=1&lt;/code&gt;.&lt;br /&gt;&lt;/p&gt;

&lt;h5&gt;Nouveauté&lt;/h5&gt;

&lt;p&gt;Une nouvelle URL débarque dans le gestionnaire, celle de déconnexion, elle permet de se déconnecter de l'interface d'administration même en cas de plantage d'un plugin ou d'un thème. Son identifiant est &lt;code&gt;'admin.logout'&lt;/code&gt;. Si vous souhaitez par exemple déconnecter l'utilisateur depuis votre script il suffit de faire &lt;code&gt;dcCore::app()-&amp;gt;redirect('admin.logout');&lt;/code&gt;.&lt;br /&gt;
&lt;br /&gt;
Pour des raisons d'uniformisation, l'identifiant d'URL &lt;strong&gt;'admin.popup_posts'&lt;/strong&gt; sera a terme remplacé par &lt;code&gt;'admin.popup.posts'&lt;/code&gt; et un autre nouvel identifiant &lt;code&gt;'admin.help.charte'&lt;/code&gt; peu utilisé est ajouté.&lt;br /&gt;&lt;/p&gt;

&lt;h5&gt;Attention&lt;/h5&gt;

&lt;p&gt;Ce n'est pas tout, en rapport au gestionnaire d'URL et à la nouvelle structure de l'application, certains formulaires ne fonctionneront pas comme il faut. En effet les formulaires utilisant la method GET ne peuvent embarquer dans l'URL le process, du moins il le perd en chemin ! (Merci monsieur HTML) Il faut donc impérativement ajouter un champ caché contenant &lt;code&gt;process=xxx&lt;/code&gt; ou xxx est l'identifiant de la page qu'il souhaite atteindre enregistré dans le gestionnaire d'URL. Exemple pour la page principale d'un plugin il faudra ajouter dans le formulaire &lt;code&gt;new Form\Hidden('process', 'Plugin');&lt;/code&gt; ou &lt;code&gt;form::hidden('process', 'Plugin');&lt;/code&gt; ou &lt;code&gt;'&amp;lt;input type=&quot;hidden&quot; name=&quot;process&quot; value=&quot;Plugin&quot; /&amp;gt;'&lt;/code&gt;. Dans la majorité des cas, les formulaires utilisant la méthode POST, ainsi que les filtres de listes tiennent compte du process.&lt;br /&gt;
&lt;br /&gt;
A noter que la &lt;a href=&quot;https://dotclear.watch/Billet/Les-classes-de-module-My&quot;&gt;classe My&lt;/a&gt; d'aide des modules propose des méthodes simplifiant l'accès aux URLs du module.&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>
