Comment creer un module?

Pour ce tutoriel, je vais m'appuyer sur l'exemple de ma mod "Auto Delete My Account" qui permet à un membre de supprimer son compte s'il ne souhaite plus venir sur le forum.

Attention, un module n'est pas identique à une mod. En effet il demande normalement très peu de modification dans les fichiers ipb et apporte soit de nouvelles fonctionnalités soit permet la création de nouvelles pages. C'est d'ailleurs un moyen plutôt propre et les mods devrait plus utiliser ce système. Le fichier principal d'un module doit être placé dans le répertoire modules qui se situe à la racine de votre forum.

Voici la liste des fichiers nécessaires pour ma mod :
Les fichiers modifiés :
  • /Skin/s*/skin_ucp.php
  • /sources/functions.php
  • /sources/Messenger.php
  • /sources/Usercp.php
Les nouveaux fichiers :
  • /lang/fr/mod_autodelete_lang.php
  • /modules/mod_autodelete.php
  • /Skin/s*/skin_autodelete.php
Commençons à décortiquer la chose.
Donc ma mod à pour objectif de permettre à un utilisateur de supprimer son compte à partir de son panneau de contrôle utilisateur. C'est pourquoi les fichiers skin_ucp.php et Usercp.php sont modifiés (ce sont les 2 fichiers qui sont principalement utilisés pour le panneau de contrôle utilisateur).

1) Le fichier Usercp.php

Sous la ligne
CODE
$ibforums->lang = $std->load_words($ibforums->lang, 'lang_ucp'   , $ibforums->lang_id );

nous ajoutons
CODE
$ibforums->lang = $std->load_words($ibforums->lang, 'mod_autodelete_lang'   , $ibforums->lang_id );
pour utiliser le fichier de langue de la mod. Ceci sera utile dans le le fichier skin_ucp.php.


2) Le fichier skin_ucp.php

Où allons nous placer la nouvelle fonctionnalité? J'ai choisi de la mettre dans le panneau de contrôle de l'utilisateur, dans la colonne de gauche sous l'option Changer de mot de passe. Comment savoir alors où modifier? J'ai chercher dans le fichier lang_ucp.php (du répertoire fr) la chaine Changer de mot de passe ce qui m'a indiqué la variable correspondante m_passy_opt. C'est cette variable que j'ai ensuite cherché dans le fichier skin pour obtenir l'instruction qui suit;
Sous la ligne
CODE
&middot; <a href='{$base_url}act=UserCP&amp;CODE=28'>{$ibforums->lang['m_passy_opt']}</a>

nous ajoutons la ligne
CODE
<br />&middot; <a href='{$base_url}act=module&amp;module=autodelete&amp;cmd=1' >{$ibforums->lang['ad_suppression']}</a>

Cette ligne ajoute un retour à la ligne, une puce et un lien dont le nom est la variable multi-lingue ad_suppression (d'où la nécessité de modifier le fichier Usercp.php pour connaître cette variable qui est dans le fichier mod_autodelete_lang.php wink.gif)

Vous me suivez toujours? Bien!


3) Le fichier Messenger.php

Sous la ligne
CODE
$ibforums->lang = $std->load_words($ibforums->lang, 'lang_ucp'   , $ibforums->lang_id);

nous ajoutons
CODE
$ibforums->lang = $std->load_words($ibforums->lang, 'mod_autodelete_lang'   , $ibforums->lang_id );
pour utiliser le fichier de langue de la mod. Ceci sera utile car tout comme pour Usercp.php, le fichier skin_ucp.php est utilisé par Messenger.php.



4) Le fichier functions.php

Pour mon module, je vais avoir besoin d'un message d'erreur ipb supplémentaire pour gérer le fait que les membres qui font partie du groupe bannis ne puissent pas supprimer leur compte. Pour celà, nous allons éviter de modifier les fichiers de langue qui sont de base dans ipb. Ce message sera donc contenu dans le fichier de lang de ma mod mod_autodelete_lang.php.Ce nouveau message sera utilisé par la variable multi-lingue no_ban_delete. Il faut donc qu'ipb sache où trouver ce message d'erreur. Nous allons donc l'indiquer dans la fonction qui affiche les messages d'erreur (qui se trouve dans functions.php). En fait pour être plus précis, c'est la fonction Error() qui nous intéresse plus particulièrement. Le fichier lang_error.php étant chargé dans 2 fonctions différentes dans functions.php, c'est pourquoi je vous fais chercher
CODE
list($em_1, $em_2) = explode( '@', $ibforums->vars['email_in'] );
pour insérer au-dessus
CODE
$ibforums->lang = $this->load_words($ibforums->lang, "mod_autodelete_lang", $ibforums->lang_id);
qui charge le fichier de langue de ma mod.

