Быстрый лёгкий надёжный форумный движок
Вы не вошли.
Нужно реализовать следующее:
1. Перенести 1 раздел форума на другой форум
1.1. Перенести всю базу пользователей и сделать интегрированную регистрацию. Пользователь зарегистрированный на форуме1 должен автоматически становиться зарегистрирован и авторизован на форуме 2.
2. Перенести один раздел форума1 на форум2 и закрыть раздел на форуме1, сделав так что при обращении к нему пользователь перебрасывается на форум2.
Объясняю зачем нужен пункт 2. Допустим у меня есть форум о растениеводстве. Одна из веток форума называется "все о морковке". Я хочу сделать отдельный форум посвященный морковке, но я понимаю, что пользователи просто так не пойдут на общаться на пустой форум о морковке.
Для этого нужно перенести сообщения и пользователей со старого форума на новый. Сделать удобную кросс-регистрацию. В идеале транслировать заголовки разделов форума2 в оригинальный раздел форума1, так чтобы пользователи растеневоды видели, что в разделе о морковке идет обсуждение.
Кто возьмется готов заплатить за работу. Много не обещаю, но все таки...
Offline
Легче всего общих пользователей реализовать, когда оба форума лежат в одной базе.
Форумы имеют разные префиксы таблиц.
Таблица юзеров в одном экземпляре и у нее префикс установлен в base.
В коде форума меняем подстроку '.$db->prefix.'users на base_users.
Файлы конфигов у обоих форумов одинаковые, различаются переменной $db_prefix.
В таком случае регистрация будет проходить на оба форума одновременно.
А вот логирование нет. В код входа на форум нужно дописывать отправку данных методом POST на другой форум, чтобы куки прописались от него на компе юзера.
Другой способ на ум не приходит, так как таким делом не интересовался.
Моя сборка FluxBB 1.5, ForkBB · сообщество
Offline
Объединение двух таблиц пользователей это очень непросто.
Когда я перетаскивал сюда темы v1.2 с форума PunBB я был вынужден сделать так: объявил все переносимые сообщения как бы от имени Гостя. Имена есть, но они не ссылаются на пользовательский профиль.
P.S. Хотя, если БЫ эти два форума были на одной платформе и шифрация паролей была бы одинаковой, я бы наверное попотел и перетащил пользователей. Делать для других не буду, трудоемко и неинтересно.
There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.
Offline
м... неужели это так сложно реализовать? Может я себе это плохо представляю. Но мне это видится так:
пользователь регистрируется на форуме 1, идет запрос на форум 2, там тоже создается такой же пользователь, далее "нужно дописывать отправку данных методом POST на другой форум, чтобы куки прописались от него на компе юзера."
Мы же можем создать пользователя сразу в двух базах имея одинаковую версию форума и тут и там? Главная проблема то в чем? Можно попонятнее объяснить?
Offline
Luca, проблемы:
1. Синхронизация порядковых номеров пользователей при наличии двух таблиц users в разных базах.
2. Синхронизация данных каждого пользователя в обоих базах.
Т.е. если ты имеешь две раздельные базы, нужно к каждому запросу меняющему данные в таблице users добавлять второй запрос на изменения данных во второй базе.
Регистрация через POST-запрос на другой форум не пойдет, так как может быть нарушена синхронизация порядковых номеров пользователей.
artoodetoo, это у тебя POST запрос организован?
private function _httpPost($host, $path, $data, $port = 80)
{
$req = $this->_qsencode ($data);
$http_request = "POST {$path} HTTP/1.0\r\n";
$http_request .= "Host: {$host}\r\n";
$http_request .= "Content-Type: application/x-www-form-urlencoded;\r\n";
$http_request .= "Content-Length: " . strlen($req) . "\r\n";
$http_request .= "User-Agent: reCAPTCHA/PHP\r\n";
$http_request .= "\r\n";
$http_request .= $req;
$response = '';
if (false == ( $fs = @fsockopen($host, $port, $errno, $errstr, 10) )) {
die ('Could not open socket');
}
fwrite($fs, $http_request);
while (!feof($fs)) {
$response .= fgets($fs, 1160); // One TCP-IP packet
}
fclose($fs);
$response = explode("\r\n\r\n", $response, 2);
return $response;
}
З.Ы. По аналогии можно логирование на двух форумах сделать.
Моя сборка FluxBB 1.5, ForkBB · сообщество
Offline
Visman,
Так, а если базу пользователей одну оставить? т.е. 2 форума, в разных базах, но второй использует базу пользователей от первого форума? Это упрощает задачу?
Offline
Luca, нет, т.к. как ПХП будет обращаться одновременно к двум базам? Это нереально.
Одна база для двух форумов с одной таблицей users,
либо переписывать код форума на синхронное изменение данных в таблицах users в двух базах, например, добавить модуль, который будет принимать строку запроса с другого форума, проверять ее подлинность (чтобы со стороны что не заслали) и выполнять этот запрос в базе своего форума. Т.е. вроде API.
Моя сборка FluxBB 1.5, ForkBB · сообщество
Offline
Чтобы авторизовать пользователя другого ресурса не надо изобретать велосипед. Нужен OpenID на одном, а лучше на обоих форумах. Но это отдельная тема...
There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.
Offline
Luca, нет, т.к. как ПХП будет обращаться одновременно к двум базам? Это нереально.
Уважаемый, php прекрасно работает одновременно с неограниченным количеством баз данных, даже разнотипных.
Одна база для двух форумов с одной таблицей users,
либо переписывать код форума на синхронное изменение данных в таблицах users в двух базах, например, добавить модуль, который будет принимать строку запроса с другого форума, проверять ее подлинность (чтобы со стороны что не заслали) и выполнять этот запрос в базе своего форума.
Зачем? Это избыточно, тяжелореализуемо и просто грубо.
Достаточно в каждом из скриптов регистрации сделать запрос как к базе первого форума, так и к базе второго.
Offline
Амиго, ты имел в виду скрипт авторизации, а не регистрации?
Допустим я захожу на форум Б, где меня до сих пор не было и ввожу правильные имя и пароль от форума А. Что дальше?
Задачка 2. Что если на двух форумах есть два пользователя с одинаковыми именами и разными email? Это один человек?
There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.
Offline
Нормальное решение может быть таким, оно работает на множестве сайтов: есть сервер авторизации, который используют один или несколько поставщиков услуг. Поставщик услуг (форум) доверяет серверу авторизации, сам не пытается авторизовать.
Если возвращен положительный статус, поставщик услуг смотрит заведен ли уже на этот внешний id профиль здесь, если надо - создает профиль "на лету".
There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.
Offline
artoodetoo, я имел в виду именно скрипт регистрации.
Ответ на задачу 1. Пусть форумы используют один и тот же движок, тогда средства проверки валидности логина и пароля у них одинаковы. В скрипте авторизации проверяем наличие логина в БД форума 1. В случае наличия получаем хэш пароля из бд 1, в случае отсутствия получаем хэш из БД 2. Если пользователя с логином, который введён, нет ни в одной базе, в регистрации отказываем.
Пусть форумы используют разные движки. Тогда в каждый из скриптов авторизации копируем механизм работы другого скрипта авторизации, тупо копипастим кусок кода.
В случае наличия пользователя с заданным логином в основной базе, используем основной метод проверки валидности пароля, в случае наличия пользователя во второй базе, используем метод проверки пароля форума2.
Ответ на задачу 2. Зависит от настроек, этот момент нужно уточнить у Luca.
Offline
Видишь ли, все это обсуждалось уже не раз, я сам пытался на практике сделать подобный симбиоз, поэтому оставлю тебе возможность самому набить шишки и прийти к тем же выводам )))
А вообще топикстартер задал вопрос о переносе данных, а не о единой авторизации. Мы немного съехали в сторону, хотя вопросы близкие.
There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.
Offline
А теоретически есть еще гостевые записи с именами как у пользователей. Так что целиком полагаться на имя не получается. Запостить нормальным образом такую запись нельзя, а вот при слиянии форумов подобные конфликты могут возникать.
artoodetoo, топикстартер в 1.1 хочет сделать единую регистрацию и единую авторизацию. Это возможно, хотя и несколько нудно.
Перенос данных между форумами на одном движке заключается всего лишь в копировании БД.
Если, повторюсь ещё раз, форумы используют один и тот же движок, задача тривиальна.
Offline
$dbh1 = mysql_connect(); mysql_select_db("db1",$dbh1);
$dbh2 = mysql_connect(); mysql_select_db("db2",$dbh2);
$login;
$password;
$hash = mysql_query("SELECT `hash` FROM `users` WHERE `login`='$login' LIMIT 1",$dbh1);
if (mysql_num_rows($hash)<1)
$hash = mysql_query("SELECT `hash` FROM `users` WHERE `login`='$login' LIMIT 1",$dbh2);
if (mysql_num_rows($hash)<1)
die();
$hash = mysql_fetch_row($hash);
$hash = $hash[0];
if (authorize($login,$password,$hash))
// авторизировать
else
die();
Тащем-та, как-то так.
Редактировался Амиго (2011-01-07 17:42:31)
Offline
Люблю людей у которых всё просто. Надеюь топикстартер будет доволен. Купил попкорн и колу, жду продолжения.
There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.
Offline
Люблю людей у которых всё просто. Надеюь топикстартер будет доволен. Купил попкорн и колу, жду продолжения.
Прошу высказать критические замечания.
Offline
Luca, бюджет объявите, я могу такое сделать, но очень ленив.
В смысле, могу перетащить юзеров и их хозяйство (посты, темы) в другую базу. Больше ничего не понял из ТЗ.
Редактировался scalemaster (2011-01-08 11:02:38)
Offline
scalemaster, да перетащить посты и темы я и сам могу, но дело в оставшейся части ТЗ. Если мне люди не помогут, то буду тут искать тех, кто за $ сможет решить проблему.
Offline
Luca, насколько понял я, вторая часть заключается в переадресации? RewriteRule насочинять, не думаю, что очень много потребуется строк. Либо просто редирект в новый раздел.
Offline
scalemaster,
вторая часть задания заключается в избавление пользователя от необходимости двойной регистрации на проекте А и Б
т.е. зарегился на проекте А и не нужно региться на проекте Б. и наоборот.
Offline
Luca, так оно в первой части реализуется. Переносятся пользователи, профили, сообщения. Или я опять не так понял?
Offline
scalemaster,
"т.е. зарегился на проекте А и не нужно региться на проекте Б. и наоборот."
задача чтобы новым пользователям не потребовалась повторная регистрация.
Offline
Зарегился на проекте А и не нужно региться на проекте Б. реально, а наоборот... навряд ли. Я думал, что нужно слить их воедино, а оказывается, нужно обеспечить одновременное функционирование.
Offline