Прикручиваем инвайты на dle 10x

В этом посте я вам раскажу как я прикручивал на свой сайт регистрацию по инвайтам (движек dle 10x).
Для чего это ? - по скольку был создан сайт с очень большим функцыоналом для зарегистрированных пользователей то пришлось делать регистр по инвайтам, для того что бы кто попало не смог пройти регистр и получить доступ к этому функцыоналу.

И так приступим:

Создаем файл: \upload\engine\data\config.invite.php
С таким содержымым:
<?PHP

//Registration for Invite v3.2

$c_invite = array (

'mod_of_status' => "1",

'user_iu_diu_num' => "1",

'mail_subject' => "Для вас приглашение на сайт название сайта",

'user_s_s_m' => "2",

'email_for_send' => "2",

'mod_p3_view_answers_limit' => "5",

'p3_view_answers' => "all",

'version' => "3.2",

);

?>

Создаем файл:  engine\inc\invite.admin.functions.php
С таким содержымым:

<?php
/*
=====================================================
Registration for Invite v3.2
-----------------------------------------------------
 http://www.svobodnui.blogspot.com/
-----------------------------------------------------
Данный код защищен авторскими правами
=====================================================
*/
if( $config['allow_alt_url'] == "yes" ) {
$link_user = $config['http_home_url'] . "user/";
} else {
$link_user = $config['http_home_url'] . "index.php?subaction=userinfo&user=";
}

//lang
$lang_mod = array(
'mod_rfi_a_on' => "Инвайты для регистрации",
'mod_rfi_a_on_t' => "Управление модулем регистрации по инвайтам, контроль приглашений, создание золотых приглашений",
'mod_rfi_a_m1' => "Общие настройки",
'mod_rfi_a_m2' => "Раздача инвайтов",
'mod_rfi_a_m3' => "Контроль инвайтов",
'mod_rfi_a_m4' => "Добавить инвайт",
'mod_rfi_a_p1_ok' => "Настройки модуля успешно сохранены",
'mod_rfi_a_error' => "Некоректное действие",
'mod_rfi_a_ok' => "Действие выполнено",
'mod_rfi_a_p1_med' => "Включить модуль:",
'mod_rfi_a_p1_med_t' => "Сделать регистрацию только по инвайтам.",
'mod_rfi_a_p1_ian' => "Инвайтов на пользователя:",
'mod_rfi_a_p1_ian_t' => "Изначальное количество инвайтов у пользователя.",
'mod_rfi_a_p1_se' => "Тема email сообщения:",
'mod_rfi_a_p1_se_t' => "Тема email сообщения, уведомляющего о получении инвайта.",
'mod_rfi_a_p1_me' => "Сообщение:",
'mod_rfi_a_p1_me_t' => "Содержание email сообщения, уведомляющего о получении инвайта.",
'mod_rfi_a_p1_me_t_info' => "<br><b>{%send_user%}</b> - кто отправил приглашение (выводит просто логин);<br><b>{%user_comment%}</b> - комментарий отправившего инвайт;<br><b>{%sam_invite%}</b> - собственно сам инвайт;<br><b>{%home_url%}</b> - url вашего сайта",
'mod_rfi_a_p1_sue' => "Включить отправку приглашёний на email:",
'mod_rfi_a_p1_sue_t' => "При добавлении инвайта пользователем, на email приглашённого отправляется уведомление.",
'mod_rfi_a_p1_save' => "Сохранить",

'mod_rfi_a_p1_efs_view' => "Указание email обязательно:",
'mod_rfi_a_p1_efs_view_t' => "Обязательно ли указывать email приглашаемого?",
'mod_rfi_a_p2_users' => "Пользователи",
'mod_rfi_a_p2_uni' => "Пользователь/Неиспользованные инвайты.",
'mod_rfi_a_p2_do' => "Действие",
'mod_rfi_a_p2_sti' => "Подарить/Изъять инвайты.",
'mod_rfi_a_p2_sti_1' => "Подарить инвайты",
'mod_rfi_a_p2_sti_2' => "Изъять инвайты",
'mod_rfi_a_p2_dvi' => "Количество инвайтов",
'mod_rfi_a_p2_dvi_t' => "Подарить/Изъять инвайты, а сколько?",
'mod_rfi_a_p3_t1' => "Инвайт:",
'mod_rfi_a_p3_t2' => "Email:",
'mod_rfi_a_p3_t3' => "Пригласил:",
'mod_rfi_a_p3_t4' => "Статус:",
'mod_rfi_a_p3_t5' => "В группу:",
'mod_rfi_a_p3_t6' => "Создано:",
'mod_rfi_a_p3_t7' => "Удалить",
'mod_rfi_a_p3_noinvites' => "Инвайтов вообще нет.",
'mod_rfi_a_p3_iid' => "id",
'mod_rfi_a_p4_sie_t' => "Email того, кого приглашаете.",
'mod_rfi_a_p4_sie_y' => "Отправить уведомление на email:",
'mod_rfi_a_p4_sie_y_t' => "Будет отправлено email сообщение приглашённому.",
'mod_rfi_a_p4_sim' => "Сообщение:",
'mod_rfi_a_p4_sim_t' => "Ваше сообщение будет вложено в приглашение.",
'mod_rfi_a_p4_send' => "Отправить",
'mod_rfi_a_p2_search_false' => "- Не найдено пользователей -",
'mod_rfi_a_p2_search_info' => "Введте логин или email пользователя.<br><b>Что значит +?</b> Это значит, что пользователь ещё не активировался в личном кабинете,<br> но как только он это сделает, ему припишется такое колличество инвайтов.",
'user_se' => "Поиск пользователя",
'db_prev' => "Вернуться назад",
);

$lang = array_merge($lang_mod);

//поиск пользователей
if ($_REQUEST['action'] == "searchuser") {
require_once '../ajax/adminfunction.php';
require_once('../data/config.invite.php');
$search_res = 0;
$search_info = $db->safesql( convert_unicode($_POST['dbsearchuser'], $config['charset']) );
$db->query( "SELECT * FROM " . USERPREFIX . "_users WHERE name LIKE '%".$search_info."%' OR email LIKE '%".$search_info."%' limit 10" );

$form_search_user .= '<select class="edit" name="i_user_name" size="5" style="width:150px;">
<option disabled>ник/инвайты</option>';
while ( $row = $db->get_row() ) {
$search_res++;
if(!$row['invites']) { $row['invites'] = "+".$c_invite['user_iu_diu_num']; }
$form_search_user .= "<option value='".$row[name]."'>".$row[name]."/".$row[invites]."</option>";
}
$form_search_user .= '</select>';

if($search_res == 0) $buffer = "<option disabled>- null -</option>"; else $buffer = $form_search_user;
echo $buffer;
}

//изменяем кол инвайтов
function dituserinvite($i_st_f, $i_user_name_d_1_f, $i_num_i_f){
global $db;
$sql_result = $db->query( "SELECT * FROM " . USERPREFIX . "_users where name='$i_user_name_d_1_f'" );
$row = $db->get_row( $sql_result );
$user_invites = $row['invites'];

if($i_st_f=="i_add_i") {
$diu_num_post = $user_invites + $i_num_i_f;
} else {
$diu_num_post_test = $user_invites - $i_num_i_f;
if($diu_num_post_test<="0") {
$diu_num_post = "0";
} else {
$diu_num_post = $diu_num_post_test;
}
}
return $diu_num_post;
}

function view_answers($do) {
$f_answer = "";
switch($do)
{
case yes:
$f_answer .= "where i_status='yes'";
break;
case no:
$f_answer .= "where i_status!='yes'";
break;
}
return $f_answer;
}

//email
function do_not_email($email) {
if(!$email) {
$answer = "<i>Не указан</i>";
} else {
$answer = $email;
}
return $answer;
}

//активен или нет
function row_i_status_func($row_i_status) {
global $link_user;
$user_page = explode("|", $row_i_status);
switch($row_i_status)
{
case yes:
$row_i_status_m = "<span style='color: green;'>Активен</span>";
break;
default:
$row_i_status_m = "<span style='color: red;'>Использован</span> (<a href=\"".$link_user.urlencode($user_page[1])."\" target=\"_blank\">".$user_page[1]."</a>)";
}
return $row_i_status_m;
}
?>

Создаем файл: \engine\inc\invite_registration.php
С таким содержымым:
<?php
/*
=====================================================
Registration for Invite v3.2
-----------------------------------------------------
 http://www.svobodnui.blogspot.com/
-----------------------------------------------------
Данный код защищен авторскими правами
=====================================================
*/
if( !defined( 'DATALIFEENGINE' ) OR !defined( 'LOGGED_IN' ) ) {
die( "Hacking attempt!" );
}

