<?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é - my</title>
    <link>https://dotclear.watch/</link>
    <atom:link href="https://dotclear.watch/feed/tag/my/rss2" rel="self" type="application/rss+xml" />
    <description>Suivez l'évolution du moteur de blogs Dotclear.</description>
    <language>fr</language>
    <pubDate>Sat, 30 May 2026 05:58:13 +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>Permissions de modules</title>
        <link>https://dotclear.watch/Billet/Permissions-de-modules-en-2.28</link>
        <guid isPermaLink="false">urn:md5:15d7c95c8020af2f4684b0d553449ac4</guid>
        <pubDate>Fri, 13 Oct 2023 08:00:00 +0200</pubDate>
        <dc:creator>Jean-Christian Denis</dc:creator>
                  <category>2.28</category>
                          <category>2.28</category>
                  <category>My</category>
                  <category>permission</category>
                <description>&lt;p&gt;Dans la &lt;a href=&quot;https://dotclear.watch/Billet/Release-2.28&quot;&gt;version 2.28&lt;/a&gt; de Dotclear, la classe &lt;strong&gt;My&lt;/strong&gt; d'aide aux modules peut gérer complètement leurs permissions.&lt;/p&gt; &lt;p&gt;Depuis quelques versions de Dotclear une aide au développement des modules (plugins et thèmes) est disponible, elle est depuis bien utilisée par les modules de la distribution et par nombre de modules tiers. La version 2.28, complète la classe My en lui ajoutant une nouvelle constante de contexte appelée MODULE. Celle-ci va permettre de supprimer la difficulté d'utiliser des classes dans le fichier _define.php en déplaçant la partie permissions de ce fichier.&lt;br /&gt;
Pour déplacer ces permissions et s'affranchir d'appels de classe hasardeux, il suffit d'indiquer dans le fichier _define.php du module qu'on déporte la gestion de permissions, puis dans le fichier My de vérifier ces permissions.&lt;br /&gt;&lt;/p&gt;

&lt;h5&gt;Premier exemple&lt;/h5&gt;

&lt;p&gt;Exemple du fichier &lt;strong&gt;\_define.php&lt;/strong&gt; du plugin attachments de la distribution :&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;&amp;lt;?php
use Dotclear\App;

$this-&amp;gt;registerModule(
    // ...
    [
        // On indiquait la nécessité des droits usage, content admin ou pages pour utiliser ce plugin
        &amp;#039;permissions&amp;#039; =&amp;gt; App::auth()-&amp;gt;makePermissions([
            App::auth()::PERMISSION_USAGE,
            App::auth()::PERMISSION_CONTENT_ADMIN,
            initPages::PERMISSION_PAGES,
        ]),
        // ...
    ]
);&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Qui deviendra simplement :&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;&amp;lt;?php
$this-&amp;gt;registerModule(
    // ...
    [
        &amp;#039;requires&amp;#039;    =&amp;gt; [[&amp;#039;pages&amp;#039;]],
        // On indique qu&amp;#039;on délègue à la class My la gestion des droits
        &amp;#039;permissions&amp;#039; =&amp;gt; &amp;#039;My&amp;#039;,
        // ...
    ]
);&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Plus de problème d'appel de classe potentiellement inexistante ici, puisqu'on va tester la disponibilité de module requis avec la directive &lt;code&gt;requires&lt;/code&gt; avant de vouloir utiliser sa classe. Mais il faut bien tester les droits qu'on a enlevés, pour cela on va ajouter une règle dans le fichier &lt;strong&gt;\src\My.php&lt;/strong&gt; du module :&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;&amp;lt;?php
declare(strict_types=1);

namespace Dotclear\Plugin\attachments;

use Dotclear\App;
use Dotclear\Module\MyPlugin;
use Dotclear\Plugin\pages\Pages;