Voilà! Nous en avons terminé avec la modification des fichiers d'invision. smile.gif
Il nous reste maintenant à regarder de plus près le fichier de module invision que j'ai créé.

5) Le fichier mod_autodelete.php

Un fichier utilisant le système de module d'ipb doit obligatoirement se trouver dans le répertoire modules qui se trouve à la racine de votre forum. Son nom doit obligatoirement être du style mod_nom de la mod.php
Les parties en rouge sont obligatoires. Seule la partie verte est variable. Notez que cette partie verte sera réutilisée pour le fichier de skin.

Venons en au contenu...

CODE
class module extends module_loader
{
est identique pour tous les modules que vous créez.

CODE
//=====================================
// Define vars if required
//=====================================

var $class  = "";
var $module = "";
var $html   = "";

var $result = "";
est une partie que vous pouvez utiliser pour déclarer vos propres variables. Dans ma mod je n'ai rien déclaré.

CODE
function module()
{
 global $ibforums, $DB, $std, $INFO;
Ceci est la déclaration de la fonction module (qui doit toujours s'appeler ainsi). Vous y définisez les variables globales que vous pouvez avoir à utiliser. J'avais besoin de $INFO qui contient des données dont j'aurai besoin pour la suppression ($INFO['auth_group']).

CODE
//=====================================
// Do any set up here, like load lang
// skin files, etc
//=====================================
C'est sous ces commentaires qu'il faut initialiser tout ce qu'il nous faut pour notre module. Dans mon cas j'ai besoin de mon fichier de langue et de mon skin que je charge avec les deux lignes suivantes :
CODE
$ibforums->lang = $std->load_words($ibforums->lang, 'mod_autodelete_lang', $ibforums->lang_id);
$this->html     = $std->load_template('skin_autodelete');



Dans le code qui suit, je vais mettre les commentaires en orange directement dans le code pour que cela soit plus lisible
QUOTE
  //si le groupe du membre est 5 (c'est à dire le groupe bannis d'ipb)
  if ($ibforums->member['mgroup'] == 5)
  {
   //alors je prépare le message d'erreur
   $std->Error( array( 'LEVEL' => 1, 'MSG' => 'no_ban_delete') );
   //puis je l'affiche
   print $this->result;
   //et j'arrête là l'exécution du script puisque les droits ne sont pas bons
   exit();
  }

  //Partie qui permet de choisir l'action à faire suivant le code envoyé en argument au chargement de la page
  switch( $ibforums->input['cmd'] )
  {
   //si cmd=1, je lance la fonction delete_confirmation() puis je sors du choix
   case '1':
    $this->delete_confirmation();
    break;
   
   //si cmd=2, je lance la fonction do_delete() puis je sors du choix
   case '2':
    $this->do_delete();
    break;
       
   //dans tous les autres cas, je lance la fonction blank_page() puis je sors du choix
   default:
    $this->blank_page();
    break;
  }

  //j'affiche le résultat renvoyé par mes fonctions puis j'arrête l'exécution du script car j'ai terminé.
  print $this->result;
 
  exit();


C'est sous
CODE
//------------------------------------------
// do_something
//
// Test sub, show if admin or not..
//
//------------------------------------------
que nous définissons les fonctions qui sont appelées dans le choix (voir l'explication ci-dessus).


QUOTE
function delete_confirmation()
{
  //définition des variables globales nécessaires
  global $ibforums, $DB, $std, $print;

  //appel de la fonction ad_confirmation() du skin de mon module
  $this->result = $this->html->ad_confirmation();
 
  //ajout de mon code html (issu de mon skin) dans la page du forum
  $print->add_output("$this->result");
  //Définition du titre de la page du forum (pris dans le fichier de langue de mon module)
         $print->do_output( array( 'TITLE' => $ibforums->lang['ad_title'] ) );
}


Pour la fonction do_delete, je ne vais commenter que la partie vraiment intéressante. Le reste du code que j'ai supprimé ici ne concerne que des manipulations sur la base de données.
QUOTE
function do_delete() {
  //définition des variables globales nécessaires
  global $ibforums, $DB, $std, $INFO, $print;
 
 
  // Convert their posts and topics into guest postings..
  //Une commande qui permet de modifier un enregistrement de la base de données
  $DB->query("UPDATE ibf_posts SET author_id='0' WHERE author_id='".$ibforums->member['id']."'");

....
....

  //Permet d'appeler l'écran de redirection une fois que le compte du membre a été supprimé. Les arguments sont le message, l'adresse de redirection et si le début de l'adresse est le même que l'url de votre forum (0 si oui)
  //Nous appelons donc ici mon message d'erreur ad_redirect et redirigeons sur l'adresse
http://votresite/index.php?
  $print->redirect_screen($ibforums->lang['ad_redirect'], "", 0);
 
}



La fonction blank_page n'était pas nécessaire pour ma mod mais je l'ai mise pour expliquer comment fabriquer sa propre page avec l'en-tête et le pied de page de votre forum
QUOTE
function blank_page()
{
  global $ibforums, $DB, $std, $print;
 
  $print->add_output(""); //Mettez votre contenu ici (regardez comment j'ai fait plus haut avec la variable $html)
         $print->do_output( array( 'TITLE' =>"Votre titre ici" ) );
}



Bon alors maintenant que vous avez compris le fonctionnement du fichier mod_autodelete.php, c'est bien joli mais comment l'utilisez-vous?
Et bien c'est très simple. wink.gif
Il suffit d'entrer l'url suivante dans votre navigateur :
http://votreforum/index.php?act=module&module=autodelete&cmd=2
La partie rouge permet d'appeler votre fichier module (ici mod_autodelete.php).
La partie bleue permet de passer les arguments à votre module. Ici j'envoie l'argument cmd avec la valeur 2
Si j'avais voulu ajouter un autre argument, j'aurai ajouté à la suite &nom_argument=valeur_argument

Rassurez-vous, j'ai bientôt fini les explications biggrin.gif


6) Le fichier skin_autodelete.php

Comme pour le fichier module, le nom du fichier de skin se décompose ainsi skin_nom_de la mod.php
La partie verte étant bien entendu identique avec celle du fichier module.

Voyons voir le code de ce fichier :
QUOTE
<?php
//Le nom de la classe doit être le même que celui du fichier (le .php en moins)
class skin_autodelete {

function ad_confirmation() {
global $ibforums;
return <<<EOF

//Création du tableau qui formera la partie centrale de ma page de confirmation
<table width='100%' height='200px' align='center'>
<tr>
  <td valign='middle'>
   <table align='center' cellpadding="4" class="tablefill">
   <tr>
  <td width="100%" align="center">
//Affichage du message qui demande la confirmation de suppression
   <b>{$ibforums->lang['ad_warning']}</b><br />
   {$ibforums->lang['ad_avertissement']}<br /><br />
   <nobr>{$ibforums->lang['ad_confirmation']}</nobr><br />
   //Bouton de réponse oui qui appelle mon fichier module avec cmd=2 (donc action de suppression). Notez ici l'utilisation de {$ibforums->base_url} pour le début de l'url et de &amp; à la place de &
   <form action='{$ibforums->base_url}act=module&amp;module=autodelete&amp;cmd=2' method='post'>
   <input type='submit' value='{$ibforums->lang['ad_oui']}' class='forminput'></form> &nbsp;
   //Bouton de réponse non qui renvoit le membre sur son panneau de contrôle utilisateur
   <form action='{$ibforums->base_url}act=UserCP&CODE=00' method='post'>
   <input type='submit' value='{$ibforums->lang['ad_non']}' class='forminput'></form>
     </td>
   </tr>
</table>
  </td>
</tr>
</table>

EOF;
}


}
?>



Voilà, c'est la fin de ce tutoriel! smile.gif
J'espère que celui-ci vous aura aider à comprendre comment fonctionne le système de modules qui est intégré dans ipb.

Ce tutoriel est la propriété de son auteur et est réservé à ipbr-fr. Youp3©2003