====== Création de filtres antispam ======
===== Généralités =====
La création de filtres supplémentaires pour le plugin antispam n'est pas compliquée, elle consiste à faire un plugin tout simple contenant une classe de filtrage. Cette classe va prendre en charge la reconnaissance du message comme un spam, l'entraînement éventuel du filtre, l'affichage d'une possible interface de configuration et l'affichage de messages d'information concernant le spam.
Nous allons ici voir comment réaliser un filtre tout simple.
===== Définition du plugin =====
Comme d'habitude, tout commence par un répertoire dans vos plugins, contenant un fichier **_define.php** :
registerModule(
/* Name */ "FooFilter",
/* Description*/ "Foo Spam Filter",
/* Author */ "Peter McAlloway",
/* Version */ '1.0',
/* Permissions */ 'usage,contentadmin',
/* Priority */ 200
);
?>
spamfilters[] = 'dcFilterFoo';
?>
Ce fichier indique au système de chargement automatique de classes où trouver la classe de filtrage puis ajoute le filtre (le nom de la classe) aux autres filtres dans $core->spamfilters.
===== Création du filtre =====
Nous avons déclaré une classe de filtrage mais celle-ci n'existe pas, c'est un peu dommage. Nous allons donc de ce pas créer un fichier **class.dc.filter.foo.php** dans notre plugin :
==== La classe de filtrage ====
description = __('My new foo spam filter');
}
}
?>
Ici, notre méthode va déclarer que tous les commentaires sont du spam et assigner le status "Filtered" à celui-ci.
Cette méthode prend les paramètres suivants :
* $type : le type de commentaire (//comment// ou //trackback//)
* $author : le nom de l'auteur
* $email : l'adresse email de l'auteur
* $site : l'URL du site de l'auteur
* $ip : l'adresse IP de l'auteur
* $content : le contenu du commentaire
* $post_id : l'ID du billet sur lequel le commentaire a été posté
La dernière variable $status doit bien être déclarée en référence (**&**$status) puisqu'elle permet de transmettre le statut du commentaire si celui-ci est marqué comme spam.
Cette méthode doit renvoyer **true** si le message est un spam et **null** si on ne sait pas.
guiLink());
}
...
?>
Chaque commentaire filtré par votre plugin indiquera "Filtré par Foo Filter". Vous n'êtes pas obligé de créer cette méthode. Dans ce cas, vous aurez une indication par défaut : "Filtré par Foo Filter (raison)".
==== La méthode trainFilter ====
Si votre filtre nécessite qu'on lui apprenne à reconnaître un spam ou un non-spam, cette méthode peut être nécessaire. Elle sera appelée dans les cas suivants :
* On passe un commentaire qui n'est pas un spam en spam
* On publie un commentaire qui est un spam
Dans ces deux cas, les méthodes **trainFilter** de chaque filtre seront appelées.
La méthode prend les paramètres suivants :
* $status : Statut du commentaire (//spam// si on déclare un spam, //ham// si on déclare un non spam)
* $filter : Filtre qui a été appliqué sur le commentaire si celui-ci était un spam
* $type : Type de commentaire (//comment// ou //trackback//)
* $author : Nom de l'auteur
* $email : Adresse email de l'auteur
* $site : URL du site de l'auteur
* $ip : Adresse IP de l'auteur
* $content : Contenu du commentaire
* $rs : Objet de type record contenant d'autres informations sur le commentaire
Votre méthode se déclare donc comme ceci :
==== La méthode gui ====
La methode gui($url) permet de créer l'interface de configuration de votre filtre. Pour que celle-ci soit active, vous devez spécifier **public $has_gui = true;** au début de votre classe.
Cette méthode prend un seul paramètre : l'URL de configuration du filtre.
Par exemple, une interface toute simple de votre filtre :
My filter GUI
description = __('My first spam filter');
}
/*
You may need this method or let parent method do its job.
public function getStatusMessage($status,$comment_id)
{
return sprintf(__('Filtered by %s.'),$this->guiLink());
}
*/
public function isSpam($type,$author,$email,
$site,$ip,$content,$post_id,&$status)
{
/*
return true and set $status if message is a spam
return null if you don't know (not false)
*/
}
/*
Only if you need to train your filter
public function trainFilter($status,$filter,$type,
$author,$email,$site,$ip,$content,$rs)
{
}
*/
// A totaly useless GUI
public function gui($url)
{
return ''.__('My filter GUI').'
';
}
}
?>