Недавно перед нами встала задача перенести данные из форума vBulletin на Битрикс.
При анализе проблемы выяснились следующие моменты:
1. В vBulletin файлы иногда хранятся прямо в базе. В нашем случае их переносить не требовалось
2. То, что в битрикс является группой, в vBulletin - пустой форум. Удаляем вручную.
3. Пароли пользователей в vBulletin хранятся в md5, в Битрикс напрямую их не занести... Поэтому все ставим секретный пароль и люди меняют его стандартным способом по кнопке "Забыли пароль"
4. Если у пользователя форума нет емайла, он не перенесется. У нас такой был один, мы просто поставили ему емайл. Кто будет пользоваться скриптом - обратите внимание.
5. API функции форума битрикс не очень документированы и содержат некоторые недоработки. Например, количество тем в форуме и количество сообщений нужно указывать вручную... мы указали только количество сообщений, потому что темы потом были перенесены в другие форумы.
6. у сообщения vBulletin есть доп. поле - описание, которе в битрикс нет. Но им и не пользуются
7. В vBulletin при регистрации пользователей возможны дополнительные поля - их нужно сопоставлять вручную
Ну и из требований:
1. База форума vBulletin загружена в базу битрикс (для простоты операций)
2. Старые ID сохраняются в XML_ID
3. Программа распространяется as is, т.е. без гарантий.
[spoiler]
При анализе проблемы выяснились следующие моменты:
1. В vBulletin файлы иногда хранятся прямо в базе. В нашем случае их переносить не требовалось
2. То, что в битрикс является группой, в vBulletin - пустой форум. Удаляем вручную.
3. Пароли пользователей в vBulletin хранятся в md5, в Битрикс напрямую их не занести... Поэтому все ставим секретный пароль и люди меняют его стандартным способом по кнопке "Забыли пароль"
4. Если у пользователя форума нет емайла, он не перенесется. У нас такой был один, мы просто поставили ему емайл. Кто будет пользоваться скриптом - обратите внимание.
5. API функции форума битрикс не очень документированы и содержат некоторые недоработки. Например, количество тем в форуме и количество сообщений нужно указывать вручную... мы указали только количество сообщений, потому что темы потом были перенесены в другие форумы.
6. у сообщения vBulletin есть доп. поле - описание, которе в битрикс нет. Но им и не пользуются
7. В vBulletin при регистрации пользователей возможны дополнительные поля - их нужно сопоставлять вручную
Ну и из требований:
1. База форума vBulletin загружена в базу битрикс (для простоты операций)
2. Старые ID сохраняются в XML_ID
3. Программа распространяется as is, т.е. без гарантий.
[spoiler]
<code>
<?require($_SERVER["DOCUMENT_ROOT"]."/bitrix/header.php");?>
<?php
global $DB;
//перенести пользователей
if (true) {
$strSql="select * from user join userfield on userfield.userid=user.userid order by user.userid";
$result = $DB->Query($strSql, false, $err_mess.__LINE__);
if($result)
{
while($item=$result->Fetch())
{
$user = new CUser;
$arFields = Array(
"LID" => "s1",
"ACTIVE" => "Y",
"LOGIN" => $item["username"],
"EMAIL" => $item["email"],
"NAME" => $item["field6"],
"PASSWORD" => "sfasedfdsfgds", //потом поменяем
"CONFIRM_PASSWORD" => "sfasedfdsfgds",
"XML_ID" => $item["userid"],
"PERSONAL_WWW" => $item["homepage"],
"PERSONAL_ICQ" => $item["icq"],
"DATE_REGISTER" => date("Y-m-d H:i:s",$item["joindate"]),
"PERSONAL_BIRTHDATE" => $item["birthday"],
"PERSONAL_CITY" => $item["field5"],
"PERSONAL_STREET" => $item["field2"],
"WORK_COMPANY" => $item["field7"],
"WORK_POSITION" => $item["field8"],
"WORK_NOTES" => $item["field9"],
);
$ID = $user->Add($arFields);
if (intval($ID) > 0)
echo "Пользователь успешно добавлен.";
else
echo $user->LAST_ERROR;
}
}
}
CModule::IncludeModule("forum");
//прочитать информацию о форумах vb
if (true) {
$strSql="select * from forum ";
$result = $DB->Query($strSql, false, $err_mess.__LINE__);
if($result)
{
while($item=$result->Fetch())
{
$arFields = Array(
"LID" => "s1",
"ACTIVE" => "Y",
"ID" => $item["forumid"],
"XML_ID" => $item["forumid"],
"NAME" => $item["title"],
"DESCRIPTION" => $item["description"],
"SORT" => $item["displayorder"],
"ALLOW_HTML" => "Y",
"ALLOW_NL2BR" => "Y",
"ALLOW_ANCHOR" => "Y",
"ALLOW_BIU" => "Y",
"ALLOW_IMG" => "Y",
"ALLOW_LIST" => "Y",
"ALLOW_QUOTE" => "Y",
"ALLOW_CODE" => "Y",
"ALLOW_FONT" => "Y",
"ALLOW_SMILES" => "Y",
"ALLOW_UPLOAD" => "F",
"ALLOW_SMILES" => "Y",
);
$ID = CForumNew::Add($arFields);
if (intval($ID) > 0)
echo "Форум ".$item["title"]." успешно добавлен.<br>";
else
echo $ID;
}
}
}
if (true)
{
$strSql="select thread.*, b_user.ID as ID, b_forum.ID as FORUM_ID from thread left join b_user on b_user.XML_ID=thread.postuserid left join b_forum on b_forum.XML_ID=thread.forumid";
$result = $DB->Query($strSql, false, $err_mess.__LINE__);
if($result)
{
while($item=$result->Fetch())
{
if ($item["open"]==1) $state="Y"; else $state="N";
$arFields = Array(
"XML_ID" => $item["threadid"],
"TITLE" => $item["title"],
"STATE" => $state,
"USER_START_ID" => $item["ID"],
"LAST_POSTER_NAME" => $item["postusername"],
"USER_START_NAME" => $item["postusername"],
"OWNER_ID" => $item["ID"],
"FORUM_ID" => $item["FORUM_ID"],
"VIEWS" => $item["views"],
"APPROVED" => "Y",
"POSTS" => $item["replycount"],
"START_DATE" => ConvertTimeStamp($item["dateline"],"FULL"),
);
$ID = CForumTopic::Add($arFields);
if (intval($ID) > 0)
echo "Тема ".$item["title"]." успешно добавлена.<br>";
else {
echo "нет".$ID;
echo "<pre>";
print_r($arFields);
echo "</pre>";
}
}
}
}
if (true)
{
$strSql="select post.*, b_user.ID as ID,b_forum_topic.FORUM_ID,b_forum_topic.XML_ID,b_forum_topic.ID as TOPIC_ID from post left join b_user on b_user.XML_ID=post.userid left join b_forum_topic on b_forum_topic.XML_ID=post.threadid";
$result = $DB->Query($strSql, false, $err_mess.__LINE__);
if($result)
{
while($item=$result->Fetch())
{
if ($item["open"]==1) $state="Y"; else $state="N";
$arFields = Array(
"ID" => $item["postid"],
"XML_ID" => $item["postid"],
"TOPIC_ID" => $item["TOPIC_ID"],
"USE_SMILES" => "Y",
"AUTHOR_ID" => $item["userid"],
"FORUM_ID" => $item["FORUM_ID"],
"AUTHOR_NAME" => $item["username"],
"POST_DATE" => ConvertTimeStamp($item["dateline"],"FULL"),
"POST_MESSAGE" => $item["pagetext"],
"AUTHOR_IP" => $item["ipaddress"],
"APPROVED" => "Y",
);
$ID = CForumMessage::Add($arFields);
if (intval($ID) > 0)
echo "Сообщение ".$item["title"]." успешно добавлено.<br>";
else {
echo "нет! ".$item["postid"];
echo "<pre>";
print_r($arFields);
echo "</pre>";
}
}
}
}
?>
<?require($_SERVER["DOCUMENT_ROOT"]."/bitrix/footer.php");?>
|