CAPTCHA

Содержание...

Капча подключается очень просто. В шаблоне Smarty в подходящем месте необходимо разместить:

{$wa->captcha()}

И в PHP проверять введенный код следующим образом:


if (wa()->getCaptcha()->isValid()) {
    // капча введена правильно
} else {
    // неправильно
}

Конструкция Smarty {$wa->captcha} возвращает HTML-код для капчи, который содержит картинку img, input для ввода кода и ссылку обновления капчи:

<div class="wa-captcha">
    <p>
        <img class="wa-captcha-img" src="{$captcha_url}" alt="CAPTCHA" title="Refresh CAPTCHA">
        <strong>→</strong>
        <input type="text" name="captcha" class="wa-captcha-input" autocomplete="off">
    </p>
    <p>
        <a class="wa-captcha-refresh">Refresh CAPTCHA</a>
    </p>
    <script>
    // ... js-код для работы ссылки Refresh CAPTCHA
    </script>
</div>

Внешний вид можно настроить с помощью CSS: всем ключевым элементам присвоены классы с префиксом wa-captcha.

Если вместо указанного выше кода необходимо использовать другой HTML для капчи, то это можно сделать с помощью конструкции {$wa->captchaUrl()}, которая возвращает только адрес (URL) картинки с капчей. Размер картинки по умолчанию — 120x40px. Пример:

<img  src="{$wa->captchaUrl()}">
<input type="text" name="code" />

Если для аттрибута name для input с кодом капчи указать значение, отличное от captcha (как в примере выше), то проверка на стороне сервера будет делаться так:

$code = waRequest::post('code');
wa()->getCaptcha()->isValid($code);

Ограничения: нельзя показывать две капчи на одной странице. Код, показываемый в капче, сохраняется в сессии.

Переопределение капчи

На уровне приложения можно указать класс, который используется для капчи, а также настроить параметры стандартной капчи (размеры, содержание и т.д.).

По умолчанию используется класс waCaptcha. Настройки waCaptcha:

'chars' => 'abdefhknrqstxyz23456789',
'width' => 120, // px
'height' => 40, // px
'font_size' => 25, // pt

Для переопределения вышеуказанных настроек waCaptcha для вашего приложения необходимо создать файл wa-apps/APP_ID/lib/config/factories.php следующего содержания:

<?php

return [
    'captcha' => [
        'waCaptcha' ,
        [
            'width'     => 200,
            'height'    => 70,
            'font_size' => 40,
        ],
    ],
];

Такое переопределение сделает капчу в вашем приложении размером 200x70 пикселей и размером шрифта 40pt.

Чтобы написать свой класс капчи, нужно унаследовать его от класса waAbstractCaptcha.

В классе должны быть реализованы следующие методы:

public function isValid($code = null)
// должен возвращать true, если код правильный, и false в противном случае

public function getHtml()
// должен возвращать полный HTML-код капчи (и картинку img, и поле input для ввода кода)

public function display()
// должен отдавать картинку капчи

Т. е. класс-наследник должен иметь примерно такой вид:

<?php

class myCaptcha extends waAbstractCaptcha
{

    public function isValid($code = null)
    {
  		
    }

    public function getHtml() 
    {
  		
    }

    public function display()
    {
  		
    }

}

В качестве примера рекомендуется посмотреть реализацию класса waCaptcha.

После реализации вашего класса капчи нужно в factories.php указать имя вашего класса:

return [
    'captcha' => 'myCaptcha',
];