Что такое Capthca знают почти все. Это набор символов из букв и/или цифр, которые нужно вести, чтобы доказать, что вы не "жираф", а вполне вменяемый человек.
По-умолчанию в Joomla 1.5 такой защиты не предусмотрено, и через некоторое время, как вы запустили свой сайт, к вам на почту начинают сыпаться письма со всякими разными предложениями, или проще говоря - спам.
Будем бороться с этим. Поставим на страницу с контактами защиту. Принцип работы весьма прост: ввели картинку верно - письмо отправляется, ошиблись - попробуйте еще раз.
Итак, нам понадобятся три файла для правки кода:
- index.php (лежит в корне сайта)
- controller.php (лежит здесь components/com_contact/)
- default.php (лежит здесь components/com_contact/views/contact/tmpl)
1) Открываем index.php и находим в нем следующий фрагмент кода (~17 строка)
define('JPATH_BASE', dirname(__FILE__) );
define( 'DS', DIRECTORY_SEPARATOR );
Вставляем между ними код:
session_start();
if(isset($_SESSION['captcha_keystring'])&&($_SESSION['captcha_keystring']==$_POST['captcha']))
$_POST['captcha']=1;
else
$_POST['captcha']=0;
session_destroy();
Спускаемся в самый низ (~86-90 строки) и находим там:
JDEBUG ? $_PROFILER->mark('afterRender') : null;
$mainframe->triggerEvent('onAfterRender');
Сразу после этих строк вставляем:
JSession::close();
Сохраняем файл. Проверьте, что сохранили в кодировке UTF-8 (without BOM).
2) components/com_contact/controller.php ~176 строка. Находим там:
$mail->addRecipient( $contact->email_to );
$mail->setSender( array( $email, $name ) );
$mail->setSubject( $FromName.': '.$subject );
$mail->setBody( $body );
И после этих строк вставляем:
if(1!==$_POST['captcha']) {
JError::raiseWarning( 403, JText::_( 'Enter captcha code' ));
$this->setRedirect(JRoute::_('index.php?option=com_contact&view=contact&id='.$contactId, false));
return false;
}
3. /components/com_contact/views/contact/tmpl/default_form.php ~63 строка. Фрагмент кода такой:
<br />
<br />
<button class="button validate" type="submit"><?php echo JText::_('Send'); ?></button>
Сразу после этого вставляем наш код:
<label for="captcha"><?php echo JText::_( 'Enter text shown below' ); ?>:</label>
<br />
<input type="text" name="captcha" class="inputbox" size="20" id="captcha" />
<img src="<?php JURI::base() ?>libraries/kcaptcha/index.php?<?php echo session_name(); ?>=<?php echo session_id(); ?>" alt="Captcha" style="vertical-align:-25px;" />
Скачиваем капчу здесь
Распаковываем архив и папку kcaptcha аккуратно (т.е., чтоб все файлы записались) кладем в папку libraries.
Теперь добавляем новые пункты в языковой файл /language/ru-RU/ru-RU.ini следующие строчки:
Enter captcha code=Введите правильный код с картинки
Enter captcha text=Введите символы с картинки
Все готово. Проверяем.
Теперь давайте рассмотрим такую ситуацию, когда пользователь не может разобрать символы, и по щелчку по изображению, мы покажем ему другую картинку.
Открываем файл /components/com_contact/views/contact/tmpl/default_form.php
Для картинки назначаем id, например cimg. И добавляем событие onclick, то есть в результате будет:
<img id="cimg" title="Не видите символы, щелкните по картинке - предложим другую" src="<?php JURI::base() ?>libraries/kcaptcha/index.php?<?php echo session_name(); ?>=<?php echo session_id(); ?>" alt="Captcha" style="vertical-align:-25px;" onclick="document.emailForm.cimg.src='<?php JURI::base(); ?>/libraries/kcaptcha/index.php?' + new String(Math.random())"/>
Обратите на фрагмент document.emailForm.cimg.
emailForm - имя формы;
cimg - id картинки.
Теперь картинка будет обновляться по шелчку.