if( $member_id['user_group'] != 1 ) {
msg( "error", $lang['addnews_denied'], $lang['db_denied'] );
}

$db_user_search_list = "";

require_once(ENGINE_DIR.'/classes/mail.class.php');
$mail = new dle_mail( $config );

$invite_list_click = $PHP_SELF.'?mod=invite_registration&action=list';

/*======================================================
Пара нужный функций
========================================================*/
function gInvite($length = 8){
$chars = 'abdefhiknrstyzABDEFGHKNQRSTYZ23456789';
$numChars = strlen($chars);
$string = '';
for ($i = 0; $i < $length; $i++) {
$string .= substr($chars, rand(1, $numChars) - 1, 1);
}
return $string;
}

function makeDropDown($options, $name, $selected) {
$output = "<select name=\"$name\">\r\n";
foreach ( $options as $value => $description ) {
$output .= "<option value=\"$value\"";
if( $selected == $value ) {
$output .= " selected ";
}
$output .= ">$description</option>\n";
}
$output .= "</select>";
return $output;
}

$gold_invite = gInvite(8).'-'.gInvite(8).'-'.gInvite(8); //Собственно вид инвайта


require_once(ENGINE_DIR.'/data/config.invite.php');
require_once(ENGINE_DIR.'/inc/invite.admin.functions.php');

$row = $db->super_query( "SELECT template FROM " . PREFIX . "_email where name='new_invite' LIMIT 0,1" );
$row['template'] = stripslashes( $row['template'] );

/*======================================================
Выполнение страницы №1
========================================================*/
if(isset($_POST['edir_page1'])) {
if( $_REQUEST['user_hash'] == "" or $_REQUEST['user_hash'] != $dle_login_hash ) {
die( "Hacking attempt! User not found" );
}

$save_con = $_POST['save_con'];

$save_con['user_iu_diu_num'] = intval( $save_con['user_iu_diu_num'] );
if($save_con['user_iu_diu_num'] < 0) $save_con['user_iu_diu_num'] = 0;

$save_con['mod_p3_view_answers_limit'] = intval( $save_con['mod_p3_view_answers_limit'] );
if($save_con['mod_p3_view_answers_limit'] < 0) $save_con['mod_p3_view_answers_limit'] = 0;

include_once ENGINE_DIR . '/classes/parse.class.php';
$parse = new ParseFilter( Array (), Array (), 1, 1 );

$find[] = "'\r'";
$replace[] = "";
$find[] = "'\n'";
$replace[] = "";

$save_con['version'] = $c_invite['version'];

$handler = fopen( ENGINE_DIR . '/data/config.invite.php', "w" );

fwrite( $handler, "<?PHP \n\n//Registration for Invite v3.2\n\n\$c_invite = array (\n\n" );
foreach ( $save_con as $name => $value ) {


$value = str_replace( "$", "&#036;", $value );
$value = str_replace( "{", "&#123;", $value );
$value = str_replace( "}", "&#125;", $value );

$name = str_replace( "$", "&#036;", $name );
$name = str_replace( "{", "&#123;", $name );
$name = str_replace( "}", "&#125;", $name );

fwrite( $handler, "'{$name}' => \"{$value}\",\n\n" );

}
fwrite( $handler, ");\n\n?>" );
fclose( $handler );

$mailtheme = $_POST['edit_mail_template'];

$db->query( "UPDATE " . USERPREFIX . "_email SET template='$mailtheme' WHERE name='new_invite'" );

msg( "info", $lang['opt_sysok'], "$lang[mod_rfi_a_p1_ok]<br /><br /><a href=$PHP_SELF?mod=invite_registration>$lang[db_prev]</a>" );
}

/*======================================================
Выполнение страницы №2
========================================================*/
if(isset($_POST['edir_page2'])) {
if( $_REQUEST['user_hash'] == "" or $_REQUEST['user_hash'] != $dle_login_hash ) {
die( "Hacking attempt! User not found" );
}
$iu_name = $_POST['i_user_name'];
$is_f = $_POST['i_st_f'];
$in_if = intval( $_POST['i_num_i_f'] );
if($is_f=="" or $in_if=="" ) {
clear_cache();
msg( "info", $lang['opt_sysok'], "$lang[mod_rfi_a_error]<br /><br /><a href=$PHP_SELF?mod=invite_registration>$lang[db_prev]</a>" );
} else {
/*v.3.2*/
switch($_POST['edir_page2_where']) {

case "user":
if(!$iu_name) msg( "info", $lang['opt_sysok'], "$lang[mod_rfi_a_error]<br /><br /><a href=$PHP_SELF?mod=invite_registration>$lang[db_prev]</a>" );
$eu_invites = dituserinvite($is_f, $iu_name, $in_if);
$db->query( "UPDATE " . USERPREFIX . "_users SET invites='$eu_invites' WHERE name='$iu_name'" );
break;
case "group":
if(!$_POST['edir_page2_group']) msg( "info", $lang['opt_sysok'], "$lang[mod_rfi_a_error]<br /><br /><a href=$PHP_SELF?mod=invite_registration>$lang[db_prev]</a>" );
if($is_f=="i_add_i")
$db->query( "UPDATE " . USERPREFIX . "_users SET invites=invites+$in_if WHERE user_group='".intval($_POST['edir_page2_group'])."'" );
elseif($is_f=="i_tur_i")
$db->query( "UPDATE " . USERPREFIX . "_users SET invites=invites-$in_if WHERE user_group='".intval($_POST['edir_page2_group'])."'" );
break;
case "all":
if($is_f=="i_add_i")
$db->query( "UPDATE " . USERPREFIX . "_users SET invites=invites+$in_if" );
elseif($is_f=="i_tur_i")
$db->query( "UPDATE " . USERPREFIX . "_users SET invites=invites-$in_if" );
break;
}
/*---*/

clear_cache();
msg( "info", $lang['opt_sysok'], "$lang[mod_rfi_a_ok]. <br /><br /><a href=$PHP_SELF?mod=invite_registration>$lang[db_prev]</a>." );
}
}

/*======================================================
Выполнение страницы №3
========================================================*/
if(isset($_POST['edir_page3_del_invite'])) {
if( $_REQUEST['user_hash'] == "" or $_REQUEST['user_hash'] != $dle_login_hash ) {
die( "Hacking attempt! User not found" );
}
$invitedd = $_POST['invite_del'];
foreach ($invitedd as $val) {
$db->query( "DELETE FROM " . USERPREFIX . "_invite WHERE i_id = '$val'" );
}
clear_cache();
msg( "info", $lang['opt_sysok'], "$lang[mod_rfi_a_ok]. Выбранные вами инвайты успешно удалены.<br /><br /><a href=$PHP_SELF?mod=invite_registration>$lang[db_prev]</a>." );
}

/*======================================================
Выполнение страницы №4
========================================================*/
if(isset($_POST['edir_page4'])) {
if( $_REQUEST['user_hash'] == "" or $_REQUEST['user_hash'] != $dle_login_hash ) {
die( "Hacking attempt! User not found" );
}
$mulo = $_POST['p4_send_email'];
$db->query( "INSERT INTO " . PREFIX . "_invite (i_invite, i_email, i_author, i_status, i_date) values ('$gold_invite', '$mulo', '$member_id[name]', 'yes','".date("j.m.Y G:i")."')" );
$row['template'] = str_replace( "{%send_user%}", $member_id[name], $row['template'] );
$row['template'] = str_replace( "{%user_comment%}", $p4_send_mes, $row['template'] );
$row['template'] = str_replace( "{%sam_invite%}", $gold_invite, $row['template'] );
$row['template'] = str_replace( "{%home_url%}", $config[http_home_url], $row['template'] );
if($_POST[p4_send_email_ch]=="yes" and $mulo != "") {
$mail->send( $mulo, $c_invite['mail_subject'], $row['template'] );
}
clear_cache();
msg( "info", $lang['opt_sysok'], "$lang[mod_rfi_a_ok]. Инвайт успешно добавлен.<br /><br /><a href=$PHP_SELF?mod=invite_registration>$lang[db_prev]</a>. <br /><br /><a href={$PHP_SELF}?mod=invite_registration>{$lang_teaser_mod['back']}</a>" );
}

/*======================================================
Выполнение страницы №3. Список инвайтов.
========================================================*/

