Написал в один из коллективных блогов, но видать там администратор будет долго еще проверять пост, решил сюда запостить.
Мне на своем проекте понадобилась одновременная регистрация пользователей на суб-проектах и на основном сайте.
структура в целом проекта такая:
site.ru - основной сайт на инстанте
subproect1.site.ru - субпроект №1
subproect2.site.ru - субпроект №2
subproect3.site.ru - субпроект №3
subproect4.site.ru - субпроект №4
При регистрации пользователей на любом из сайтов субпроекта, автоматически создается пользователь в InstantCMS на основном сайте site.ru
Для этого написан был универсальный мост.
Мост представляет из себя всего 1 файл bridge.php, который кладется в корень сайта с instantCMS и позволяет регистрировать пользователей любым сторонним скриптом.
Для этого нужно сделать POST запрос по адресу моста (site.ru/bridge.php). POST-запрос состоит всего из одного поля "regdata", в который должен быть упакован массив с информаций о регистрации, следующим способом:
base64_encode(serialize($data));
Где $data - это массив в формате:
array(
'login' => $login,
'pass' => $pass,
'email' => $email,
'sign' => $sign
);
$sign - это строка с секретным словом, своего рода подпись. Используется для защиты моста от злоумышленников.
Точно такое же значение следует присвоить переменной $sign в файле bridge.php
Значения остальных полей очевидны.
Скрипт моста может выдавать следующие ответы:
error1 - отсутствует $_POST['regdata'] в запросе,
error2 - распакованное содержимое $_POST['regdata'] не является массивом,
error3 - не совпадает секретное слово,
loginIsBusy - пользователь с таким логином уже существует,
error4 - ошибка при занесении пользователя в базу данных,
ok - регистрация прошла успешно.
код файла bridge.php :
CODE:
<?php
$sign = 'secret<#45t@ddSSdfaj5+q-_pass'; // Секретное слово
if(!isset($_POST['regdata'])) die('error1');
$data = @unserialize(base64_decode(trim($_POST['regdata'])));
if(!is_array($data)) die('error2');
if($data['sign'] != $sign) die('error3');
define('PATH', dirname(__FILE__));
define("VALID_CMS", 1);
include(PATH.'/core/cms.php');
$inCore = cmsCore::getInstance();
$inDB = cmsDatabase::getInstance();
$inCore->loadClass('user');
$inCore->loadClass('actions');
$login = $data['login'];
$pass = md5($data['pass']);
$nickname = $data['login'];
$email = $data['email'];
$icq = '';
$birthdate = '1980-01-01';
$sql = "SELECT id, login FROM cms_users WHERE login LIKE '$login' AND (is_deleted = 0)";
$result = $inDB->query($sql) ;
if($inDB->num_rows($result)!=0) die('loginIsBusy');
$sql = "INSERT INTO cms_users (group_id, login, nickname, password, email, icq, regdate, logdate, birthdate, is_locked, is_logged_once, invited_by)
VALUES ('1', '$login', '$nickname', '$pass', '$email', '$icq', NOW(), NOW(), '$birthdate', '0', 0, '0')";
$inDB->query($sql) ;
$new_user_id = dbLastId('cms_users');
//create advanced user profile
if ($new_user_id){
$sql = "INSERT INTO cms_user_profiles (user_id, city, description, showmail, showbirth, showicq, karma, imageurl, allow_who)
VALUES (".$new_user_id.", '', '', '0', '0', '1', '0', '', 'all')";
$inDB->query($sql) ;
$user_array['id'] = $new_user_id;
}
else{
die('error4');
}
// Регистрируем событие
cmsActions::log('add_user', array(
'object' => '',
'user_id' => $new_user_id,
'object_url' => '',
'object_id' => $new_user_id,
'target' => '',
'target_url' => '',
'target_id' => 0,
'description' => ''
));
die('ok');
?>
Совместной регистрации не делали, также как автоматическая регистрация с конкретными движками. У нас на субпроектах просто сайты не на распространенных движках, поэтому не ставилось такой задачи.
Если желаете развития идеи, то пишите свои пожелания, будем реализовывать.