class My extends MyPlugin
{
   // On va gérer des droits particuliers
    public static function checkCustomContext(int $context): ?bool
    {
       // On recherche le contexte de droit
        return match($context) {
            // On utilise le nouveau contexte de droit global pour autoriser un utilisateur avec les droits sur les billets et les pages
            // Attention ici le test demande si on est côté admin avec des droits ou côté public sans besoin de droits !
            self::MODULE =&amp;gt; !App::task()-&amp;gt;checkContext(&amp;#039;BACKEND&amp;#039;)
                || (
                    App::blog()-&amp;gt;isDefined()
                    &amp;amp;&amp;amp; App::auth()-&amp;gt;check(App::auth()-&amp;gt;makePermissions([
                        App::auth()::PERMISSION_USAGE,
                        App::auth()::PERMISSION_CONTENT_ADMIN,
                        Pages::PERMISSION_PAGES,
                    ]), App::blog()-&amp;gt;id())
                ),

            // Pour tous les autres contextes, on laisse les droits par défaut
            default =&amp;gt; null,
        };
    }
}&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;On voit ici que du fait de cette nouvelle gestion, les constantes de module comme les permissions ou les noms de tables de bases de données n'ont plus besoin d'être dans un fichier spécial à la racine du module puisque dorénavant on teste ces permissions après le chargement des modules et donc on a accès  à toutes les classes des modules pour les tests. Les constantes de permissions et de tables des modules de la distribution ont donc été déplacés dans leurs classes principales, c'est le cas de &lt;strong&gt;Antispam&lt;/strong&gt;, &lt;strong&gt;Blogroll&lt;/strong&gt; et &lt;strong&gt;Pages&lt;/strong&gt;.&lt;/p&gt;

&lt;h5&gt;Second exemple&lt;/h5&gt;

&lt;p&gt;Exemple du fichier &lt;strong&gt;\_define.php&lt;/strong&gt; du plugin tags de la distribution :&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;&amp;lt;?php
use Dotclear\App;

$this-&amp;gt;registerModule(
    // ...
    [
        &amp;#039;permissions&amp;#039; =&amp;gt; &amp;#039;App::auth()-&amp;gt;makePermissions([
                    App::auth()::PERMISSION_USAGE,
                    App::auth()::PERMISSION_CONTENT_ADMIN,
                ])&amp;#039;,
        // ...
    ]
);&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Qui deviendra simplement :&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;&amp;lt;?php
$this-&amp;gt;registerModule(
    // ...
    [
        &amp;#039;permissions&amp;#039; =&amp;gt; &amp;#039;My&amp;#039;,
        // ...
    ]
);&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Quand au fichier &lt;strong&gt;\src\My.php&lt;/strong&gt; du module, il ne changera pas puisqu'on vérifiait déjà ces droits :&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;&amp;lt;?php
declare(strict_types=1);

namespace Dotclear\Plugin\tags;

use Dotclear\App;
use Dotclear\Module\MyPlugin;

class My extends MyPlugin
{
    public static function checkCustomContext(int $context): ?bool
    {
        return match ($context) {
            // On indique que la page de gestion et le menu sont autorisés à un utilisateur ayant les droits usage ou content admin
            // On n&amp;#039;a pas eu besoin de changer quoi que ce soit ici
            self::MANAGE, self::MENU =&amp;gt; App::task()-&amp;gt;checkContext(&amp;#039;BACKEND&amp;#039;)
                &amp;amp;&amp;amp; App::blog()-&amp;gt;isDefined()
                &amp;amp;&amp;amp; App::auth()-&amp;gt;check(App::auth()-&amp;gt;makePermissions([
                    App::auth()::PERMISSION_USAGE,
                    App::auth()::PERMISSION_CONTENT_ADMIN,
                ]), App::blog()-&amp;gt;id()),

            default =&amp;gt; null,
        };
    }
}&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Un petit tour dans les fichiers &lt;strong&gt;My&lt;/strong&gt; des plugins de la distribution donnera un bon aperçu des différents cas possibles.&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.28 de Dotclear.&lt;/q&gt;&lt;/em&gt;&lt;/p&gt;</description>
        