echo <<<JSCRIPT
<script language='JavaScript' type="text/javascript">
<!--
function ckeck_uncheck_all() {
var frm = document.delinvites;
for (var i=0;i<frm.elements.length;i++) {
var elmnt = frm.elements[i];
if (elmnt.type=='checkbox') {
if(frm.master_box.checked == true){ elmnt.checked=false; }
else{ elmnt.checked=true; }
}
}
if(frm.master_box.checked == true){ frm.master_box.checked = false; }
else{ frm.master_box.checked = true; }
}
-->
</script>
JSCRIPT;

if($_REQUEST['action'] == "list") {
clear_cache();
echo <<<HTML
<html>
<head>
<meta content="text/html; charset={$config['charset']}" http-equiv="content-type" />
<title>Список всех инвайтов.</title>
<style type="text/css">
html,body{
height:100%;
margin:0px;
padding: 0px;
background: #F4F3EE;
}
input,
select,
textarea {
outline:none;
}
form {
margin:0px;
padding: 0px;
}

table{
border:0px;
border-collapse:collapse;
}

table td{
padding:0px;
font-size: 11px;
font-family: verdana;
}

a:active,
a:visited,
a:link {
color: #4b719e;
text-decoration:none;
}

a:hover {
color: #4b719e;
text-decoration: underline;
}

.navigation {
color: #999898;
font-size: 11px;
font-family: tahoma;
}
.unterline {
background: url(engine/skins/images/line_bg.gif);


width: 100%;
height: 9px;
font-size: 3px;
font-family: tahoma;
margin-bottom: 4px;
}
.hr_line {
background: url(engine/skins/images/line.gif);
width: 100%;
height: 7px;
font-size: 3px;
font-family: tahoma;
margin-top: 4px;
margin-bottom: 4px;
}
.edit {
border:1px solid #9E9E9E;
color: #000000;
font-size: 11px;
font-family: Verdana; BACKGROUND-COLOR: #ffffff
}
.buttons {
background: #FFF;
border: 1px solid #9E9E9E;
color: #666666;
font-family: Verdana, Tahoma, helvetica, sans-serif;
padding: 0px;
vertical-align: absmiddle;
font-size: 11px;
height: 21px;
}
select {
color: #000000;
font-size: 11px;
font-family: Verdana;
border:1px solid #9E9E9E;
}

textarea {
border: #9E9E9E 1px solid;
color: #000000;
font-size: 11px;
font-family: Verdana;
background-color: #ffffff
}
#hintbox{ /*CSS for pop up hint box */
position:absolute;
top: 0;
background-color: lightyellow;
width: 150px; /*Default width of hint.*/
padding: 3px;
border:1px solid #787878;
font:normal 11px Verdana;
line-height:18px;
z-index:100;
border-right: 2px solid #787878;
border-bottom: 2px solid #787878;
visibility: hidden;
}

.xprofile textarea {
width: 100%; height:90px; font-family:verdana; font-size:11px; border:1px solid #9E9E9E;
}
.xprofile input {
width:250px; height:18px; font-family:verdana; font-size:11px; border:1px solid #9E9E9E;
}

.hintanchor{
padding-left: 8px;
}
.bk {
background:#fff url(engine/skins/images/shadow.png) repeat-x;
}
</style>
<!-- calendar stylesheet -->
<link rel="stylesheet" type="text/css" media="all" href="engine/skins/calendar-blue.css" title="win2k-cold-1" />

<!-- main calendar program -->
<script type="text/javascript" src="engine/skins/calendar.js"></script>
<script type="text/javascript" src="engine/skins/default.js"></script>
</head>
<body>

<table align="center" width="97%">
<tr>
<td width="4" height="16"><img src="engine/skins/images/tb_left.gif" width="4" height="16" border="0" /></td>
<td background="engine/skins/images/tb_top.gif"><img src="engine/skins/images/tb_top.gif" width="1" height="16" border="0" /></td>
<td width="4"><img src="engine/skins/images/tb_right.gif" width="3" height="16" border="0" /></td>
</tr>
<tr>
<td width="4" background="engine/skins/images/tb_lt.gif"><img src="engine/skins/images/tb_lt.gif" width="4" height="1" border="0" /></td>
<td valign="top" style="padding-top:8px; padding-left:8px; padding-right:8px;" bgcolor="#FFFFFF">
<form action="{$form_action}" method="post" name="delinvites">
<table width="100%">
<tr>
<td bgcolor="#EFEFEF" height="29" style="padding-left:10px;"><div class="navigation">Список всех инвайтов</div></td>
</tr>
</table>
<div class="unterline"></div>
HTML;

$query_count = "SELECT COUNT(*) as count FROM " . USERPREFIX . "_invite";
$result_count = $db->super_query( $query_count );
$all_count_invites = $result_count['count'];
$page_view_all_invites = "";
$invites_list = 0;

$page_view_all_invites .= '<table width=/"100%/">
<tr><td background="engine/skins/images/mline.gif" height=1 colspan=10></td></tr>
<tr>
<td width="17"><b>'.$lang['mod_rfi_a_p3_iid'].'</b></td>
<td width="140"><b>'.$lang['mod_rfi_a_p3_t1'].'</b></td>
<td width="2">&nbsp;</td>
<td width="100"><b>'.$lang['mod_rfi_a_p3_t2'].'</b></td>
<td width="2">&nbsp;</td>
<td width="100"><b>'.$lang['mod_rfi_a_p3_t3'].'</b></td>
<td width="2">&nbsp;</td>
<td width="80"><b>'.$lang['mod_rfi_a_p3_t4'].'</b></td>
<td width="90"><b>'.$lang['mod_rfi_a_p3_t6'].'</b></td>
<td width="5"><input type="checkbox" name="master_box" title="Выбрать все" onclick="javascript:ckeck_uncheck_all()"></td>
</tr>';

$page = intval( $_REQUEST['page'] );
if(!$page) { $page = 1; }
$invites_per_page = 5;
$start_from = ($page * $invites_per_page) - $invites_per_page;
$i = $start_from;

$db->query( "SELECT i_id, i_invite, i_email, i_author, i_status, i_date FROM " . USERPREFIX . "_invite ORDER BY i_id LIMIT {$start_from},{$invites_per_page}" );
while ( $row = $db->get_row() ) {
$invites_list++;
$page_view_all_invites .= '<tr><td background="engine/skins/images/mline.gif" height=1 colspan=10></td></tr>
<tr>
<td><b>'.$row['i_id'].'</b></td>
<td class="list"><i>'.$row['i_invite'].'</i></td>
<td class="list"> </td>
<td class="list">'.do_not_email($row['i_email']).' </td>
<td class="list"> </td>
<td class="list"><a href="'.$link_user.urlencode($row['i_author']).'" target="_blank">'.$row['i_author'].'</a></td>
<td class="list"></td>
<td class="list">'.row_i_status_func( $row['i_status'] ).'</td>
<td class="list">'.$row['i_date'].'</td>
<td class="list"><input name="invite_del[]" value="'.$row['i_id'].'" type="checkbox"></td>
</tr>';
}

$page_view_all_invites .= "<tr><td background=\"engine/skins/images/mline.gif\" height=\"1\" colspan=\"10\"></td></tr>
<tr>
<td height=1 colspan=9></td><td class=\"list\"><input class=\"bbcodes\" name=\"edir_page3_del_invite\" type=\"submit\" value=\"".$lang['mod_rfi_a_p3_t7']."\"><input type=\"hidden\" name=\"user_hash\" value=\"$dle_login_hash\" /></td>
</tr></table>";

// pagination
if( $all_count_invites > $invites_per_page ) {
$npp_nav .= "<p> [ Страницы: ";
$enpages_count = @ceil( $all_count_invites / $invites_per_page );
$enpages_start_from = 0;
$enpages = "";
for($j = 1; $j <= $enpages_count; $j ++) {
if( $page != $j ) {
$enpages .= "<a href=\"".$invite_list_click."&action=list&page=$j\">$j</a> ";
} else {
$enpages .= "<span class=navigation> $j </span>";
}
$enpages_start_from += $invites_per_page;
}
$npp_nav .= $enpages;
$npp_nav .= " ] По <b>".$invites_per_page."</b> на страницу</p> ";
}
// pagination

$page_view_all_invites .= $npp_nav;

if( intval( $invites_list) >= 1) {
echo $page_view_all_invites;
} else {
echo '<p>'.$lang['mod_rfi_a_p3_noinvites'].'</p>';
}
echo <<<HTML
</form>
</td>
<td width="4" background="engine/skins/images/tb_rt.gif"><img src="engine/skins/images/tb_rt.gif" width="4" height="1" border="0" /></td>
</tr>
<tr>
<td height="16" background="engine/skins/images/tb_lb.gif"></td>
<td background="engine/skins/images/tb_tb.gif"></td>
<td background="engine/skins/images/tb_rb.gif"></td>
</tr>
</table>
</body>

