Придумал не сам. Цитирую. Но у себя поставил - работает прекрасно называется == kcaptcha_rus ==Написал некто pedrosoft Интеграция KCAPTCHA с Joomla 1.5. Часть 1: Компонент com_user
Joomla настолько демократичная cms, что в базовый поставке не имеет никакой защиты от спам-ботов, хотя имеет формы ввода данных в которые эти спам-боты могут нагадить. Для избавления от такой напасти будем использовать отечественную разработку под названием KCAPTCHA, написанную на php «для защиты от спама и флуда». В первой части я расскажу об интеграции с компонентом com_user, а во-второй сделаю интеграцию с com_contact. Интеграция будет проделана с Joomla 1.5.14.
Скачаем
KCAPTCHA и распакуем архив в директорию «libraries» дистрибутива Joomla.
Теперь приступим к интеграции:
1) В корневом файле Joomla index.php после 17 строки добавим:
// BEGIN PATCH
session_start();
if(isset($_SESSION['captcha_keystring'])&&($_SESSION['captcha_keystring']==$_POST['captcha']))
$_POST['captcha']=1;
else
$_POST['captcha']=0;
session_destroy();
// END PATCH
и после 92 строки:
$mainframe->triggerEvent('onAfterRender');
// BEGIN PATCH
JSession::close();
// END PATCH
/**
* RETURN THE RESPONSE
*/
2) Добавим проверку и показ защитного изображения в форму регистрации. В файле /components/com_user/controller.php после строки 331 добавим:
$document =& JFactory::getDocument();
// BEGIN PATCH
if ($_POST['captcha'] !== 1) {
JError::raiseWarning( 403, JText::_( 'You need to enter the code shown' ));
$this->setRedirect('index.php?option=com_user&task=register');
return false;
}
// END PATCH
// If user registration is not allowed, show 403 not authorized.
и в файле /components/com_user/views/register/tmpl/default.php после 73 строки:
<input class="inputbox required validate-passverify" type="password" id="password2" name="password2" size="40" value="" /> *
</td>
</tr>
<!-- BEGIN PATCH -->
<tr>
<td height="60">
<label for="captcha">
<?php echo JText::_( 'Enter text shown below' ); ?>:
</label>
</td>
<td>
<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;" />
</td>
</tr>
<!-- END PATCH -->
<tr>
<td colspan="2" height="40">
3) Добавим переводы созданных нами языковых констант в файл локализации. Открываем /language/ru-RU/ru-RU.ini и добавляем в любое место следующие строки:
# BEGIN PATCH
ENTER TEXT SHOWN BELOW=Введите код
YOU NEED TO ENTER THE CODE SHOWN=Вы должны ввести правильный код, указанный на картинке.
# END PATCH
Ну вот теперь всё готово! Можно поднастроить KCAPTCHA, делается это через файл kcaptcha_config.php:
$allowed_symbols — доступные символы для картинок
$length — количество символов для проверки
$width $height — ширина и высота картинки
$show_credits — показ ссылки на авторов, чтобы убрать — поставить false
$jpeg_quality — качество генерируемого изображения
Интеграция / Интеграция KCAPTCHA с Joomla 1.5. Часть 2: Компонент com_contact
Итак, продолжаю первую статью об интеграции KCAPTCHA с Joomla 1.5. Сегодня опишу интеграцию KCAPTCHA с компонентом com_contact.
Приступим:
1) В файле /components/com_contact/controller.php после строки 164 добавим:
$mail->setSubject( $FromName.': '.$subject );
$mail->setBody( $body );
// BEGIN PATCH
if(1!==$_POST['captcha']) {
JError::raiseWarning( 403, JText::_( 'You need to enter the code shown' ));
$this->setRedirect(JRoute::_('index.php?option=com_contact&view=contact&id='.$contactId, false));
return false;
}
// END PATCH
$sent = $mail->Send();
2) В файл /components/com_contact/views/contact/tmpl/default_form.php после строки добавим:
<?php endif; ?>
<!-- BEGIN PATCH -->
<br />
<br />
<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;" />
<!-- END PATCH -->
<br />
<br />
<button class="button validate" type="submit"><?php echo JText::_('Send'); ?></button>
Готово! Если делаете интеграцию только для компонента com_contact, то не забудьте добавить нужный код в index.php Joomla, а также языковые константы в файл локализации, как это описано в первой части.
Как в com_contact сделать так, чтобы в случае ввода неверного кода с картинки, не пропадали уже введенные данные формы (e-mail, текст сообщения)?
Чтобы данные в форме сохранялись в default_form.php после
Код:
$document =& JFactory::getDocument();
$document->addScriptDeclaration($script);
вставляем
Код:
$name = JRequest::getVar( 'name', '', 'post' );
$email = JRequest::getVar( 'email', '', 'post' );
$subject = JRequest::getVar( 'subject', $default, 'post' );
$body = JRequest::getVar( 'text', '', 'post' );
Это переменные из обработчика - файла controller.php.
Дальше в input'ах в параметр value подставляем эти переменные, например так:
Код:
<input type="text" name="name" id="contact_name" size="30" class="inputbox" value="<?php echo $name ?>" />