              </item>
          <item>
        <title>Les classes de module My</title>
        <link>https://dotclear.watch/Billet/Les-classes-de-module-My</link>
        <guid isPermaLink="false">urn:md5:56d4aa0e1641bb124a2682004f6231c5</guid>
        <pubDate>Fri, 14 Jul 2023 10:27:00 +0100</pubDate>
        <dc:creator>Jean-Christian Denis</dc:creator>
                  <category>2.27</category>
                          <category>2.27</category>
                  <category>module</category>
                  <category>my</category>
                  <category>plugin</category>
                  <category>theme</category>
                <description>&lt;p&gt;Dotclear &lt;a href=&quot;https://dotclear.watch/Billet/Release-2.27&quot;&gt;version 2.27&lt;/a&gt; propose pour les plugins et thèmes des classes d'aide pour simplifier l'écriture du code.&lt;/p&gt; &lt;p&gt;Deux classes My (qui étendent une troisième commune nommé &lt;code&gt;MyModule&lt;/code&gt;) sont disponibles, &lt;code&gt;MyPlugin&lt;/code&gt; pour les plugins et &lt;code&gt;MyTheme&lt;/code&gt; pour les thèmes, elle fournissent des méthodes statiques qui vont simplifier l'écriture des modules.&lt;/p&gt;

&lt;h5&gt;Inclusion&lt;/h5&gt;

&lt;p&gt;Pour les utiliser il suffit d'inclure dans le dossier &lt;code&gt;src&lt;/code&gt; du module un fichier My.php avec le contenu suivant :&lt;br /&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;&amp;lt;?php
/**
 * Mettre ici les informations de licence.
 */
declare(strict_types=1);

namespace Dotclear\Plugin\monPlugin;

use Dotclear\Module\MyPlugin;

class My extends MyPlugin
{
}&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;A adapter pour un thème. Il possible d'ajouter ses propres méthodes à cette classe tant que ça n'interfère pas avec celles de MyPlugin, MyTheme et MyModule.&lt;br /&gt;&lt;/p&gt;

&lt;h5&gt;Utilisation&lt;/h5&gt;

&lt;p&gt;Ensuite il sera possible d'utiliser toutes les méthodes de MyPlugin (MyTheme) dans les classes du plugin (thème).&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;&amp;lt;?php
namespace Dotclear\Plugin\monPlugin;

use Dotclear\Core\Process;
use Dotclear\Core\Backend\Page;

// Page principale de gestion du plugin
class Manage extends Process
{
    public static function init(): bool
    {
        // On vérifie que l&amp;#039;utilisateur à le droit d&amp;#039;exercer dans ce contexte
        return self::status(My::checkContext(My::MANAGE));
    }