</html>
HTML;
} else {

//admin

$mod_on_view = makeDropDown(array ("1" => "Вкл", "2" => "Выкл" ), "save_con[mod_of_status]", "{$c_invite['mod_of_status']}");
$mod_sm_view = makeDropDown(array ("1" => "Вкл", "2" => "Выкл" ), "save_con[user_s_s_m]", "{$c_invite['user_s_s_m']}");;
$mod_efs_view = makeDropDown(array ("1" => "Да", "2" => "Нет" ), "save_con[email_for_send]", "{$c_invite['email_for_send']}");;
$mod_p3_view_answers = makeDropDown(array ("yes" => "Активные", "no" => "Не активные", "all" => "Все" ), "save_con[p3_view_answers]", "{$c_invite['p3_view_answers']}");;

//editforgroup
$grouplist = "";
$db->query( "SELECT id, group_name FROM " . USERPREFIX . "_usergroups ORDER BY id" );
while ( $rowu = $db->get_row() ) {
$grouplist .= '<option value="'.$rowu['id'].'">'.$rowu['group_name'].'</option>';
}

echoheader( "", "" );
echo <<<HTML
<script type="text/javascript">
$(function(){

$('#usersearch').click(function() {

$('#main_box').html('Идёт поиск..');
var dbsearchuser = $('#dbsearchuser').val();
$.post("engine/inc/invite.admin.functions.php?action=searchuser", { dbsearchuser: dbsearchuser } , function( data ){
$('#main_box').html(data);
});
return false;
});

});
</script>

<script type="text/javascript" src="engine/ajax/dle_ajax.js"></script>
<script type="text/javascript" src="engine/ajax/menu.js"></script>
<script language="javascript" type="text/javascript">
<!--
function MenuBuild( m_id ){

var menu=new Array()

menu[0]='<a href="?mod=usergroup&action=edit&id=' + m_id + '" >{$lang['group_sel1']}</a>';
if (m_id > 5) {
menu[1]='<a href="?mod=usergroup&action=del&user_hash={$dle_login_hash}&id=' + m_id + '" >{$lang['group_sel2']}</a>';
}
else {
menu[1]='<a href="#" onclick="return false;"><font color="black">{$lang['group_sel3']}</font></a>';
}

return menu;
}
function whereeditinvites() {
var type = document.getElementById('edir_page2_where').value;
if(type=="user") {
document.getElementById('wheretype_user').style.display = 'block';
document.getElementById('wheretype_user_field').style.display = 'block';
document.getElementById('wheretype_group').style.display = 'none';
document.getElementById('wheretype_group_field').style.display = 'none';
document.getElementById('wheretype_all').style.display = 'none';
} else {
if(type=="group") {
document.getElementById('wheretype_user').style.display = 'none';
document.getElementById('wheretype_user_field').style.display = 'none';
document.getElementById('wheretype_group').style.display = 'block';
document.getElementById('wheretype_group_field').style.display = 'block';
document.getElementById('wheretype_all').style.display = 'none';
} else {
document.getElementById('wheretype_user').style.display = 'none';
document.getElementById('wheretype_user_field').style.display = 'none';
document.getElementById('wheretype_group').style.display = 'none';
document.getElementById('wheretype_group_field').style.display = 'none';
document.getElementById('wheretype_all').style.display = 'block';
}
}
}
//-->
</script>
<style type="text/css">
FIELDSET {
width: 400px;
}
</style>
<script type="text/javascript" src="engine/skins/tabs.js"></script>
<form action="{$form_action}" method="post" name="delinvites">
<div style="padding-top:5px;padding-bottom:2px;">
<table width="100%">
<tr>
<td width="4"><img src="engine/skins/images/tl_lo.gif" width="4" height="4" border="0"></td>
<td background="engine/skins/images/tl_oo.gif"><img src="engine/skins/images/tl_oo.gif" width="1" height="4" border="0"></td>
<td width="6"><img src="engine/skins/images/tl_ro.gif" width="6" height="4" border="0"></td>
</tr>
<tr>
<td background="engine/skins/images/tl_lb.gif"><img src="engine/skins/images/tl_lb.gif" width="4" height="1" border="0"></td>
<td style="padding:5px;" bgcolor="#FFFFFF">
<table width="100%">
<tr>
<td bgcolor="#EFEFEF" height="29" style="padding-left:10px;"><div class="navigation">Модуль - Регистрация по инвайтам. v.<a href="http://www.kevagroup.ru/do/dle_development/registration_for_invite/" target="_blank">{$c_invite['version']}</a></div></td>
<td bgcolor="#EFEFEF" height="29" style="padding-right:10px;"></td>
</tr>
</table>
<div class="unterline"></div>

<div id="dle_tabView1">

<div class="dle_aTab" style="display:none;">
<table width="100%">
<tr>
<td style="padding:4px;" class="option"><b>{$lang['mod_rfi_a_p1_med']}</b><br /><span class="small">{$lang['mod_rfi_a_p1_med_t']}</span><input type=hidden name=action value=dosavesyscon><input type="hidden" name="user_hash" value="$dle_login_hash" /></td>
<td width="480" style="padding-top:2px;padding-bottom:2px;">{$mod_on_view}</td>
</tr>
<tr><td background="engine/skins/images/mline.gif" height=1 colspan=2></td></tr>
<tr>
<td style="padding:4px;" class="option"><b>{$lang['mod_rfi_a_p1_ian']}</b><br /><span class="small">{$lang['mod_rfi_a_p1_ian_t']}</span></td>
<td width="480" style="padding-top:2px;padding-bottom:2px;"><input class="edit" type="text" size="15" name="save_con[user_iu_diu_num]" value="{$c_invite['user_iu_diu_num']}"></td>
</tr>
</tr>
<tr><td background="engine/skins/images/mline.gif" height=1 colspan=2></td></tr>
<tr>
<td style="padding:4px;" class="option"><b>{$lang['mod_rfi_a_p1_se']}</b><br /><span class="small">{$lang['mod_rfi_a_p1_se_t']}</span></td>
<td width="480" style="padding-top:2px;padding-bottom:2px;"><input class="edit" type="text" size="45" name="save_con[mail_subject]" value="{$c_invite['mail_subject']}"></td>
</tr>
<tr><td background="engine/skins/images/mline.gif" height=1 colspan=2></td></tr>
<tr>
<td style="padding:4px;" class="option"><b>{$lang['mod_rfi_a_p1_me']}</b><br /><span class="small">{$lang['mod_rfi_a_p1_me_t']}</span><br>{$lang['mod_rfi_a_p1_me_t_info']}</td>
<td style="padding-top:2px;padding-bottom:2px;"><textarea rows="8" name="edit_mail_template" cols="65">{$row['template']}</textarea></td>
</tr>
<tr><td background="engine/skins/images/mline.gif" height=1 colspan=2></td></tr>
<tr>
<td style="padding:4px;" class="option"><b>{$lang['mod_rfi_a_p1_sue']}</b><br /><span class="small">{$lang['mod_rfi_a_p1_sue_t']}</span></td>
<td style="padding-top:2px;padding-bottom:2px;">{$mod_sm_view}</td>
</tr>
<tr><td background="engine/skins/images/mline.gif" height=1 colspan=2></td></tr>
<tr>
<td style="padding:4px;" class="option"><b>{$lang['mod_rfi_a_p1_efs_view']}</b><br /><span class="small">{$lang['mod_rfi_a_p1_efs_view_t']}</span></td>
<td style="padding-top:2px;padding-bottom:2px;">{$mod_efs_view}</td>
</tr>
<tr><td background="engine/skins/images/mline.gif" height=1 colspan=2></td></tr>
<tr>
<td style="padding:4px;" class="option"></td>
<td style="padding-top:2px;padding-bottom:2px;"><input class="bbcodes" name="edir_page1" type="submit" value="{$lang['mod_rfi_a_p1_save']}"></td>
</tr>
</table>
</div>

<!--news area-->
<div class="dle_aTab" style="display:none;">
<table width="100%">
<tr>
<td style="padding:4px;" class="option"><b>Над чем будем работать: </b><br /><span class="small">У кого(чего) необходимо изменить количетво инвайтов.</span></td>
<td width="480" style="padding-top:2px;padding-bottom:2px;"><select onClick="whereeditinvites()" name="edir_page2_where" id="edir_page2_where"><option value='user'>Пользователь</option><option value='group'>Группа</option><option value='all'>Все</option></select></td>
</tr>
<tr><td background="engine/skins/images/mline.gif" height=1 colspan=2></td></tr>
<tr>
<td style="padding:4px;" class="option">
<div id="wheretype_user" style="display:block"><b>{$lang[user_se]}:</b><br /><span class="small">{$lang[mod_rfi_a_p2_search_info]}</span></div>
<div id="wheretype_group" style="display:none"><b>Выберите группу:</b><br /><span class="small">Выберите группу, для пользователей которых вы хотите изменить количество инвайтов</span></div>
<div id="wheretype_all" style="display:none"><b>Для всех.</b><br /><span class="small">Вы можете мгновенно лишить всех ваших пользователей инвайтов. А можете и наоборорт.</span></div>
</td>
<td style="padding-top:2px;padding-bottom:2px;">
<label id="wheretype_user_field" style="display:block"><p><input id="dbsearchuser" class="edit" type="text" size="15" name="dbsearchuser"> <input id="usersearch" name="usersearch" class="edit" style="width:150px;" type="button" value="Найти"></p><div id="main_box"></div></label>
<label id="wheretype_group_field" style="display:none"><select name="edir_page2_group" id="edir_page2_where">{$grouplist}</select></label>
</td>
</tr>
<tr><td background="engine/skins/images/mline.gif" height=1 colspan=2></td></tr>
<tr>
<td style="padding:4px;" class="option"><b>{$lang['mod_rfi_a_p2_do']}</b><br /><span class="small">{$lang['mod_rfi_a_p2_sti']}</span></td>
<td style="padding-top:2px;padding-bottom:2px;">
<select class="edit" name="i_st_f">
<option value="i_add_i">{$lang['mod_rfi_a_p2_sti_1']}</option>
<option value="i_tur_i">{$lang['mod_rfi_a_p2_sti_2']}</option>
</select>
</td>
</tr>
<tr><td background="engine/skins/images/mline.gif" height=1 colspan=2></td></tr>
<tr>
<tr>
<td style="padding:4px;" class="option"><b>{$lang['mod_rfi_a_p2_dvi']}</b><br /><span class="small">{$lang['mod_rfi_a_p2_dvi_t']}</span></td>
<td style="padding-top:2px;padding-bottom:2px;"><input class="edit" type="text" size="15" name="i_num_i_f"></td>
</tr>
<tr><td background="engine/skins/images/mline.gif" height=1 colspan=2></td></tr>
<tr>
<td style="padding:4px;" class="option"></td>
<td style="padding-top:2px;padding-bottom:2px;"><input class="bbcodes" name="edir_page2" type="submit" value="{$lang['mod_rfi_a_p1_save']}"></td>
</tr>
</table>
</div>
<!--comments area-->
<div class="dle_aTab" style="display:none;">


<table width="100%">
<tr>
<td width="50%" align="center">
<fieldset><legend>Показывать инвайты: </legend>Последние <input class="edit" type="text" size="5" name="save_con[mod_p3_view_answers_limit]" value="{$c_invite['mod_p3_view_answers_limit']}">, статус: {$mod_p3_view_answers}
<input class="bbcodes" name="edir_page1" type="submit" value="{$lang['mod_rfi_a_p1_save']}"></fieldset>
</td>
<td width="50%" align="center">[<a href="{$invite_list_click}" target="_blank">Просмотреть весь список инвайтов</a>]</td>
</tr>
</table>
<br>

<table width="100%">
HTML;

$echo_ip4 .= '<tr><td background="engine/skins/images/mline.gif" height=1 colspan=10></td></tr>
<tr>
<th width="17"><b>'.$lang['mod_rfi_a_p3_iid'].'</b></th>
<td width="140"><b>'.$lang['mod_rfi_a_p3_t1'].'</b></td>
<td width="2">&nbsp;</td>
<td width="100"><b>'.$lang['mod_rfi_a_p3_t2'].'</b></td>
<td width="2">&nbsp;</td>
<td width="100"><b>'.$lang['mod_rfi_a_p3_t3'].'</b></td>
<td width="2">&nbsp;</td>
<td width="80"><b>'.$lang['mod_rfi_a_p3_t4'].'</b></td>
<td width="90"><b>'.$lang['mod_rfi_a_p3_t6'].'</b></td>
<td width="5"><input type="checkbox" name="master_box" title="Выбрать все" onclick="javascript:ckeck_uncheck_all()"></td>
</tr>';
$ip4 = 0;
// ------ Запрос к базе
$db->query( "SELECT i_id, i_invite, i_email, i_author, i_status, i_date FROM " . USERPREFIX . "_invite ".view_answers($c_invite['p3_view_answers'])." ORDER BY i_id desc limit ".$c_invite['mod_p3_view_answers_limit'] );
while ( $row = $db->get_row() )
{
$ip4++;
$echo_ip4 .= '<tr><td background="engine/skins/images/mline.gif" height=1 colspan=11></td></tr>
<tr>
<th><b>'.$row['i_id'].'</b></th>
<td class="list"><i>'.$row['i_invite'].'</i></td>
<td class="list"> </td>
<td class="list">'.do_not_email($row['i_email']).' </td>
<td class="list"> </td>
<td class="list"><a href="'.$link_user.urlencode($row['i_author']).'" target="_blank">'.$row['i_author'].'</a></td>
<td class="list"></td>
<td class="list">'.row_i_status_func( $row['i_status'] ).'</td>
<td class="list">'.$row['i_date'].'</td>
<td class="list"><input name="invite_del[]" value="'.$row['i_id'].'" type="checkbox"></td>
</tr>';
}
if($ip4<="0") {
echo "<tr><td><p>{$lang['mod_rfi_a_p3_noinvites']}</p></td></tr>
<tr><td background=\"engine/skins/images/mline.gif\" height=1 colspan=11></td></tr>";
} else {
echo $echo_ip4."<tr><td background=\"engine/skins/images/mline.gif\" height=\"1\" colspan=\"10\"></td></tr>
<tr>
<td height=1 colspan=9></td><td class=\"list\"><input class=\"bbcodes\" name=\"edir_page3_del_invite\" type=\"submit\" value=\"".$lang['mod_rfi_a_p3_t7']."\"></td>
</tr>";
}

echo <<<HTML
</table>

</div>

<!--add gold invite-->
<div class="dle_aTab" style="display:none;">
<table width="100%">
<tr>
<td style="padding:4px;" class="option"><b>{$lang['mod_rfi_a_p3_t2']}</b><br /><span class="small">{$lang['mod_rfi_a_p4_sie_t']}</span></td>
<td width="500" style="padding-top:2px;padding-bottom:2px;"><input class="edit" type="text" size="35" name="p4_send_email"></td>
</tr>
<tr><td background="engine/skins/images/mline.gif" height=1 colspan=2></td></tr>
<tr>
<td style="padding:4px;" class="option"><b>{$lang['mod_rfi_a_p4_sie_y']}</b><br /><span class="small">{$lang['mod_rfi_a_p4_sie_y_t']}</span></td>
<td style="padding-top:2px;padding-bottom:2px;"><input type="checkbox" name="p4_send_email_ch" value="yes"></td>
</tr>
<tr><td background="engine/skins/images/mline.gif" height=1 colspan=2></td></tr>
<tr>
<td style="padding:4px;" class="option"><b>{$lang['mod_rfi_a_p4_sim']}</b><br /><span class="small">{$lang['mod_rfi_a_p4_sim_t']}</span></td>
<td style="padding-top:2px;padding-bottom:2px;"><textarea rows="6" name="p4_send_mes" cols="85"></textarea></td>
</tr>
</tr>
<tr><td background="engine/skins/images/mline.gif" height=1 colspan=2></td></tr>
<tr>
<td style="padding:4px;" class="option"></td>
<td style="padding-top:2px;padding-bottom:2px;"><input class="bbcodes" name="edir_page4" type="submit" value="{$lang['mod_rfi_a_p4_send']}"></td>
</tr>
</table>
</div>

</td>
<td background="engine/skins/images/tl_rb.gif"><img src="engine/skins/images/tl_rb.gif" width="6" height="1" border="0"></td>
</tr>
<tr>
<td><img src="engine/skins/images/tl_lu.gif" width="4" height="6" border="0"></td>
<td background="engine/skins/images/tl_ub.gif"><img src="engine/skins/images/tl_ub.gif" width="1" height="6" border="0"></td>
<td><img src="engine/skins/images/tl_ru.gif" width="6" height="6" border="0"></td>
</tr>

</form>
</div>
<script type="text/javascript">
initTabs('dle_tabView1',Array('$lang[mod_rfi_a_m1]', '$lang[mod_rfi_a_m2]', '$lang[mod_rfi_a_m3]', '$lang[mod_rfi_a_m4]'),0, '100%');
</script>
HTML;
echofooter();

}
?>
Создаем файл: engine\modules\invite.php
С таким содержымым:
<?php
/*
=====================================================
Registration for Invite v3.2
-----------------------------------------------------
 http://www.svobodnui.blogspot.com/
-----------------------------------------------------
Данный код защищен авторскими правами
=====================================================
*/
if( ! defined( 'DATALIFEENGINE' ) ) {
die( "Hacking attempt!" );
}

