RealCaptcha — простая каптча для MODX Revolution
Любую форму обратной связи важно защитить от спама. Если в MODX Evolution была встроенная аккуратная каптча, то в Revolution от неё отказались и предложили в качестве альтернативы ReCaptcha от Google, которая искажает символы так, что с первой попытки угадать их бывает крайне сложно.
Поискав информацию на тему альтернативной каптчи для MODX Revo я обнаружил что выбор мал. Есть готовый компонент «Qaptcha», основанный на jquery плагине и пару статей на тему, как сделать каптчу для MODX самому. Поэтому я решил написать свой вариант простой каптчи для MODX Revo. Каптчу я назвал «RealCaptcha» и на её основе собрал пакет для MODX Revolution. Это мой первый опыт сборки пакетов, поэтому возможны баги.
Для установки пакета скопируйте его в директорию /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` ]]
Конечный результат будет выглядеть примерно так:
Чтобы при неправильно введенных символах выводилась ошибка, в форме или перед ней прописываем плейсхолдер:
[[!+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'] = 'Ошибка. Каптча введена неверно!';
В коде мы вызываем сниппет «RealCaptchaValid» с параметром «component=Quip» и при отрицательном результате проверки каптчи генерируем ошибку. Теперь всё должно работать.
В завершение хочется поблагодарить человека с ником Anovoselof, который описал способ привязки своей каптчи к комментариям в MODX Revolution. Я всего лишь оформил всё это в качестве пакета и упростил использование.
../../../../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
Если не поможет, значит на новом хостинге как-то не так работают сессии.
Возможно, следует проверять их работу и выяснять у тех. поддержке почему они не работают. Ещё могу дать другой код для подключения в этом же файле ядра модх, но по идее раз работало, то ничего случится не должно было.
Если детально, сделал так:
В таком случае не загружается даже картинка каптчи в форме, пустой img. Может полностью попробовать путь прописать ?
Либо косяк действительно на хостинге, либо API MODX не подключился как надо, чтобы нормально работать с сессиями.
А еще можно сессии отключать — параметр session_enabled для контекста. Может отключены просто.
Все сдаюсь… :) Буду пока без каптчи.
Альтернативных вариантов не так много. Яндекс прекратил поддержку.
Тут в сниппете:
есть вывод картинки, но она у меня не отображается, а цифры если написать echo $_SESSION['captcha']; выводит. Может посмотрите и мне заодно подскажете? :)