RealAdmin.ru

RealCaptcha — простая каптча для MODX Revolution

MODX,Комментарии,Почта
Категория: Сайтострой
24 Ноя 2013 г. в 21:45

Любую форму обратной связи важно защитить от спама. Если в MODX Evolution была встроенная аккуратная каптча, то в Revolution от неё отказались и предложили в качестве альтернативы ReCaptcha от Google, которая искажает символы так, что с первой попытки угадать их бывает крайне сложно.

Поискав информацию на тему альтернативной каптчи для MODX Revo я обнаружил что выбор мал. Есть готовый компонент «Qaptcha», основанный на jquery плагине и пару статей на тему, как сделать каптчу для MODX самому. Поэтому я решил написать свой вариант простой каптчи для MODX Revo. Каптчу я назвал «RealCaptcha» и на её основе собрал пакет для MODX Revolution. Это мой первый опыт сборки пакетов, поэтому возможны баги.

Скачать «RealCaptcha» 1.0.4

Для установки пакета скопируйте его в директорию /core/packages/, а затем в «Система -> Управление пакетами», нажмите «Искать пакеты локально».

Пакет состоит из одного чанка и сниппета

Чанк выводит каптчу и поле для ввода символов с неё:

[[$RealCaptcha]]

Сниппет производит проверку правильности введенных символов с каптчи. Если они совпадают, то возвращает «true», если нет — «false»:

[[!RealCaptchaValid]]

Изображение каптчи генерируется скриптом «kcaptcha», который распаковывается по умолчанию в директорию:/assets/components/realcaptcha/kcaptcha/. Там лежит конфигурационный файл, изменяя параметры которого, Вы можете добиться нужного уровня искажения изображения каптчи.

Привязка RealCaptcha к FormIt

Исходим из того, что форма обратной связи у вас уже настроена и работает. В таком случае для привязки каптчи внутри формы обратной связи пропишите чанк «[[$RealCaptcha]]» (где-нибудь перед кнопкой Отправки), а в вызове сниппета «FormIt» пропишите дополнительные параметры - «validate» и «customValidators». Вот как это выглядит у меня:

[[!FormIt?
      &hooks=`email`
      &emailTpl=`MyLetterChunk`
      &emailTo=`exemple@mail.ru`
      &successMessage=`Письмо успешно отправлено.`
      &emailSubject=`Обратная связь exemple.ru`
      &validate=`captcha:RealCaptchaValid, name:required, email:email:required`
      &customValidators=`RealCaptchaValid`
]] 

Конечный результат будет выглядеть примерно так:

каптча для modx

Чтобы при неправильно введенных символах выводилась ошибка, в форме или перед ней прописываем плейсхолдер:

[[!+fi.error.captcha]]

Простая каптча для формы обратной связи готова.

Привязка RealCaptcha к Quip

Теперь рассмотрим каким образом можно привязать «RealCaptcha» к комментариям «Quip».

Сначала давайте выведем нашу каптчу на форме отправки нового сообщения. За генерацию этой формы отвечает сниппет «QuipReply», а за оформление — чанк, который указывается в качестве параметра — «&tplAddComment»:

[[!QuipReply?
      &thread=`[[*alias]]-[[*id]]`
      &moderate=`0`
      &tplAddComment=`comment-chank`
]]

В этом чанке перед кнопкой «Отправить», вызываем чанк, отвечающий за вывод каптчи, а так же код, который будет выводить ошибку в случае неверно введенных символов:

<span class="quip-error">[[+error.RealCaptcha]]</span> 
[[$RealCaptcha]]

Осталось дело за малым - вызвать в коде компонента «Quip» наш сниппет проверки правильности введенной каптчи. Для этого открываем файл /core/components/quip/controllers/web/ThreadReply.php и в функцию «handlePost()» прописываем следующий код:

/* RealCaptcha */
$fields['captcha'] = strip_tags($fields['captcha']);
$validate = $this->modx->runSnippet('RealCaptchaValid',array('component' => 'Quip','QuipValue' => $fields['captcha']));
if ($validate!='RealCaptchaTrue') $errors['RealCaptcha'] = 'Ошибка. Каптча введена неверно!';

RealCaptcha

В коде мы вызываем сниппет «RealCaptchaValid» с параметром «component=Quip» и при отрицательном результате проверки каптчи генерируем ошибку. Теперь всё должно работать.

В завершение хочется поблагодарить человека с ником Anovoselof, который описал способ привязки своей каптчи к комментариям в MODX Revolution. Я всего лишь оформил всё это в качестве пакета и упростил использование.