require_once(ENGINE_DIR.'/data/config.php');
require_once ENGINE_DIR . '/classes/parse.class.php';

require_once(ENGINE_DIR.'/data/config.invite.php');
require_once(ENGINE_DIR.'/modules/invite.functions.php');

$parse = new ParseFilter( );

$mod_answer = FALSE;

$tpl->load_template('invite.tpl');

//тест доступ
if( ! $is_logged) {
msgbox( $lang['all_err_1'], $lang['fav_error'] );
$tpl->clear();

} elseif( $c_invite['mod_of_status']=="2") {
msgbox( $lang['all_err_1'], $lang['mod_rfi_modoff'] );
$tpl->clear();


//доступ разрешёт
} else {

//обязательно ли указывать email
if($c_invite['email_for_send'] == "1") {
$tpl->set('{email_for_send}', $lang[mod_rfi_email_for_send_1] );
} else {
$tpl->set('{email_for_send}', $lang[mod_rfi_email_for_send_2] );
}

$number_of = $member_id['invites'];

//новый инвайт
if(isset($_POST['new_invite'])) {

$p_email = str_replace("`","",$_POST['i_email']);
$not_allow_symbol = array ("\x22", "\x60", "\t", '\n', '\r', "\n", "\r", '\\', ",", "/", "¬", "#", ";", ":", "~", "[", "]", "{", "}", ")", "(", "*", "^", "%", "$", "<", ">", "?", "!", '"', "'" );
$p_email = $db->safesql(trim( str_replace( $not_allow_symbol, '', strip_tags( stripslashes($p_email ) ) ) ) );
if( empty( $p_email ) OR strlen( $p_email ) > 50 OR @count(explode("@", $p_email)) != 2) $p_email = "";
$form_mail_mes_user = $db->safesql( $parse->process( htmlspecialchars( trim( $_POST['form_mail_mes_user'] ) ) ) );

$number_of = $member_id['invites'];

if($number_of >= '1' and test_email($p_email) and search_useremail($p_email)) {
$db->query( "INSERT INTO " . PREFIX . "_invite (i_invite, i_email, i_author, i_status, i_date) values ('$new_gen_invite','$p_email', '$member_id[name]', 'yes', '".date("j.m.Y G:i")."')" );
$db->query( "UPDATE " . PREFIX . "_users SET invites=invites-1 WHERE name='$member_id[name]'" );
$number_of = $member_id['invites']-1;
msgbox( $lang['all_info'], "Инвайт добавлен." );
$tpl->clear();
} elseif($number_of <= '0') {
msgbox( $lang['all_err_1'], "У вас нет инвайтов." );
$tpl->clear();
} elseif(!test_email( $p_email )) {
msgbox( $lang['all_err_1'], "Заполните поле email." );
} elseif(!search_useremail($p_email)) {
msgbox( $lang['all_err_1'], "Пользователь с таким email адресом уже зарегистрирован." );
}

//инвайт на email
if($_POST['send_to_email']=='1' and $p_email != "" ) {
include_once ENGINE_DIR . '/classes/mail.class.php';
$mail = new dle_mail( $config );

$row = $db->super_query( "SELECT template FROM " . PREFIX . "_email where name='new_invite' LIMIT 0,1" );
$row['template'] = stripslashes( $row['template'] );
$row['template'] = str_replace( "{%send_user%}", $member_id['name'], $row['template'] );

if($form_mail_mes_user == "") {
$user_message = $lang[mod_rfi_se_no_mess];
} else {
$user_message = $form_mail_mes_user;
}

$row['template'] = str_replace( "{%user_comment%}", $user_message, $row['template'] );
$row['template'] = str_replace( "{%sam_invite%}", $new_gen_invite, $row['template'] );
$row['template'] = str_replace( "{%home_url%}", $config[http_home_url], $row['template'] );
$row['template'] = str_replace( '\n', "", $row['template'] );
$row['template'] = str_replace( '\r', "", $row['template'] );
$row['template'] = stripslashes( stripslashes( $row['template'] ) );
$row['template'] = str_replace( "<br />", "\n", $row['template'] );
$row['template'] = strip_tags( $row['template'] );
$mail->send( $p_email, $c_invite['mail_subject'], $row['template'] );
}
}


//удаление инвайта
if(isset($_POST['del_invite'])) {
$id_parse = intval( $_POST['id_invite'] );

$sql_result = $db->query( "SELECT * FROM " . USERPREFIX . "_invite where i_id='$id_parse' && i_author='$member_id[name]'" );
$row = $db->get_row( $sql_result );

if($row['i_id']) {
$db->query( "DELETE FROM " . USERPREFIX . "_invite WHERE i_id='$id_parse' && i_author='$member_id[name]'" );
$db->query( "UPDATE " . PREFIX . "_users SET invites=invites+1 WHERE name='$member_id[name]'" ); $number_of = $member_id['invites']+1;
$db->free();
msgbox( $lang['all_info'], "Инвайт удалён." );
$tpl->clear();
}
}


//первый заход в кабинет
if($number_of=="") {
$db->query( "UPDATE " . PREFIX . "_users SET invites='".$c_invite['user_iu_diu_num']."' WHERE name='$member_id[name]'" );
$tpl->set('{invite_user}', $c_invite['user_iu_diu_num']);
$number_of = $c_invite['user_iu_diu_num'];
} else {
$tpl->set('{invite_user}', $number_of);

}

//проверка кол инвайтов
if($number_of >= '1') {
$tpl->set('[form_new_invite]', '<form method="post" name="add_invite" action="'.$link_invites.'">');
$tpl->set('[/form_new_invite]', '</form>');
} else {
$tpl->set_block( "'\\[form_new_invite\\].*?\\[/form_new_invite\\]'si", $lang[no_invites] );
}

//вывод формы email mess
if($c_invite['user_s_s_m']=='1') {
$tpl->set('[invite_to_mail]', '');
$tpl->set('[/invite_to_mail]', '');
} else {
$tpl->set_block( "'\\[invite_to_mail\\].*?\\[/invite_to_mail\\]'si", '' );
}

$tpl->set('{title_invite}', $lang[mod_rfi_cabinet_title]."-".$c_invite['version'] );
$tpl->set('{invites_list}', not_activated_Invite( $member_id[name] ) );
$tpl->set('{users_list}', all_invited_users( $member_id[name] ) );

} //доступ разрешёт end

