Ce ticket a pour seule vocation de décrire le fonctionnement des "plugs" sur mon système de blog. Les plugs sont ce que les gens appellent généralement des "modules d'extension" ou encore des "plug-ins", "add-ons" voire "add-ins". Cela permet d'apporter des possibilités au système dans le but de répondre à une fonctionnalité manquante ou non adapté aux personnes.
Je tiens à dire que je ne connais aucunement le fonctionnement des plug-ins sur n'importe lequel CMS ou moteur de blog (dotclear, wordpress), j'ai voulu faire quelque chose à ma façon et qui ne viendrait pas dénaturer (trop) le "core"/noyau de mon système. Donc une marge de personnalisation mais pas trop, on va voir ça de toute façon.
Un exemple de plug: Gravatar
Gravatar est un service proposé par le site du même nom mais avec un .com à la fin qui permet à un utilisateur inscrit là bas d'uploader son avatar et de le voir afficher sur chaque site qui utilise gravatar. Pratique et intéressant (dans le sens où un blog propose - rarement - une inscription pour se faire un profil).
Gravatar fonctionne en prenant l'adresse e-mail rempli lorsque l'on écrit un commentaire et appelle une image "MD5ée" de l'email sur les serveurs de gravatar. Pour se faire, il faut donc que mon plug puisse fonctionner dans "les commentaires" et modifier (ou ajouter, mais nous verrons ça plus loin) l'e-mail du commentateur en lien pointant vers l'image.
Comment cela marche ?
Pour qu'un plug soit détectable pour W.B, il faut absolument que
3 fichiers php soit présent dans son arborescence:
- info.php
- init.php
- setup.php
- (et optionnellement) admin.php
* info.php
| Code: php |
<?php
$name = "Gravatar";
$version = "beta1";
$author = "bosam";
$email = "bosam@postalfr.com";
$website = "";
$logo_img = "images/gravatar.jpg";
$logo_mini = "images/gravatar_mini.jpg";
$description = GRA_DESC;
// Admin
$admin_area = TRUE;
?>
|
Ce fichier sert à renseigner les informations nominatives du plug. A part les variables générales (author, name, etc...) on remarque deux
$logo_img et
$logo_mini qui correspondent à l'adresse des images du plug (qui s'affichera dans le menu d'administration). On remarque aussi que la variable
$description correspond à une constante (nous y reviendrons plus loin), cela dans le but de supporter le multi-langage. Aussi, si le plug à des options pouvant être modifiée via une interface, il faut mettre la variable
$admin_area à TRUE.
* init.php
| Code: php |
<?php
// What to do when loaded
include('config.inc');
// Specific to commentaries
$setSection = "comments";
$createTag = '{gravatar}';
$runFunction = array("Gravatar_me" => array('{mail}', $default, $size));
function Gravatar_me($email, $default, $size)
{
return "<img src=\"http://www.gravatar.com/avatar.php?gravatar_id=".md5(strtolower($email))."&default=".urlencode($default)."&size=".$size."\" />";
}
?>
|
Ce fichier permet, comme son nom l'indique, de lancer des fonctions lorsqu'il s'initialise (c'est à dire lorsque les plugs "activés" sont parsés).
> include('config.inc' );
On inclut la configuration de gravatar (ici,
$default qui correspond à l'adresse de l'image par défaut si l'utilisateur n'a pas de compte sur gravatar et
$size qui est la taille par défaut de l'image).
> $setSection = "comments" ;
Ensuite on spécifie que le plug va toucher au commentaires spécialement. Il est possible de le faire toucher à d'autres sections aussi, tel que "admin", "design", etc... . Pour cela, il faut définir
$setSection = array('comments', 'design' ).
Maintenant, il faut savoir qu'après avoir récupérer les informations dans la base de donnée, le système les stockent dans un tableau suivant:
| Code: php |
<?php
$vars = array('{nameaut}' => $nameaut,
'{date}' => $dateT,
'{date=mini}' => $this -> parser -> Decode_Date($datetime, FALSE, FALSE, TRUE),
'{dateN}' => $dateN,
'{time}' => $time,
'{time=mini}' => substr($time, 0, 6),
'{com}' => $com,
'{mail}' => $mail);
?>
|
Donc si il nous faut accéder au nom d'un auteur de commentaire, il faudra retenir le tag {nameaut} et ainsi de suite.
> $createTag = '{mail}';
> $runFunction = array("Gravatar_me" => array('{mail}', $default, $size));
Ici, on veut que le tag {mail} soit remplacer par ce que la fonction Gravatar_me renverra (c'est à dire l'image).
Mais il est tout à fait possible de créer un nouveau tag
{gravatar} et de le rajouter dans le design à l'endroit souhaité.
Maintenant que l'on sait comment s'appelle les variables que l'on veut récupérer, on spécifie dans la variable
$runFunction un tableau qui contient le nom de la fonction à appeler et les variables à renseigner.
N.B: Il est aussi à noté que l'on peut créer plusieurs tags différents en rentrant un tableau. Le premier tag sera remplacé par la première fonction et ainsi de suite.
| Code: php |
<?php
$createTag = array('{mail}', '{gravatar}');
$runFunction[] = array("Gravatar_me" => array('{mail}', $default, $size));
$runFunction[] = array("Mon_autre_fonction" => array('{com}'));
?>
|
* setup.php
| Code: php |
<?php
// Install
function Setup(){ return true; }
// Uninstall
function Uninstall(){ return true; }
?>
|
Ce fichier définie ce qu'il faut faire lorsque l'on installe ou désinstalle un plug. Dans ce cas, il faut que la fonction renvoie true pour être prise en compte pour le reste de l'installation.
Dans le cas de Gravatar, on ne rajoute rien dans la base de donnée et on en modifie rien donc les fonctions sont juste là à titre de support mais sont inuitiles. (Mais dans le cas de WeTalk - chatbox ajaxée -, le setup contient les tables SQL à insérer et la désinstallation permet de les supprimer).
* (optionel) admin.php
Dans le cas où un plug doit être administrer par une interface, il faut spécifier la variable
$admin_area à vrai et créer ce fichier.
Pour gravatar, c'est un petit plus que j'ai crée car je ne voulais pas changer à la main les différentes variables en allant dans les fichiers.
| Code: php |
<?php
if (isset($_POST['gravatar'])){
$tag_g = $_POST['tag'];
$dest_g = $_POST['dest'];
$size_g = $_POST['size'];
$file = '<?php
$createTag = \''.$tag_g.'\';
$default = "'.$dest_g.'";
$size = '.$size_g.';
?>';
if (file_put_contents(PATH.'config.inc', $file)){
Tools::Make_Msg(Manipulation réussie !, $bFade=TRUE, $bBack=FALSE, $id='we_log');
}else{
Tools::Make_Msg(Echec lors de la manipulation, $bFade=TRUE, $bBack=FALSE, $id='we_log');
}
}
include(PATH."config.inc");
$array = array('{createTag}' => $createTag,
'{dest}' => $default,
'{size}' => $size);
?>
|
Sans trop rentrer dans les détails, le fichier se charge d'écrire dans le fichier
config.inc.
Les autres fonctions...
* Multi-langage
En créant un répertoire
lang dans l'arborescence, vous pouvez y mettre un fichier [votre langue].php et le renseigner avec des constantes de langue.
| Code: php |
<?php
// General
define("fr", "fr"); // Langue de ce fichier utilisé par le blog (en petits caracteres svp : "fr" est compté sinon "en-us" est choisit par défaut)
define("GRA_DESC", "Gravatar vous permet d'utiliser le système d'avatar en ligne (gravatar.com)");
define("GRA_TAG", "Tag ajouté ou remplacé");
define("GRA_DEFAULT", "Image lorsque il n'y a aucun gratavar");
define("GRA_SIZE", "Taille (x / x)");
define("GRA_MODIFY", "Modifier");
?>
|
Il suffit ensuite dans votre fichier
init.php de spéficier le préfixe utiliser par votre plug (ici
GRA_) en utilisant:
> $setTranslation = "GRA_";
Note: Vous remarquerez que cette variable n'existe pas dans notre exemple, et c'est seulement dû au fait que les variables à remplacer sont mise en "clair" dans le fichier
info.php. Ce point est encore à éclaircir car l'exemple ne s'y prête pas trop.
* Gérer le <head>, le <body>
> $setHead = "";
Permet de rajouter des instructions dans entre les balises <head> et </head> (seulement si le $setSection est "design" ou "admin" ). Utilisé dans les plugs qui rajoutent des styles CSS ou du code Javascript.
> $setBody = array('<body>', $chatbox, 'A' );
> (similaire à ) $setBody = $chatbox;
Cette instruction permettra de rajouter après la balise <body>, le contenu de la variable $chatbox. Si on a besoin d'insérer à la fin de la page, il faut mettre '</body>' et 'B' en option.
* Ajout de bbcode(s) personnalisés
Comme pour les langues, il faut créer un dossier
bbcode et à vous les bbcodes personnalisés !
* Gestion des plugs
Bien sûr, je l'ajoute mais les plugs sont installables et/ou activables-désactivables.
En conclusion
Il n'y a pas (à vrai dire) de barrière entre un plug et le système (dans le sens où les classes dédiées sont utilisables - principalement la classe de Template et de Log) donc cela confère une grande maniabilité mais aussi un grand n'importe quoi si l'on en vient à installer des plugs inconnus.
J'ai voulu faire quelque chose de moins difficile à maitriser pour ceux qui ne connaissent pas les entrailles du système comme moi (normal on va dire

) et j'peux dire que comparé à l'ancienne version des plugs, y'a eu un grand chemin !
Mais celà n'est pas fini et il reste encore des améliorations à apporter tel que l'ajout par les plugs de "pages" traitées exclusivement par eux.
En conclusion, prévoir ce que les gens voudront rajouter comme fonction est aussi difficile que de les traiter !