Посмотрите похожее — 6
Комментарии — 15
  1. avatar Ромчик 07 августа 2015, 22:55 #
    После переноса сайта на др. хостинг, капча не принимает введенный код, обновление сниппета не дало результата. В чем может быть проблема?
    1. avatar Simkin Andrew 08 августа 2015, 12:43 #
      Открой файл assets/components/realcaptcha/kcaptcha/index.php и проверь правильность путей. Я там их несколько коряво прописал. Логично заменить:
      ../../../../core/model/modx/modx.class.php
      на $_SERVER['DOCUMENT_ROOT']. "/core/model/modx/modx.class.php
      и include('kcaptcha.php');
      на $_SERVER['DOCUMENT_ROOT']. "/assets/components/realcaptcha/kcaptcha/kcaptcha.php

      Если не поможет, значит на новом хостинге как-то не так работают сессии.
      Возможно, следует проверять их работу и выяснять у тех. поддержке почему они не работают. Ещё могу дать другой код для подключения в этом же файле ядра модх, но по идее раз работало, то ничего случится не должно было.
      1. avatar Ромчик 08 августа 2015, 15:12(был изменён) #
        Спасибо за помощь!

        Если детально, сделал так:

        <?php
        
        require_once $_SERVER['DOCUMENT_ROOT']. "/core/model/modx/modx.class.php";
        $modx= new modX();
        $modx->initialize('web');
        error_reporting (E_ALL);
        
        $_SERVER['DOCUMENT_ROOT']. "/assets/components/realcaptcha/kcaptcha/kcaptcha.php";
        
        $captcha = new KCAPTCHA();
        
        session_start();
        
        if($_REQUEST[session_name()]){
            $_SESSION['RealCaptcha'] = md5('realadmin.ru'.$captcha->getKeyString().'realadmin.ru');
        }
        
        ?>
        
        В таком случае не загружается даже картинка каптчи в форме, пустой img. Может полностью попробовать путь прописать
        http://...
        ?
      2. avatar Simkin Andrew 08 августа 2015, 12:45 #
        define('MODX_API_MODE', true);
        require $_SERVER['DOCUMENT_ROOT'].'/index.php';
        $modx->initialize('web');
        
        1. avatar Ромчик 08 августа 2015, 15:54 #
          define('MODX_API_MODE', true);
          require $_SERVER['DOCUMENT_ROOT'].'/index.php';
          $modx->initialize('web');
          Тоже не исправило (Ошибка, каптча введена неверно!). Я уже по этому случаю поверх установил Modx. Все работает, кроме каптчи ( Наверное проблема с новым хостом. В любом случае, большое спасибо за помощь!
          1. avatar Ромчик 08 августа 2015, 16:32 #
            Обратился в ТП хостинга, просят уточнить какие требования к хостингу со стороны CMS.
            1. avatar Simkin Andrew 09 августа 2015, 13:54 #
              Не знаю, что-то с сессиями наверно связано. Надо дебагером проверять, если сессии с именем RealCaptcha нет, значит по каким-то причинам она не создалась в файле assets/components/realcaptcha/kcaptcha/index.php

              Либо косяк действительно на хостинге, либо API MODX не подключился как надо, чтобы нормально работать с сессиями.

              А еще можно сессии отключать — параметр session_enabled для контекста. Может отключены просто.
              1. avatar Ромчик 10 августа 2015, 00:24 #
                Пробовал экспериментировать с session_enabled, когда отключаю сайт вообще не загружается.

                Все сдаюсь… :) Буду пока без каптчи.

                Альтернативных вариантов не так много. Яндекс прекратил поддержку.

                1. avatar Любовь 14 октября 2015, 10:55 #
                  Я нашла вот такое решение
                  Тут в сниппете:
                  session_start();
                  //Создаем строку из 8 случайных цифр. 
                  for($i=1; $i<=8; $i++)
                  {$r=rand(0, 9);
                  $rnd.=$r; $rndn.=$r;
                  if ($i==4){$rndn.=' ';}}
                  // Записываем их в сессию
                  $_SESSION['captcha']=$rnd;
                  // Переменную с пробелом выводим на картинку с помощью phpthumbof
                  return '<img title="Введите номер карты" src="[[*capimg:phpthumbof=`w=140&h=90&zc=1&fltr[]=wmt|'.$rndn.'|10|BL|000000|10|90|15|0|5|15|`]]" alt="Каптча">';

                  есть вывод картинки, но она у меня не отображается, а цифры если написать echo $_SESSION['captcha']; выводит. Может посмотрите и мне заодно подскажете? :)
                  1. avatar Simkin Andrew 14 октября 2015, 14:00 #
                    А что, тоже не работает RealCapcha? Ну если в сессии сохраняется всё, значит неправильно отрабатывает сниппет проверки. Я могу помочь только если доступы от админки мне дашь.
                  2. avatar Ивано-Иванко 15 сентября 2016, 16:14 #
                    вот так у меня все заработало
                    <?php
                    
                    require_once $_SERVER['DOCUMENT_ROOT']. "/core/model/modx/modx.class.php";
                    define('MODX_API_MODE', true);
                    require $_SERVER['DOCUMENT_ROOT'].'/index.php';
                    //$modx->initialize('web');
                    //$modx= new modX();
                    //$modx->initialize('web');
                    //error_reporting (E_ALL);
                    
                    include($_SERVER['DOCUMENT_ROOT']. "/assets/components/realcaptcha/kcaptcha/kcaptcha.php");
                    
                    $captcha = new KCAPTCHA();
                    
                    //session_start();
                    
                    //if($_REQUEST[session_name()]){
                        $_SESSION['RealCaptcha'] = md5('realadmin.ru'.$captcha->getKeyString().'realadmin.ru');
                    //}
                    
                    ?>
                    1. avatar Simkin Andrew 15 сентября 2016, 17:02 #
                      Пасиб… как нибудь обновлю пакет
          2. avatar Ромчик 08 августа 2015, 00:42 #
            Спасибо кстати огромное за компонент, очень нравился простотой и легкостью чтения символов.
            1. avatar roman 24 декабря 2015, 11:56(был изменён) #
              В чанке [[$RealCaptcha]] ошибка при подключении картинки: img border=«1px» src="/assets/components/realcaptcha/kcaptcha/index.php". Нужно указать полный путь: [[++site_url]]assets/components/realcaptcha/kcaptcha/index.php, чтоб получилось найти index.php.
              1. avatar Simkin Andrew 24 декабря 2015, 21:32 #
                ок, спасибо… поправим
              © REALADMIN.RU   2016 г.
              Страница сгенерирована: 0,1418 s | 10 mb.
              На каком уровне Вы играете в шахматы?
              О П Р О С
              Home Question Top