$db->free();

$tpl->compile('content');
$tpl->clear();
?>
Создаем файл: engine\modules\invite.functions.php
С таким содержымым:
<?php
/*
=====================================================
Registration for Invite v3.2
-----------------------------------------------------
http://www.kevagroup.ru/
-----------------------------------------------------
Данный код защищен авторскими правами
=====================================================
*/

if( ! defined( 'DATALIFEENGINE' ) ) {
die( "Hacking attempt!" );
}

if( $config['allow_alt_url'] == "yes" ) {
$link_invites = $config['http_home_url'] . "invites.html";
$link_user_profile = $config['http_home_url'] . "user/";
} else {
$link_invites = $PHP_SELF . "?do=invite";
$link_user_profile = $PHP_SELF . "?subaction=userinfo&user=";
}

$lang_mod = array(
'mod_rfi_notlogged' => "Необходима авторизация",
'mod_rfi_modoff' => "Модуль отключён",
'mod_rfi_f_invited_users' => "Приглашён пользователем ",
'mod_rfi_noinfo' => "Нет информации для отображения",
'mod_rfi_cancel' => "Отменить",
'mod_rfi_invite' => "Инвайт",
'mod_rfi_email' => "E-mail",
'mod_rfi_create' => "Создано",
'mod_rfi_f_nai' => "Ваших неактивированный инвайтов нет",
'mod_rfi_se_no_mess' => "Пользователь не оставил вам комментария",
'mod_rfi_cabinet_no_invites' => "У вас не осталось инвайтов",
'mod_rfi_cabinet_title' => "Инвайты - Личный кабинет",
'mod_rfi_email_for_send_1' => "Указание email обязательно!",
'mod_rfi_email_for_send_2' => "Указание email не обязательно.",
);

