====== Manuel de création de plugins pour Dotclear 2 ====== ===== Introduction ===== Les plugins sont des fragments applicatifs permettant d'ajouter des fonctionnalités à Dotclear, comme par exemple une liste de liens, un outil pour importer un blog depuis un autre logiciel ou encore une nouvelle syntaxe de rédaction des billets. La réalisation d'un plugin demande simplement des connaissances assez solides en PHP, notamment en programmation orientée objet. Dans la mesure du possible des liens vers des points précis de la documentation PHP seront fournis tout au long de ce manuel. ===== Premier plugin ===== Nous allons réaliser un premier plugin qui ne sert à rien d'autre qu'afficher un texte sur la partie publique du blog. Nous y ajouterons ensuite quelques agréments permettant de survoler une bonne partie de ce que peuvent faire des plugins Dotclear. ==== Définition d'un plugin ==== Un plugin est un répertoire se trouvant dans le répertoire des plugins (défini par DC_PLUGIN_ROOT). Nous allons donc créer un répertoire HelloWorld. Dans ce répertoire, pour que le plugin existe, nous devons ajouter un fichier **_define.php** contenant le code suivant : registerModule( /* Name */ "Hello World", /* Description*/ "Simple Hello World plugin", /* Author */ "Olivier Meunier", /* Version */ '1', array( 'type' => 'plugin', 'permissions' => 'usage,contentadmin' /* et autres propriétés complémentaires */ ) ); ?> Avant dotclear 2.4, la syntaxe suivante était utilisée. Elle est toujours possible, mais ne permet pas de profiter des propriétés complémentaires : registerModule( /* Name */ "Hello World", /* Description*/ "Simple Hello World plugin", /* Author */ "Olivier Meunier", /* Version */ '1', /* Permissions */ 'usage,contentadmin' ); ?> Les champs de la fonction **registerModule** sont accompagnés de commentaires afin de faciliter la lecture et l'édition du fichier **_define.php**. Tous ces champs sont simples à comprendre, nous nous arrêterons donc uniquement sur le champ **Permissions**. Ce champ prend une liste de permissions séparées par des virgules et ne sert que pour contrôler l'activation du plugin sur l'interface d'administration du blog. Si les permissions de l'utilisateur ne sont pas remplies, le plugin ne sera jamais chargé par l'interface d'administration. Ici, nous décidons que le plugin sera chargé pour n'importe quel utilisateur pouvant se connecter sur l'interface d'administration, ce qui correspond aux droits //usage,contentadmin//. Si nous avions voulu restreindre ce plugin aux seuls administrateurs d'un blog donné, nous aurions assigné le droit //admin//. Notez bien que les droits définis correspondent à ceux pour le blog en cours d'utilisation. Si le plugin avait la permission //admin// et qu'un utilisateur soit administrateur sur un blog A mais uniquement rédacteur sur un blog B, le plugin ne serait actif que sur le blog A. Enfin, si vous souhaitez rendre un plugin uniquement utilisable par les super-administrateurs la permission doit être mise à //null// (sans guillemets). Les propriétés complémentaires disponibles (via le tableau en fin d'appel) sont les suivantes : ^ Paramètre ^ Thème/Plugin ^ Description ^ | type | T+P | à positionner à 'theme' ou 'plugin'| | standalone_config | T | Définit si le thème définit ses propres modules de configuration, ou repose sur des mécanismes simplifiés de dotclear| | parent | T | Nom du thème parent (héritage) | | tplset | T | Nom du set de templates à utiliser | | permissions | P | Permissions du plugin| | priority | P+T | priorité du module (1000 par défaut, les plus petites priorités sont chargés en premier) | | widgettitleformat | T | Format des titres des widgets (ex :

%s

) | | widgetsubtitleformat | T | Format des sous-titres des widgets (ex :

%s

) | A noter qu'il est bon de traduire les champs //Name// et //Description// de ce fichier. Pour aider les logiciels de traduction, une bonne pratique consiste à ajouter en début de fichier //_admin.php// les chaines à traduire comme ceci: ==== Structure d'un plugin ==== Notre plugin ne sert pour l'instant à rien du tout. Pour lui faire réaliser des actions, nous devons définir d'autres fichiers. Un plugin possède trois autres fichiers (qui ne sont pas obligatoires selon les cas) : * **_admin.php** : définit le comportement du plugin sur l'interface d'administration. * **_public.php** : définit le comportement du plugin sur le blog. * **_prepend.php** : définit les fichiers nécessaires à charger. Nous verrons le fichier **_admin.php** plus tard et allons nous concentrer sur **_public.php** et **_prepend.php**. C'est grâce à **_prepend.php** que vous allez pouvoir charger les fichiers nécessaires au bon fonctionnement du plugin. C'est aussi dans ce fichier que les appels aux behaviors doivent être fait. Un fichier peut contenir plusieurs classes. Dans ce cas là, il vous suffit d'inclure **qu'une seule fois** le fichier avec pour clé du tableau $__autoload la première classe présente dans le fichier en question. Les autres classes seront alors automatiquement chargées Pour plus de précisions sur la nomenclature et la structure d'un plugin, référez vous à [[http://fr.dotclear.org/documentation/2.0/resources/plugins/files|cette page]] C'est grâce à **_public.php** que nous allons afficher un texte sur la partie publique du blog. Nous créons donc un **_public.php** avec le code suivant : url->register('helloworld','helloworld','^helloworld$',array('HelloURL','HelloWorld')); class HelloURL extends dcUrlHandlers { public static function HelloWorld($args) { header('Content-Type: text/plain'); echo 'Hello World!'; exit; } } ?> Ce code est court mais nous allons y préter toute notre attention. Nous venons d'ajouter une URL **/helloworld** (tout comme il existe /post/...) à notre blog. La fonction **register** de l'objet $core->url prend 4 paramètres : * Un **type,** sorte d'identifiant unique de l'URL. * La **forme de base de l'URL** que l'on peut obtenir par $core->url->getBase(). * Une **expression rationnelle** permettant à l'interface publique de savoir quand réagir. * La **fonction** à appeler quand l'URL est reconnue. Cet argument peut-être n'importe quoi du moment qu'il s'agit d'une [[http://www.php.net/manual/fr/language.pseudo-types.php#language.types.callback|déclaration de callback valide]]. Dans le cas qui nous intéresse, nous disons à Dotclear d'appeler la méthode statique HelloWorld de la class HelloURL quand il reconnaît l'URL **/helloworld** sur le blog. L'URL en question a le type helloworld? et pourra être obtenue par **$core->url->getType('helloworld')**. La méthode HelloWorld de la class HelloURL prend un seul argument : $args. Celui-ci contient l'éventuelle capture de l'expression rationnelle passée dans la définition de l'URL. Ici nous n'en avons pas, nous n'utilisons donc pas cet argument. La méthode en elle-même est très simple, elle se contente de créer une page de type //text/plain// contenant les mots //Hello World//. La class HelloURL hérite de dcUrlHandlers. Dans notre cas, ce n'était pas nécessaire mais vous pouvez en avoir besoin si par exemple vous souhaitez envoyer une page d'erreur 404. Il suffirait alors d'appeler self::p404() pour obtenir immédiatement une page d'erreur 404 avec les bons en-têtes HTTP et le template correspondant. Dans votre navigateur, il vous suffit de saisir : **http:///index.php?helloworld** Votre plugin fonctionne ? Bravo ! Nous allons maintenant voir comment lui apporter quelques améliorations. [[admin|Création d'une page d'administration d'un plugin]]