Captcha
CAPTCHA – фильтр спам-ботов и реальных пользователей сайта, которые оставляют сообщения в формах различных модулей сайта, таких как «Обратная связь», «Комментарии», «Обратная связь», «Форум» и т.д. Капча может быть трех видов, классический «Код на картинке», более сложная вариация «reCAPTCHA», или «Вопрос-Ответ», когда администратор задает вопрос и варианты ответа, а пользователь должен выбрать правильный, чтобы его сообщение было принято на сайте.
Примечание: в DIAFAN.CMS используется «reCAPTCHA» 2-ой версии.
Подключение
Подключаемая часть – файл modules/captcha/captcha.inc.php. В нем описан класс
Captcha_inc. В модуле к объекту класса можно обратиться через переменную $this->diafan->_captcha. Экземпляр класса создается при первом вызове
переменной.
Методы
string get ([string $modules = "modules"], [string $error = ""], [boolean $is_update = false]) 
 – Выводит капчу.
- string $modules: метка капчи
 - string $error: ошибка ввода кода, если запрос передан не через Ajax
 - boolean $is_update: капча генерируется для обновления
 
Пример:
// в модели modules/comments/comments.inc.php запрашиваем каптчу
$captcha = $this->diafan->_captcha->get("comments", '');
//выводим защитный код в шаблоне modules/comments/views/comments.view.form.php
echo $captcha;
string|boolean false error ([string $modules = "modules"]) 
 – Проверяет правильность ввода капчи.
- string $modules: метка капчи
 
Пример:
//выводим защитный код в шаблоне modules/comments/views/comments.view.form.php
echo $captcha;
//запрашиваем правильно ли введен защитный код при обработке запроса в файле modules/faq/faq.action.php
$error = $this->diafan->_captcha->error('faq');
if($error)
{
    // защитный код введен неправильно
}
boolean configmodules (string $module, [integer $site_id = 0]) 
 – Проверяет подключена ли капта в настройках модуля.
- string $module: названием модуля
 - integer $site_id: страница сайта с подключенным модулем
 
Настройки
В настройках модуля можно выбрать бэкенд для капчи и вписать настройки для бэкенда (используется reCAPTCHA v.2).
- Тип – Выбор метода фильтрации спам-ботов. Добавить новый метод можно в папке modules/captcha/backend.
 
Бэкенды
К модулю можно подключить бэкенды для работы с различными сервисами. Добавлено в версии 6.0.9.10.
Для этого нужно разработать несколько файлов стандартной структуры и разместить папку с этими файлами в папку captcha/backend. После этого в настройках модуля появиться тип капчи.
Бэкенд должен иметь уникальное название латинскими буквами (по примеру recaptcha, qa и др.). Для примера будем использовать название myservice.
В папке captcha/backend/myservice могут находиться следующий файлы:
- captcha.myservice.admin.php
 - captcha.myservice.admin.js
 - captcha.myservice.inc.php
 - captcha.myservice.view.php
 - captcha.myservice.js
 - captcha.myservice.php
 