$lang = array_merge($lang,$lang_mod);


//генерация инвайтов
function generateInvite($length = 8){
$chars = 'abdefhiknrstyzABDEFGHKNQRSTYZ23456789';
$numChars = strlen($chars);
$string = '';
for ($i = 0; $i < $length; $i++) {
$string .= substr($chars, rand(1, $numChars) - 1, 1);
}
return $string;
}

$new_gen_invite = generateInvite(8).'-'.generateInvite(8).'-'.generateInvite(8);

//проверка email
function test_email($email) {
global $c_invite;
$answer = FALSE;
if($c_invite['email_for_send'] == "1") {
if ( $email != "") {
$answer = TRUE;
}
} else {
$answer = TRUE;
}
return $answer;
}

function search_useremail($email) {
global $db;
$answer = true;
if($email) {
$row = $db->super_query( "SELECT COUNT(*) as count FROM " . USERPREFIX . "_users WHERE email = '$email'" );
if( $row['count'] ) $answer = false;
}
return $answer;
}

function do_not_email($email) {
if(!$email) {
$answer = "<i>Не указан</i>";
} else {
$answer = $email;
}
return $answer;
}


//отнимаем 1 приглашение
function sendinvite($my_invites) {
$my_invite_num = intval($my_invites);
$upd_isxodno = $my_invite_num - 1;
return $upd_isxodno;
}

//как ты сюда попал
function invited_users( $row_name ) {
global $config, $db, $lang, $link_user_profile;
$sql_result = $db->query( "SELECT * FROM " . USERPREFIX . "_invite where i_status ='no|$row_name'" );
$row = $db->get_row( $sql_result );
if($row) {
$mod_invited_users = $lang['mod_rfi_f_invited_users'].'<a href="'.$link_user_profile.urlencode($row['i_author']).'" target="_blank">'.$row['i_author'].'</a>';
} else {
$mod_invited_users = '';
}
$db->free();
return $mod_invited_users;
}

//кого ты сюда привёл
function all_invited_users( $row_user_name ) {
global $config, $db, $lang, $link_user_profile;
$sql = "SELECT i_id, i_invite, i_email, i_author, i_status, i_date FROM " . USERPREFIX . "_invite where i_author = '$row_user_name' AND i_status != 'yes' order by i_id desc";

$db->query( $sql );
$i = 0;

while ( $row1 = $db->get_row() ) {
$i ++;
$user = explode("|", $row1['i_status']);
if($i==1) {
$i_2_list .= '<a href="'.$link_user_profile.urlencode($user[1]).'">'.$user[1].'</a>';
} else {
$i_2_list .= ', <a href="'.$link_user_profile.$user[1].'">'.urlencode($user[1]).'</a>';
}
}

if( $i ) { return $i_2_list.'.'; } else { return $lang['mod_rfi_noinfo']; }
}

//сколько юзеров ты сюда привёл
function my_invited_users( $row_name ) {
global $config, $db;
$row = $db->super_query( "SELECT COUNT(*) as count FROM " . PREFIX . "_invite WHERE i_author='$row_name' and i_status!='yes'" );
$my_invited_users = $row['count'];
return $my_invited_users;
}

//список неактивированных инвайтов
function not_activated_Invite( $row_name ) {
global $config, $db, $link_invites, $lang;
$i_list .= <<<HTML
<table width="90%" align="center" border="0">
<tr><th>{$lang['mod_rfi_invite']}</th><th>{$lang['mod_rfi_email']}</th><th>{$lang['mod_rfi_create']}</th><th></th></tr>
HTML;
$sql = "SELECT i_id, i_invite, i_email, i_author, i_status, i_date FROM " . USERPREFIX . "_invite where i_author = '$row_name' AND
i_status = 'yes' order by i_id desc";
$db->query( $sql );
$i = 0;
while ( $row = $db->get_row() ) {
$i ++;
$th_email = do_not_email( $row[i_email] );
$i_list .= <<<HTML
<form method="post" name="del_invite" action="{$link_invites}">
<tr><input type="hidden" name="id_invite" value="{$row[i_id]}"><th>{$row[i_invite]}</th><th>{$th_email}</th><th>{$row[i_date]}</th><th>
<input class="button" type="submit" name="del_invite" value="{$lang['mod_rfi_cancel']}"></th></tr>
</form>
HTML;
}
$i_list .= '</table>';
if( $i ) {
$i_list_e = $i_list;
} else {
$i_list_e = $lang['mod_rfi_f_nai'];
}
return $i_list_e;
}

?>

После того как сделали выше указанные действия открываем файл:

/engine/modules/register.php 


Найти:
require_once ENGINE_DIR . '/classes/parse.class.php';

Ниже вставить:

/*Invites*/
require_once ENGINE_DIR . '/data/config.invite.php';

$register_for_invite = false;
if($c_invite['mod_of_status']=="1") {
$tpl->set('[invite_register]', '');
$tpl->set('[/invite_register]', '');
} else {
$tpl->set_block( "'\\[invite_register\\].*?\\[/invite_register\\]'si", '' );
}

/*-----*/


