Так же в условия задачи необходимо было организовать подтверждение регистрации на сайте и форуме, поскольку игровые порталы наиболее уязвимы к спаму.
Собственно часть кода, который используется:
CODE:
<?php
class valualit_exbb {
public function file_serialize_read($filename){
if (!file_exists($filename)){
return array();
}
$fp = @fopen($filename,'r');
flock($fp, 1);
$filesize = filesize($filename);
$filesize = ($filesize ===0) ? 1:$filesize-8;
fseek($fp,8);
$str = fread($fp,$filesize);
flock($fp, 3);
fclose($fp);
return (!empty($str))?unserialize($str):array();
}
// Проверка существования пользователя по логину
public function user_exists($path_forum,$name){
$users = self::file_serialize_read(VALUALIT_ROOT_DIR.$path_forum."data/users.php");
foreach($users as $k=>$u){
if($u['n']==$name){
return true;
}
}
return false;
}
// Добавляем пользователя
public function user_add($login,$email,$passwd,$path_to_forum,$status='me',$title='Пользователь'){
$array=self::file_serialize_read(VALUALIT_ROOT_DIR.$path_to_forum."data/users.php");
$array[0]=true;
$array[]=array("n"=>strtolower(preg_replace("~\s*~isU","",$login)),"m"=>trim($email),"p"=>0);
unset($array[0]);
file_put_contents(VALUALIT_ROOT_DIR.$path_to_forum."data/users.php",'<?die;?>'.serialize($array));
$forum_id_user=max(array_keys($array));
$user_info=array(
"id"=>$forum_id_user,
"status"=>$status,
"name"=>iconv('utf-8', 'windows-1251',preg_replace("~\s*~isU","",$login)),
"pass"=>md5(iconv('utf-8', 'windows-1251', preg_replace("~\s*~isU","",$passwd))),
"mail"=>iconv('utf-8', 'windows-1251',trim($email)),
"posts"=>0,
"icq"=>"",
"title"=>iconv('utf-8', 'windows-1251',$title),
"ip"=>"127.0.0.1",
"showemail"=>FALSE,
"joined"=>time(),
"www"=>"",
"aim"=>"",
"location"=>"",
"interests"=>"",
"sig"=>"",
"sig_on"=>TRUE,
"lang"=>"russian",
"timedif"=>0,
"avatar"=>'noavatar.gif',
"upload"=>TRUE,
"visible"=>TRUE,
"new_pm"=>FALSE,
"sendnewpm"=>FALSE,
"posts2page"=>10,
"topics2page"=>15,
"last_visit"=>0);
file_put_contents(VALUALIT_ROOT_DIR.$path_to_forum."members/".$forum_id_user.".php",'<?die;?>'.serialize($user_info));
$forum_stats=self::file_serialize_read(VALUALIT_ROOT_DIR.$path_to_forum."data/boardstats.php");
$forum_stats['totalmembers']=0;
$forum_stats['totalmembers']=$forum_stats['totalmembers']+1;
$forum_stats['last_id']=$forum_id_user;
$forum_stats['lastreg']=iconv('utf-8', 'windows-1251',preg_replace("~\s*~isU","",$login));
file_put_contents(VALUALIT_ROOT_DIR.$path_to_forum."data/boardstats.php",'<?die;?>'.serialize($forum_stats));
}
}
class valualit_exbb {
public function file_serialize_read($filename){
if (!file_exists($filename)){
return array();
}
$fp = @fopen($filename,'r');
flock($fp, 1);
$filesize = filesize($filename);
$filesize = ($filesize ===0) ? 1:$filesize-8;
fseek($fp,8);
$str = fread($fp,$filesize);
flock($fp, 3);
fclose($fp);
return (!empty($str))?unserialize($str):array();
}
// Проверка существования пользователя по логину
public function user_exists($path_forum,$name){
$users = self::file_serialize_read(VALUALIT_ROOT_DIR.$path_forum."data/users.php");
foreach($users as $k=>$u){
if($u['n']==$name){
return true;
}
}
return false;
}
// Добавляем пользователя
public function user_add($login,$email,$passwd,$path_to_forum,$status='me',$title='Пользователь'){
$array=self::file_serialize_read(VALUALIT_ROOT_DIR.$path_to_forum."data/users.php");
$array[0]=true;
$array[]=array("n"=>strtolower(preg_replace("~\s*~isU","",$login)),"m"=>trim($email),"p"=>0);
unset($array[0]);
file_put_contents(VALUALIT_ROOT_DIR.$path_to_forum."data/users.php",'<?die;?>'.serialize($array));
$forum_id_user=max(array_keys($array));
$user_info=array(
"id"=>$forum_id_user,
"status"=>$status,
"name"=>iconv('utf-8', 'windows-1251',preg_replace("~\s*~isU","",$login)),
"pass"=>md5(iconv('utf-8', 'windows-1251', preg_replace("~\s*~isU","",$passwd))),
"mail"=>iconv('utf-8', 'windows-1251',trim($email)),
"posts"=>0,
"icq"=>"",
"title"=>iconv('utf-8', 'windows-1251',$title),
"ip"=>"127.0.0.1",
"showemail"=>FALSE,
"joined"=>time(),
"www"=>"",
"aim"=>"",
"location"=>"",
"interests"=>"",
"sig"=>"",
"sig_on"=>TRUE,
"lang"=>"russian",
"timedif"=>0,
"avatar"=>'noavatar.gif',
"upload"=>TRUE,
"visible"=>TRUE,
"new_pm"=>FALSE,
"sendnewpm"=>FALSE,
"posts2page"=>10,
"topics2page"=>15,
"last_visit"=>0);
file_put_contents(VALUALIT_ROOT_DIR.$path_to_forum."members/".$forum_id_user.".php",'<?die;?>'.serialize($user_info));
$forum_stats=self::file_serialize_read(VALUALIT_ROOT_DIR.$path_to_forum."data/boardstats.php");
$forum_stats['totalmembers']=0;
$forum_stats['totalmembers']=$forum_stats['totalmembers']+1;
$forum_stats['last_id']=$forum_id_user;
$forum_stats['lastreg']=iconv('utf-8', 'windows-1251',preg_replace("~\s*~isU","",$login));
file_put_contents(VALUALIT_ROOT_DIR.$path_to_forum."data/boardstats.php",'<?die;?>'.serialize($forum_stats));
}
}
Поскольку это создавалось для движка CMF Valualit, код содержит некоторые нюансы.
VALUALIT_ROOT_DIR - содержит полный путь к корню проекта.
file_serialize_read - метод практически в неизменном виде взят из движка ExBB
$path_forum - входящий параметр содержащий относительный путь к форуму от корня проекта.
user_exists - с помощью цикла перебирает data/users.php для проверки занятости логина на форуме.
user_add - метод добавления профиля пользователя на форум, а так же обновление статистики в data/boardstats.php
Проверяем существование пользователя:
CODE:
if(valualit_exbb::user_exists($path_to_forum,$login)==true){
// Аккаунт с таким Логином существует!
} else {
// Добавляем аккаунт
}
// Аккаунт с таким Логином существует!
} else {
// Добавляем аккаунт
}
По умолчанию статус пользователя при регистрации указывается block
CODE:
valualit_exbb::user_add($login,$email,$passwd,$path_to_forum,$status='banned',$title='Пользователь');
После подтверждения регистрации:
CODE:
$array=valualit_exbb::file_serialize_read(VALUALIT_ROOT_DIR.$path_to_forum."members/".$user_id.".php");
$array["status"]='me';
file_put_contents(VALUALIT_ROOT_DIR.$path_to_forum."members/".$user_id.".php",'<?die;?>'.serialize($array));
$array["status"]='me';
file_put_contents(VALUALIT_ROOT_DIR.$path_to_forum."members/".$user_id.".php",'<?die;?>'.serialize($array));