پلاگین کپچا

این بخش توضیح می‌دهد چگونه یک پلاگین کپچا توسعه دهیم.

پلاگین کپچا به این صورت کار می‌کند: پلاگین یک ارائه‌دهنده کپچا را هنگام رخداد onCaptchaSetup ثبت می‌کند، سپس سیستم بسته به آنچه در تنظیمات کلی انتخاب شده و نحوه پیکربندی فیلد کپچا در فرم، از آن استفاده خواهد کرد. 

رویدادهای این گروه عبارتند از:

- onCaptchaSetup

امضای رویداد:

 
function onCaptchaSetup(Joomla\CMS\Event\Captcha\CaptchaSetupEvent $event){}

 

ویژگی‌های رویداد:

 
/** 
 * @var Joomla\CMS\Captcha\CaptchaRegistry $subject 
 */
$subject = $event->getCaptchaRegistry();

 

ساخت پلاگین کپچا

پلاگین کپچا شامل دو بخش اصلی است:

- کلاس ارائه‌دهنده کپچا، که منطق کپچا برای نمایش ورودی و اعتبارسنجی را فراهم می‌کند.

- پلاگین در گروه کپچا، که ارائه‌دهنده را ثبت می‌کند تا سیستم از وجود آن باخبر شود.

مثال زیر فرض می‌کند شما از قبل نحوه ساخت پلاگین جوملا را می‌دانید. 

بیایید یک کپچای ساده Honeypot بسازیم.

ابتدا یک پلاگین در مسیر plugins/captcha/honeypot/ بسازید و نام آن را honeypot بگذارید، فرض کنیم فضای نام آن JoomlaExample\Plugin\Captcha\Honeypot است.

سپس ارائه‌دهنده کپچای Honeypot را بسازید که در مسیر زیر قرار دارد.

plugins/captcha/honeypot/src/Provider/HoneypotCaptchaProvider.php

 
namespace JoomlaExample\Plugin\Captcha\Honeypot\Provider;

use Joomla\CMS\Captcha\CaptchaProviderInterface;
use Joomla\CMS\Form\FormField;

/**
 * ارائه‌دهنده کپچای Honeypot
 */
final class HoneypotCaptchaProvider implements CaptchaProviderInterface
{
    /**
     * بازگرداندن نام کپچا به صورت رشته CMD.
     *
     * @return string
     */
    public function getName(): string
    {
        return 'honeypot';
    }
    
    /**
     * رندر کردن ورودی کپچا
     *
     * @param string $name نام ورودی داده شده در فرم
     * @param array $attributes کلاس فیلد و سایر ویژگی‌ها از فرم
     *
     * @return string کد HTML جاسازی شده در فرم
     *
     * @throws \RuntimeException
     */
    public function display(string $name = '', array $attributes = []): string
    {
        return '<input type="hidden" value="" name="' . $name . '" id="' . ($attributes['id'] ?? '') . '" class="' . ($attributes['class'] ?? '') . '"/>';
    }
    
    /**
     * اعتبارسنجی داده ورودی
     *
     * @param ?string $code پاسخ ارائه شده توسط کاربر
     *
     * @return bool در صورت درست بودن پاسخ، درست و در غیر اینصورت نادرست
     *
     * @throws \RuntimeException
     */
    public function checkAnswer(?string $code = null): bool
    {
        return !$code;
    }
    
    /**
     * متدی برای واکنش به تنظیم فیلد کپچا. این امکان را می‌دهد
     * که فیلد و/یا عنصر XML فیلد تغییر کند.
     *
     * @param FormField $field نمونه فیلد کپچا
     * @param \SimpleXMLElement $element تعریف XML فرم
     *
     * @return void
     *
     * @throws \RuntimeException
     */
    public function setupField(FormField $field, \SimpleXMLElement $element): void
    {
        // مخفی کردن برچسب برای این نوع کپچا
        $element['hiddenLabel'] = 'true';
    }
}

سپس ارائه‌دهنده را در سیستم با یک پلاگین و رویداد ثبت کنید:

 
namespace JoomlaExample\Plugin\Captcha\Honeypot\Extension;

use Joomla\CMS\Plugin\CMSPlugin;
use Joomla\Event\SubscriberInterface;
use JoomlaExample\Plugin\Captcha\Honeypot\Provider\HoneypotCaptchaProvider;

final class HoneypotCaptcha extends CMSPlugin implements SubscriberInterface
{
    /**
     * آرایه‌ای از رویدادهایی که این پلاگین به آنها گوش می‌دهد را بازمی‌گرداند.
     *
     * @return array
     */
    public static function getSubscribedEvents(): array
    {
        return [
            'onCaptchaSetup' => 'onCaptchaSetup',
        ];
    }
    
    /**
     * ثبت نمونه کپچا
     *
     * @param CaptchaSetupEvent $event
     *
     * @return void
     */
    public function onCaptchaSetup(CaptchaSetupEvent $event)
    {
       $event->getCaptchaRegistry()->add(new HoneypotCaptchaProvider());
    }
}

کار تمام است 🎉 بعد از نصب و فعال کردن این پلاگین، کپچا جدید در تنظیمات کلی جوملا برای استفاده در دسترس خواهد بود.