Это не обязательная структура расширения. Нужно использовать только необходимые файлы. Кроме того, в бэкенд можно добавлять свои файлы любой другой структуры.
Рассмотрим структуру стандартных файлов
captcha.myservice.admin.php
Файл содержит настройки бэкенда, подгружаемые при выборе поставщика услуг.
Структура файла:
Пример:
// ошибка 404 при прямом вызове файлов
if (! defined('DIAFAN'))
{
    $path = __FILE__;
    while(! file_exists($path.'/includes/404.php'))
    {
        $parent = dirname($path);
        if($parent == $path) exit;
        $path = $parent;
    }
    include $path.'/includes/404.php';
}
// наследуем класс Diafan, чтобы был доступен объект $this->diafan  
class Captcha_myservice_admin extends Diafan
{
    public $config = array(
        "name" => 'Название бэкенда, выводимое администратору',
        // настройки расширения
        // ключи этого массива - название настроек латинскими буквами
        "params" => array(
            // можно указать просто текстовое описание настройки
            // тогда она будет редактироваться как строка
            'param1' => 'Название первой настройки',
            // можно указать массив данных, тогда есть возможность
            // задать тип данных и подсказку
            'param2' => array(
                // название второй настройки
                'name' => 'Ключ к API',
                // доступны следующие типы: 
                // text - строка, по умолчанию
                // checkbox - галочка
                // select - список
                // info - название выводиться текстом без редактирования
                // none - не отображается, но сохраняется
                'type' => 'text',
                // значение списка, если указан тип select
                'select' => array(
                    'ключ1' => 'значение1',
                    'ключ2' => 'значение2',
                    'ключ3' => 'значение3',
                ),
                // подсказка
                'help' => 'Ключ запросите у сервиса капчи.',
            ),
            // можно определить свою функцию для вывода поля и его сохранения
            'param3' => 'Название третьей настройки',
        )
    );
    /**
     * Своя функция на редактирования настройки param3
     * 
     * @param string $value значение для param3
     * @param array $values значение всех полей настроек, ключ - название поля
     * @return void
     */
    public function edit_variable_param3($value, $values)
    {
        echo '<div class="unit">
            <div class="infofield">Название поля</div>
            Значение поля
        </div>';
    }
    /**
     * Своя функция на сохранение настройки param3
     * функция возвращает значение, которое нужно сохранить (не обязательно)
     *
     * @return mixed значение
     */
    public function save_variable_param3()
    {
        // сохраняет данные
        return $value;
    }
}
captcha.myservice.admin.js
При наличии этот JS-файл автоматически подключается в интерфейс настроек.
captcha.myservice.admin.inc.php
Вывод капчи на сайте.
Пример:
// ошибка 404 при прямом вызове файлов
if (! defined('DIAFAN'))
{
    $path = __FILE__;
    while(! file_exists($path.'/includes/404.php'))
    {
        $parent = dirname($path);
        if($parent == $path) exit;
        $path = $parent;
    }
    include $path.'/includes/404.php';
}
// наследуем класс Diafan, чтобы был доступен объект $this->diafan 
class Captcha_myservice_admin_inc extends Diafan
{
    /**
     * Выводит капчу
     * 
     * @param string $modules метка капчи
     * @param string $error ошибка ввода кода, если запрос передан не через Ajax
     * @param boolean $is_update капча генерируется для обновления
     * @return string
     */
    public function get($modules, $error, $is_update)
    {
        // функция выдает HTML-код капчи
        // настройки бэкенда доступны через настройки модуля:
        // $this->diafan->configmodules("названиеБэкенда_названиеНастройки", 'captcha');
        // при необходимости здесь можно подключить файл шаблона
        ob_start();
        include(Custom::path('modules/captcha/backend/myservice/captcha.myservice.view'.($is_update ? '.update' : '').'.php'));
        $text = ob_get_contents();
        ob_end_clean();
        return $text;
    }
    /**
     * Проверяет правильность ввода капчи
     * 
     * @param string $modules метка капчи
     * @return string|boolean false
     */
    public function check($modules)
    {
        if(! $check_captcha)
        {
            return 'Вы робот!';
        }
        else
        {
            return false;
        }
    }
}
captcha.myservice.js
При наличии этот JS-файл автоматически подключается на сайте.
captcha.myservice.php
Файл прямого вызова. Используется, например, для получения сгенерированной картинки капчи.
Обратиться к файлу можно по адресу: http://site.ru/captcha/get/myservice/.
База данных
{captcha_qa} – Вопросы для капчи типа Вопрос-ответ
{captcha_qa_answers} – Варианты ответов для капчи типа Вопрос-ответ
Файлы
modules/captcha/admin/captcha.admin.php – настройки модуля;
modules/captcha/admin/captcha.admin.inc.php – подключение модуля к административной части других модулей;
modules/captcha/backend/kcaptcha/captcha.kcaptcha.php – генерирование изображения капчи;
modules/captcha/backend/kcaptcha/captcha.kcaptcha.action.php – обработка POST-запросов бэкенда;
modules/captcha/backend/kcaptcha/captcha.kcaptcha.admin.php – настройки капчи «Код на картинке»;
modules/captcha/backend/kcaptcha/captcha.kcaptcha.inc.php – подключение для работы с капчей «Код на картинке»;
modules/captcha/backend/kcaptcha/captcha.kcaptcha.js – JS-сценарий стандартной капчи;
modules/captcha/backend/kcaptcha/captcha.kcaptcha.view.php – шаблон стандартной капчи;
modules/captcha/backend/kcaptcha/captcha.kcaptcha.view.update.php – шаблон формы стандартной капчи;
modules/captcha/backend/qa/captcha.qa.admin.php – настройки капчи «Вопрос-Ответ»;
modules/captcha/backend/qa/captcha.qa.inc.php – подключение для работы с капчей «Код на картинке»;
modules/captcha/backend/qa/captcha.qa.js – JS-сценарий капчи «Вопрос-Ответ»;
modules/captcha/backend/qa/captcha.qa.view.php – шаблон капчи «Вопрос-Ответ»;
modules/captcha/backend/qa/captcha.qa.view.update.php – шаблон формы для капчи «Вопрос-Ответ»;
modules/captcha/backend/recaptcha/captcha.recaptcha.admin.php – настройки капчи «reCAPTCHA»;
modules/captcha/backend/recaptcha/captcha.recaptcha.inc.php – подключение для работы с капчей «reCAPTCHA»;
modules/captcha/backend/recaptcha/captcha.recaptcha.js – JS-сценарий для reCAPTCHA;
modules/captcha/backend/recaptcha/captcha.recaptcha.view.php – шаблон reCAPTCHA;
modules/captcha/backend/recaptcha3/captcha.recaptcha3.admin.php – настройки капчи «reCAPTCHA v3»;
modules/captcha/backend/recaptcha3/captcha.recaptcha3.inc.php – подключение для работы с капчей «reCAPTCHA v3»;
modules/captcha/backend/recaptcha3/captcha.recaptcha3.js – JS-сценарий для reCAPTCHA v3;
modules/captcha/backend/recaptcha3/captcha.recaptcha3.view.php – шаблон reCAPTCHA v3;
modules/captcha/backend/yacaptcha/captcha.yacaptcha.admin.php – настройки капчи «Yandex SmartCaptcha»;
modules/captcha/backend/yacaptcha/captcha.yacaptcha.inc.php – подключение для работы с капчей «Yandex SmartCaptcha»;
modules/captcha/backend/yacaptcha/captcha.yacaptcha.js – JS-сценарий для Yandex SmartCaptcha;
modules/captcha/backend/yacaptcha/captcha.yacaptcha.view.php – шаблон Yandex SmartCaptcha;
modules/captcha/captcha.php – контроллер модуля;
modules/captcha/captcha.action.php – обработка POST-запросов модуля;
modules/captcha/captcha.get.php – прямое обращение к файлам бэкенда капчи;
modules/captcha/captcha.inc.php – подключение для работы с капчей;
modules/captcha/captcha.install.php – установка модуля.
Дополнения
Зарегистрируйтесь или авторизируйтесь для того, чтобы оставить комментарий.

