Créer un Captcha

Le framework de PHPBoost permet de mettre en place un captcha facilement et rapidement.

Nous allons voir comment en créer un.

Création de la base du module du Captcha


Premièrement, il faut mettre en place la Structure de base du module.

Création de la classe principale de votre Captcha


Créer une classe avec le nom de votre Captcha dans le dossier phpboost de votre module. Cette classe doit être une classe fille de la classe Captcha.

Celle-ci doit comprendre à minima les fonctions suivantes :


Exemple :

Code PHP :
<?php 
/**
 * @copyright   © 2005-2022 PHPBoost
 * @license     https://www.gnu.org/licenses/gpl-3.0.html GNU/GPL-3.0
 * @author      Prénom NOM <pseudonyme@site.ext>
 * @version     PHPBoost 6.0 - last update: 2022 11 18
 * @since       PHPBoost 6.0 - 2022 11 18
 * @contributor Prénom NOM <pseudonyme@site.ext>
 */
 
class QuestionCaptcha extends Captcha
{
    private static $questions;
 
    public static function __static()
    {
        self::$questions = QuestionCaptchaConfig::load()->get_questions();
    }
 
    public function get_name()
    {
        return 'QuestionCaptcha';
    }
 
    public function is_available()
    {
        return true;
    }
 
    public function is_valid()
    {
        if (!$this->is_available() || AppContext::get_current_user()->check_level(User::MEMBER_LEVEL))
        {
            return true;
        }
 
        $answer = AppContext::get_request()->get_value($this->get_html_id(), '');
        $question_id = AppContext::get_request()->get_int($this->get_html_id() . '_question_id', 0);
 
        if (!empty($question_id))
        {
            $question = new QuestionCaptchaQuestion();
            $question->set_properties(self::$questions[$question_id]);
 
            return in_array(trim(strtolower($answer)), $question->get_formated_answers());
        }
        return false;
    }
 
    public function display()
    {
        $question_id = array_rand(self::$questions); //Question aléatoire
 
        $question = new QuestionCaptchaQuestion();
        $question->set_properties(self::$questions[$question_id]);
 
        $tpl = new FileTemplate('QuestionCaptcha/QuestionCaptcha.tpl');
        $tpl->put_all(array(
            'QUESTION_ID' => $question_id,
            'QUESTION' => $question->get_label(),
            'HTML_ID' => $this->get_html_id()
        ));
 
        return $tpl->render();
    }
}
?>

Il est possible de créer une configuration pour le module afin de permettre la personnalisation de certaines options lors de l'affichage des questions.

ExtensionPointProvider


L'ExtensionPointProvider est à remplir comme tout autre module, il faut en plus y indiquer la fonction
captcha()
qui va retourner la classe principale de votre module.

Exemple :

Code PHP :
<?php
/**
 * @copyright   © 2005-2022 PHPBoost
 * @license     https://www.gnu.org/licenses/gpl-3.0.html GNU/GPL-3.0
 * @author      Prénom NOM <pseudonyme@site.ext>
 * @version     PHPBoost 6.0 - last update: 2022 11 18
 * @since       PHPBoost 6.0 - 2022 11 18
 * @contributor Prénom NOM <pseudonyme@site.ext>
 */
 
class QuestionCaptchaExtensionPointProvider extends ExtensionPointProvider
{
    public function __construct()
    {
        parent::__construct('QuestionCaptcha');
    }
 
    public function captcha()
    {
        return new QuestionCaptcha();
    }
 
    public function css_files()
    {
        $module_css_files = new ModuleCssFiles();
        $module_css_files->adding_running_module_displayed_file('QuestionCaptcha.css');
        return $module_css_files;
    }
 
    public function url_mappings()
    {
        return new UrlMappings(array(new DispatcherUrlMapping('/QuestionCaptcha/index.php')));
    }
}
?>
 


Tout le reste fonctionne comme tout autre module pour l'utilisation des fichiers css, la création de templates, etc...
Vous pouvez vous inspirer du code du module ReCaptcha, le Captcha de Google, qui fait appel à une librairie externe de Google et a une partie configuration ou du module QuestionCaptcha qui permet de définir des questions personnalisées dans la partie configuration du module.