    public static function process(): bool
    {
        if (!empty($_POST[&amp;#039;step&amp;#039;])) {
            // ...

            // On redirige la page à l&amp;#039;aide de My
            My::redirect([&amp;#039;step&amp;#039; =&amp;gt; 2]);
        }
    }

    public static function render(): void
    {
        // On utilise la classe My pour trouver le nom du plugin et des fichiers
        Page::openModule(
            My::name(),
            My::cssLoad(&amp;#039;backend&amp;#039;)
        );
    }
}&lt;/code&gt;&lt;/pre&gt;

&lt;h5&gt;Méthodes&lt;/h5&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;My::define()&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;protected static function define(): dcModuleDefine&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Cette méthode renvoie l'instance de définition du module.&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;&lt;code&gt;My::checkContext()&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;protected static function checkContext(int $context): bool&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Cette méthode permet de vérifier que l'utilisateur à le droit d'exercer dans un certain contexte, elle renvoie &lt;strong&gt;true&lt;/strong&gt; si l'utilisateur à assez de droits, &lt;strong&gt;false&lt;/strong&gt; sinon. Elle prend en paramètre le contexte qui doit être vérifier. La liste des contextes prédéfinis est disponible dans les constantes de la classe My :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;0&lt;/strong&gt; : &lt;code&gt;INSTALL&lt;/code&gt; : Install context&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;1&lt;/strong&gt; : &lt;code&gt;PREPEND&lt;/code&gt; : Prepend context&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2&lt;/strong&gt; : &lt;code&gt;FRONTEND&lt;/code&gt; : Frontend context&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;3&lt;/strong&gt; : &lt;code&gt;BACKEND&lt;/code&gt; : Backend context (usually when the connected user may access at least one functionnality of this module)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;4&lt;/strong&gt; : &lt;code&gt;MANAGE &lt;/code&gt; : Manage context (main page of module)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;5&lt;/strong&gt; : &lt;code&gt;CONFIG&lt;/code&gt; : Config context (config page of module)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;6&lt;/strong&gt; : &lt;code&gt;MENU&lt;/code&gt; : Menu context (adding a admin menu item)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;7&lt;/strong&gt; : &lt;code&gt;WIDGETS&lt;/code&gt; : Widgets context (managing blog's widgets)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;8&lt;/strong&gt; : &lt;code&gt;UNINSTALL&lt;/code&gt; : Uninstall context (réservé pour le plugin Uninstaller)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;br /&gt;
&lt;strong&gt;&lt;code&gt;My::checkCustomContext()&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;protected static function checkCustomContext(int $context): ?bool&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Cette méthode est appelée en début de la méthode précédente &lt;strong&gt;checkContext&lt;/strong&gt; et peut être réécrite dans la classe &lt;strong&gt;My&lt;/strong&gt; du module si on en a besoin. Elle permet d'utiliser ses propres droits, ou de modifier des droits de contexte de la méthode précédente. Si &lt;strong&gt;checkCustomContext()&lt;/strong&gt; renvoie &lt;strong&gt;null&lt;/strong&gt; alors les contextes de la classe précédente seront testés.&lt;br /&gt;
Exemple avec le fichiers &lt;strong&gt;My&lt;/strong&gt; du plugin &lt;strong&gt;userPrefs&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\userPref;

use dcCore;
use Dotclear\Module\MyPlugin;

class My extends MyPlugin
{
    protected static function checkCustomContext(int $context): ?bool
    {
        // allways limit to super admin
        return defined(&amp;#039;DC_CONTEXT_ADMIN&amp;#039;)
            &amp;amp;&amp;amp; dcCore::app()-&amp;gt;auth-&amp;gt;isSuperAdmin();
    }
}&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;br /&gt;
&lt;strong&gt;&lt;code&gt;My::path()&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;public static function My::path(): string&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Cette méthode renvoie le chemin du dossier du module.&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;&lt;code&gt;My::id()&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;protected static function My::id(): string&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Cette méthode renvoie l'identifiant du module.&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;&lt;code&gt;My::name()&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;protected static function My::name(): string&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Cette méthode renvoie le nom traduit du module.&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;&lt;code&gt;My::settings()&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;public static function settings(): ?dcNamespace&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Cette méthode renvoie l'instance de l'espace de paramètres du module. Le module &lt;strong&gt;doit&lt;/strong&gt; utiliser son ID comme nom d'espace de paramètre pour pouvoir utiliser cette méthode.&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;&lt;code&gt;My::prefs()&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;public static function prefs(): ?dcWorkspace&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Cette méthode renvoie l'instance de l'espace de préférences du module. Le module &lt;strong&gt;doit&lt;/strong&gt; utiliser son ID comme nom d'espace de préférences pour pouvoir utiliser cette méthode.&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;&lt;code&gt;My::l10n()&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;public static function l10n(string $process): void&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Cette méthode charge les locales du module pour un process donné (main, public, plugin, etc...).&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;&lt;code&gt;My::fileURL()&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;public static function fileURL(string $resource, bool $frontend = false): string&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Cette méthode retourne l'URL d'un fichier de module. Cette méthode tient compte du contexte courant (admin, public). Pour forcer le retour de l'URL public dans le contexte admin, il suffit de mettre le paramètre &lt;code&gt;$frontend&lt;/code&gt; à &lt;code&gt;true&lt;/code&gt;.&lt;br /&gt;
A noter que pour les thèmes, cette méthode renvoie toujours l'URL publique.&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;&lt;code&gt;My::cssLoad()&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;public static function cssLoad(string $resource, string $media = &amp;#039;screen&amp;#039;, ?string $version = &amp;#039;&amp;#039;): string&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Cette méthode retourne le code HTML pour inclure un fichier CSS &lt;code&gt;$resource&lt;/code&gt; du module.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Si le paramètre &lt;code&gt;$resource&lt;/code&gt; ne commence pas par un &lt;code&gt;/&lt;/code&gt; le fichier sera cherché dans le sous dossier &lt;code&gt;css&lt;/code&gt; du module,&lt;/li&gt;
&lt;li&gt;Si l'extension du fichier n'est pas incluse à &lt;code&gt;$resource&lt;/code&gt;, elle sera ajoutée,&lt;/li&gt;
&lt;li&gt;Le type de &lt;code&gt;$media&lt;/code&gt; peut-être précisé, par défaut ce sera &lt;code&gt;screen&lt;/code&gt;,&lt;/li&gt;
&lt;li&gt;Un numéro de &lt;code&gt;version&lt;/code&gt; peut-être ajouté à la fin de l'url de ressource (gestion de cache)&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;// Renvoie le code pour le fichier .../monPlugin/css/frontend.css
My::cssload(&amp;#039;frontend&amp;#039;);
// Renvoie le code pour le fichier .../monPlugin/style.css
My::cssLoad(&amp;#039;/style.css&amp;#039;);&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;br /&gt;
&lt;strong&gt;&lt;code&gt;My::jsLoad()&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;public static function jsLoad(string $resource, ?string $version = &amp;#039;&amp;#039;, bool $module = false): string&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Tout comme &lt;code&gt;My::cssLoad()&lt;/code&gt; cette méthode renvoie le code HTML pour ajouter un fichier JS du module. Le paramètre &lt;code&gt;$module&lt;/code&gt; si il est à &lt;strong&gt;true&lt;/strong&gt; permet de charger &lt;code&gt;$resource&lt;/code&gt; comme un module JS.&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;&lt;code&gt;My::addBackendMenuItem()&lt;/code&gt;&lt;/strong&gt; (plugins uniquement)&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;public static function addBackendMenuItem(string $menu = Menus::MENU_PLUGINS, array $params = [], string $scheme = &amp;#039;(&amp;amp;.*)?$&amp;#039;, ?string $id = null): void&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Cette méthode permet d'ajouter rapidement le module aux menus de l'administration.&lt;br /&gt;
Le menu est à choisir parmi ceux définis dans les constantes de &lt;code&gt;Dotclear\Core\Backend\Menus&lt;/code&gt; et par défaut celui des plugins :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Menus::MENU_BLOG&lt;/code&gt; =&amp;gt; 'Blog',&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Menus::MENU_SYSTEM&lt;/code&gt; =&amp;gt; 'System',&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Menus::MENU_PLUGINS&lt;/code&gt; =&amp;gt; 'Plugins',&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Les paramètres :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;$params&lt;/code&gt; sert à ajouter des paramètres à l'URL du menu,&lt;/li&gt;
&lt;li&gt;&lt;code&gt;$scheme&lt;/code&gt; permet de personnaliser la surbrillance du menu,&lt;/li&gt;
&lt;li&gt;&lt;code&gt;$id&lt;/code&gt; permet de spécifier un id pour l’icône de tableau de bord (Utile aux behaviors).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;br /&gt;
&lt;strong&gt;&lt;code&gt;My::icons()&lt;/code&gt;&lt;/strong&gt; (plugins uniquement)&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;public static function icons(string $suffix = &amp;#039;&amp;#039;): array&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Cette méthode renvoie un tableau des chemins complets vers les icônes du modules.&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;&lt;code&gt;My::manageURL()&lt;/code&gt;&lt;/strong&gt; (plugins uniquement)&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;public static function manageUrl(array $params = [], string $separator = &amp;#039;&amp;amp;&amp;#039;): string&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Cette méthode renvoie l'URL de la page principale de gestion du module. Des paramètres spéciaux peuvent être ajoutés avec &lt;code&gt;$params&lt;/code&gt;, et le séparateur des paramètres peut être modifié avec le paramètre &lt;code&gt;$separator&lt;/code&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;&lt;code&gt;My::redirect()&lt;/code&gt;&lt;/strong&gt; (plugins uniquement)&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;public static function redirect(array $params = [], string $suffix = &amp;#039;&amp;#039;): void&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Cette méthode effectue une redirection en prenant l'URL de base du module, à laquelle il est possible d'ajouter des paramètres &lt;code&gt;$params&lt;/code&gt;. Le paramètre &lt;code&gt;$suffix&lt;/code&gt; permet d'ajouter par exemple le renvoi vers un onglet spécifique.&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>
