Установка капчи в NPJ
Начиная с версии npj.r1.9.a200907282329 капча интегрирована в дистрибутив NPJ для анонимных комментариев и регистрации пользователей.
Взят
отсюда. Должен лежать в lib/captcha. Нужно смотреть, что происходит с сессией, если ее нет в нужный момент – либо твикать session.auto_start, или стартовать вручную в нужном месте (хотя в случае НПЖ где это нужное место не очень понятно...)
lib/captcha/.htaccess
core/classes/FieldCaptcha.php
<?php
define( 'LIB_DIR', '/lib/captcha');
Class FieldCaptcha extends Field {
var $config = array(); // настройки шаблона
function FieldCaptcha( &$rh, $config ) {
$this->config =& $config;
Field::Field(&$rh, $config);
// передаем значения переменных в шаблон
// $this->rh->tpl->Assign("_DebugMessage", $_SESSION['captcha_keystring']); - предыдущее значение (идет в валидатор)
$this->rh->tpl->Assign("_CaptchaGD", LIB_DIR."/");
$this->rh->tpl->Assign("_RegistrationPage", "http://".$_SERVER['HTTP_HOST']."/registration");
}
// override родительского Field::Validate()
function Validate() {
$config = &$this->config;
$data = &$this->data;
Field::Validate();
if (isset($this->config["nessesary"]) && ($data === "") && ($this->config["nessesary"]==1)) {
$this->invalidReasons["FormError_Nessesary"] = "Поле должно быть обязательно заполнено!";
}
elseif ( isset($this->config["nessesary"]) && (strtolower($data) !== $_SESSION['captcha_keystring']) ) {
$this->invalidReasons["FormError_Nessesary"] = "Вы ввели неверное значение. Попробуйте снова.";
}
unset($_SESSION['captcha_keystring']);
$this->invalid = sizeof($this->invalidReasons) != 0;
return !$this->invalid;
}
} // EOC
?>
npj/classes/NpjRequestHandler.php
Заменить
unset($_SESSION);
на
unset($_GET['PHPNPJID']);
npj/themes/absent/templates/forms/captcha.html
{{TEMPLATE:VisualCaptcha}}
<a href="{{_RegistrationPage}}" style="font-size:6pt; text-decoration:none">{ Зарегистрироваться }</a>
<div>
<img src="{{_CaptchaGD}}" width="200" height="60" alt="Visual Captcha"/><br>
<input type="text" id="id_{{_Field}}" name="{{_Field}}" rows="1" style="width:200px">
</div>
{{_DebugMessage}}
{{/TEMPLATE:VisualCaptcha}}
npj/handlers/comments/!form_add.php
Добавить перед вызовом $form = &new Form(...)
<?
if ($principal->data["user_id"] == 1) { // капчу показывать только гостям
$rh->UseClass("FieldCaptcha", $rh->core_dir);
$group1[] = &new FieldCaptcha( &$rh, array(
"field" => "captcha",
"nessesary" => 1,
"tpl_row" => "form.html:Row_Span",
"tpl_data" => "captcha.html:VisualCaptcha" ) );
}
?>
npj/messagesets/std_form_Comment.php
Добавить в массив $this->message_set строку
"Form.captcha" => "Вы человек? Подтвердите вводом текста скартинки",