Найти:
function check_reg($name, $email, $password1, $password2, $sec_code = 1, $sec_code_session = 1) {

Заменить на:

function check_reg($name, $email, $password1, $password2, $sec_code = 1, $sec_code_session = 1, $invite = '') {



Найти:
global $lang, $db, $banned_info, $relates_word, $config;

Заменить на:

global $lang, $db, $banned_info, $relates_word, $config, $c_invite;



Найти:
if( $stop == "" ) {

Выше вставить:

/*Invite*/
if($c_invite['mod_of_status']=="1") {
if($invite == '') {
$stop .= "<li>Введите ваш инвайт!</li>";
} else {
$sql_result = $db->query( "SELECT * FROM " . USERPREFIX . "_invite where i_invite='$invite'" );
$get_invite_info = $db->get_row( $sql_result );

if(($get_invite_info['i_status'] != 'yes') or ($get_invite_info['i_email'] and ($get_invite_info['i_email'] != $email))) {
$stop .= "<li>Такая комбинация email'a и инвайта не существует!</li>";
}
}
}
/*---*/



Найти:
$email = $db->safesql(trim( str_replace( $not_allow_symbol, '', strip_tags( stripslashes( $_POST['email'] ) ) ) ) );

Ниже вставить:

$do_invite = $db->safesql( $parse->process( htmlspecialchars( trim( $_POST['user_invite'] ) ) ) );



Найти:
$reg_error = check_reg( $name, $email, $password1, $password2, $sec_code, $sec_code_session );

Заменить на:

$reg_error = check_reg( $name, $email, $password1, $password2, $sec_code, $sec_code_session, $do_invite );


Найти:
$idlink = rawurlencode( base64_encode( $name . "||" . $email . "||" . md5( $password1 ) . "||" . sha1( $name . $email . $stronghash . $config['key'] ) ) );

Заменить на:

$idlink = rawurlencode( base64_encode( $name . "||" . $email . "||" . md5( $password1 ) . "||" . sha1( $name . $email . $stronghash . $config['key'] ) ."||".$invite ) );


Найти:
$_REQUEST['id'] = rawurlencode( base64_encode( $name . "||" . $email . "||" . md5( $password1 ) . "||" . sha1( $name . $email . $stronghash . $config['key'] ) ) );

Заменить на:

$_REQUEST['id'] = rawurlencode( base64_encode( $name . "||" . $email . "||" . md5( $password1 ) . "||" . sha1( $name . $email . $stronghash . $config['key'] ) ."||".$do_invite ) );


Найти:
if( sha1( $name . $email . $stronghash . $config['key'] ) != $user_arr[3] ) die( 'ID not valid!' );

Ниже вставить:

$do_invite = trim( $db->safesql( htmlspecialchars( $parse->process( $user_arr[4] ) ) ) );


Найти:
$reg_error = check_reg( $name, $email, $regpassword, $regpassword );

Заменить на:

$reg_error = check_reg( $name, $email, $regpassword, $regpassword, 1, 1, $do_invite );


Найти:
if( intval( $config['reg_group'] ) < 3 ) $config['reg_group'] = 4;

Вставить ниже:

if($c_invite['mod_of_status']=="1") $db->query( "UPDATE " . PREFIX . "_invite SET i_status='no|$name' WHERE i_invite='$do_invite'" );
  Открываем .htacess 

После:
RewriteRule ^rules.html$ index.php?do=rules [L]

Вставляем:
RewriteRule ^invites.html$ index.php?do=invite [L]

4. Открываем /engine/engine.php

после:
case "register" :
include ENGINE_DIR . '/modules/register.php';
break;

Вставляем:
case "invite" :
include ENGINE_DIR.'/modules/invite.php';
break;

Для того что бы из личного кабинета можно было пройти в

панель управления инвайтами:

Открываем файл engine/init.php.

Ищем:
$tpl->set( '{newposts-link}', $config['http_home_url'] . "newposts/" );

Ниже добавляем:
$tpl->set( '{invites-link}', $config['http_home_url'] . "invites.html" );

Ищём:
$tpl->set( '{favorites-link}', $PHP_SELF . "?do=favorites" );

Ниже добавляем:
$tpl->set( '{invites-link}', $PHP_SELF . "?do=invite" );

Открываем файл engine/modules/profile.php

Ищем:
include_once ENGINE_DIR . '/classes/parse.class.php';

Ниже добавляем:
require_once(ENGINE_DIR.'/modules/invite.functions.php');

Ищём:
$tpl->set( '{usertitle}', stripslashes( $row['name'] ) );

Ниже добавляем:
$tpl->set( '{mod_invited_users}', invited_users( $row['name'] ) );
$tpl->set( '{mod_my_invited_users}', my_invited_users( $row['name'] ) );
$tpl->set( '{mod_all_my_invited_users}', all_invited_users( $row['name'] ) );

Далее: /engine/data/config.invite.php (CHMOD 777) - установить права на запись

После в корневом каталоге сайта создаем файл с именем install_mod.php c вот таким содержымым:

<?php
/*
=====================================================
Registration for Invite v3.2
-----------------------------------------------------
 http://www.svobodnui.blogspot.com/ 
-----------------------------------------------------
Данный код защищен авторскими правами
=====================================================
*/
header('Content-Type: text/html; charset=windows-1251');
error_reporting(E_ALL ^ E_NOTICE);
@ini_set('display_errors', true);
@ini_set('html_errors', false);
@ini_set('error_reporting', E_ALL ^ E_NOTICE);

define('DATALIFEENGINE', true);
define('ENGINE_DIR', 'engine');

$db_charset = "cp1251";
$db_collate = "cp1251_general_ci";

require_once ENGINE_DIR.'/data/config.php';

$click = $config['http_home_url'].'install_mod.php';

if ($config['version_id'] >= 8)
require_once ENGINE_DIR.'/inc/include/functions.inc.php';
elseif ($config['version_id'] < 8 AND $config['version_id'] >= 7)
require_once ENGINE_DIR.'/inc/functions.inc.php';

if ($config['version_id'] < "6.3")
require_once ENGINE_DIR.'/inc/mysql.php';
else
require_once ENGINE_DIR.'/classes/mysql.php';

require_once ENGINE_DIR.'/data/dbconfig.php';
?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ru" lang="ru">
<head>
<link rel='shortcut icon' href='http://www.kevagroup.ru/themes/img/f.png'>
<title>Установка модуля</title>
<style type="text/css" media="all">
body {
background: #fff; text-align: left; margin: 0px; padding: 0px;
font-family: tahoma, verdana, arial, sans-serif, Lucida Sans;
font-size: 11px;
}

#header {
background-color: #45719B;
color: #FFF;
margin: 0 auto;
padding: 0 11px;
width: 600px;
}

#content_head {
padding: 10px;
width: 600px;
margin: 0 auto;
border-bottom: 1px solid #C3CAD2;
border-left: 1px solid #959595;
border-right: 1px solid #959595;
text-align:left;
/*height: 50px;*/
}

.button {
border: 1px solid #B1B6CA;
background: #FDFDFD;
background: url(images/button.gif) top right;
font-size: 11px;
color: #000000;
font-family: verdana, sans-serif;
margin-top:2px;
}

hr {
border: 0;
border-bottom: 1px solid #DAE1E8;
color:#DAE1E8; height:1px;
}
#title {
font-weight: bold;
font-size: 20px;
padding: 8px 0 10px;
float: left;
color: #FFF;
}
a, span.link, span.linkover {
color: #2B587A;
text-decoration: none;
cursor: pointer;
}
</style>
<script type="text/javascript">
function agreeForm(f) {
if (f.agree.checked) f.submit.disabled = 0
else f.submit.disabled = 1
}
</script>

<br>
<div id="header">
<div id="title">Регистрация по инвайтам 3.2 - Установка</div>
<div style="clear:both;"></div>
</div>
<div id="content_head">
<?php
$new_invite_text = <<<HTML
Доброго времени суток, на будущий пользователь!

{%send_user%} решил пригласить Вас к нам.<br />
Его комментарий:
{%user_comment%}
Пригласительный код: {%sam_invite%}

---
{%home_url%}
HTML;

if(isset($_POST['submit'])) {
if($_POST['du_sql']!="i") {

//НАЧАЛО - устоновка таблиц в бд

$db->query("ALTER TABLE `" . PREFIX . "_users` ADD `invites` varchar( 6 ) NOT NULL;");

$db->query("INSERT INTO `" . PREFIX . "_email` (`name`, `template`) VALUES ('new_invite', '$new_invite_text')");

$db->query("DROP TABLE IF EXISTS " . PREFIX . "_invite");
$db->query("CREATE TABLE `" . PREFIX . "_invite` (
`i_id` int(11) NOT NULL auto_increment,
`i_invite` varchar(30) NOT NULL,
`i_email` varchar(100) NOT NULL,
`i_author` varchar(100) NOT NULL,
`i_status` varchar(100) NOT NULL,
`i_date` varchar(100) NOT NULL,
PRIMARY KEY (`i_id`)
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=cp1251");

$db->query("INSERT INTO " . PREFIX . "_admin_sections ( `name`, `title`, `descr`, `icon`, `allow_groups` ) VALUES ( 'invite_registration', 'Инвайты для регистрации', 'Управление модулем регистрации по инвайтам, контроль приглашений, создание золотых приглашений', 'invite_registration.png', '1' )");
//ВСЁ - устоновка таблиц в бд

echo '<b>Таблицы успешно созданы</b><br>';
} else {
echo "<table width=\"100%\" cellspacing=\"0\" cellpadding=\"4\"><tr>
<td align=\"right\" width=\"200\">Вы решили самостоятельно установить таблицы в БД. Выполните sql запрос, что справа, в панеле

управления своего MySQL:</td>
<td><textarea cols=\"40\" rows=\"6\">
CREATE TABLE IF NOT EXISTS `" . PREFIX . "_invite` (
`i_id` int(11) NOT NULL auto_increment,
`i_invite` varchar(30) NOT NULL,
`i_email` varchar(100) NOT NULL,
`i_author` varchar(100) NOT NULL,
`i_status` varchar(100) NOT NULL,
`i_gold` varchar(100) NOT NULL,
`i_date` varchar(100) NOT NULL,
PRIMARY KEY (`i_id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=117 ;

INSERT INTO `" . PREFIX . "_email` (`name`, `template`) VALUES ('new_invite', '$new_invite_text');

ALTER TABLE `" . PREFIX . "_users` ADD `invites` varchar( 6 ) NOT NULL;

INSERT INTO " . PREFIX . "_admin_sections ( `name`, `title`, `descr`, `icon`, `allow_groups` ) VALUES ( 'invite_registration', 'Инвайты для регистрации', 'Управление модулем регистрации по инвайтам, контроль приглашений, создание золотых приглашений', 'invite_registration.png', '1' );
</textarea></td>
</tr>
</table>";

}
echo '<table width="100%" cellspacing="0" cellpadding="4">
<tr>
<td></td>
<td>Для продолжения установки модуля откройте файл <b>/doc/install.html</b></td>
</tr>
<tr>
<td align="right" width="200"></td>
<td></td>
</tr>
</table>';
echo '</div>';
} else {
echo '<form action="'.$click.'" method="post">
<table width="100%" cellspacing="0" cellpadding="4">
<tr>
<td></td>
<td><b>Шаг №1</b></td>
</tr>
<tr>
<td align="right" width="200"></td>
<td><input type="checkbox" name="du_sql" value="i"> Я сам выполню sql запрос</td>
</tr>
<tr>
<td align="right" width="200">Соглашение:</td>
<td><textarea cols=\"50\" rows=\"6\" readonly>
После того как вы установили данный модуль обязательно удалите файл  install_mod.php во избежание повторной установки. 

Ну вот и все у меня все на сайте фурычит. Авторы данного модуля kevaGroup большущеее им спасибо)!