Création d'un plugin pour dotclear 2 - étape 2

Ce billet fait suite à l'étape 1 de mise en place d'un plugin. Cette fois, nous allons aborder la partie administration qui se gère principalement à travers le fichier _admin.php. Le but de cet article est de voir comment ajouter un lien, dans le menu de gauche (partie Extensions), permettant de configurer le plugin. On va aussi voir la page index.php, pointée par ce lien qui nous permettra d'activer le plugin.

Commençons par le lien. Le menu en question est $_menu['Plugins'], objet de type dcMenu crée dans le fichier ./inc/admin/prepend.php. Il nous suffit d'ajouter une entrée (un item) dans ce menu. La méthode addItem est là pour ça. Elle attend 6 paramètres qui sont respectivement:

  • le libéllé dans le menu
  • l'url permettant d'accéder à la configuration du plugin
  • l'icône associé
  • un booléen permettant d'ajouter une classe active ou non
  • un booléen permettant d'afficher l'item
  • une chaîne de caractère permettant d'ajouter un identifiant (id en css) à l'item.

Le libéllé utilise comme tous les libéllés la fonction de localisation __(). L'url est du type plugin.php?p=Nom_du_plugin. L'icône utilise aussi un chemin particulier du type index.php?pf=Nom_du_plugin/nom_du_fichier. Le paramètre permettant d'ajouter la classe css active est une expression régulière vérifiant le format de l'url correspond à l'url définie au deuxième paramètre. On décide d'afficher ou non l'item en fonction des permissions de l'utilisateur. Cela donne ceci:

<?php
$_menu
['Plugins']->addItem(__('aboutPage'),
               
'plugin.php?p=aboutPage',
               'index.php?pf=aboutPage/icon.png'
,
               
preg_match('/plugin.php\?p=aboutPage/',$_SERVER['REQUEST_URI']),
               
$core->auth->isSuperAdmin()
               );
?>

Si vous copiez ce code dans un fichier _admin.php, vous devriez voir apparaître le lien dans le menu Extensions. Si vous cliquez sur le lien que vous venez de créer vous allez avoir droit au message suivant:

Extension introuvable

L'extension que vous essayez d'atteindre n'existe pas ou n'a pas de page d'administration.

C'est tout à fait normal étant donné qu'on n'a pas créé la page ! Cette page est index.php. Nous allons la créer. Cette page est une page complète, avec tag html, une partie head et le body ! Le script plugin.php se charge de ne récupérer que la partie utile contenu dans body. On peut faire de nombreuses choses dans cette page mais nous allons nous contenter de mettre un formulaire avec une case à cocher permettant d'activer/désactiver le plugin. Seul le super administrateur (choix défini dans _admin.php) pourra faire cette opération.

<form method="post" action="plugin.php">
<fieldset>
   <legend><?php echo __('Plugin activation'); ?></legend>
   <p class="field">
      <label class=" classic">
      <?php 
echo form::checkbox('active'1$active); ?>&nbsp;
      <?php echo __('Enable aboutPage plugin');?>
      </label>
   </p>
</fieldset>
<input type="hidden" name="p" value="aboutPage"/>
<?php echo $core->formNonce(); ?>
<input type="submit" name="saveconfig" value="<?php echo __('Save configuration'); ?>" />
</form>

Le champ caché permet de revenir sur la même page (valeur aboutPage) et la ligne $core->formNonce() (ajoutée depuis la version beta 7 de dotclear) permet de s'assurer de la provenance du formulaire, c'est-à-dire que la soumission est bien valide. Cette ligne crée un jeton que l'on vérifie.

Il ne reste plus qu'à traiter ce formulaire une fois soumis:

<?php
if (!empty($_POST['saveconfig'])) {
  try {
    
$active = (empty($_POST['active']))?false:true;
    
$core->blog->settings->setNameSpace('aboutpage');
    
$core->blog->settings->put('aboutpage_active',$active,'boolean');
    
$core->blog->triggerBlog();
    
    
$msg __('Configuration successfully updated.');
  } catch (
Exception $e) {
    
$core->error->add($e->getMessage());
  }
}
?>

Ce code demande quelques explications. Pour garder l'information sur le fait que le plugin est activé ou non, nous stockons l'information dans la table dc_setting via la classe dcSettings. Chaque paramètre de configuration est défini dans un espace de nommage (namespace) qui lui est propre, pour ne pas interférer avec les autres paramètres. Nous choisissons un namespace particulier pour ce plugin: aboutpage.

Si vous soumettez le formulaire, en ayant coché la case, et en allant sur la page "about:config" vous devriez voir apparaître une nouvelle zone,  de namespace aboutpage et avec une entrée aboutpage_active ayant pour valeur oui. La méthode triggerBlog force la mise à jour de la configuration du blog.

Si on retourne sur la page (en cliquant dans le menu de gauche), la case est de nouveau décochée. On n'a pas récupérée l'information d'activation du plugin. Il suffirait d'ajouter une ligne de ce type:

<?php
$active 
$core->blog->settings->aboutpage_active;
?>

Pour s'assurer que cette page est bien appelée depuis l'administration du blog, on va ajouter ces trois lignes au début du fichier:

<?php
if (!defined('DC_CONTEXT_ADMIN')) { 
  exit; 
}
?> 

Vous trouverez en pièce jointe les deux fichiers crées (index.php et _admin.php), ainsi que ceux crées à l'étape 1 (_define.php et _public.php) dans une archive.

Haut de page