Перенос данных с форума vBulletin на форум Битрикс

Вот такая штука – переносит форумы, темы, сообщения, пользователей

При анализе проблемы выяснились следующие моменты:
1. В vBulletin файлы иногда хранятся прямо в базе. В нашем случае их переносить не требовалось
2. То, что в битрикс является группой, в vBulletin – пустой форум. Удаляем вручную.
3. Пароли пользователей в vBulletin хранятся в md5, в Битрикс напрямую их не занести… Поэтому все ставим секретный пароль и люди меняют его стандартным способом по кнопке “Забыли пароль”
UP – пароли можно перенести и в md5, это старый способ авторизации. Только надо вручную в базу писать
4. Если у пользователя форума нет емайла, он не перенесется. У нас такой был один, мы просто поставили ему емайл. Кто будет пользоваться скриптом – обратите внимание.
5. API функции форума битрикс пока не очень документированы. Например, при переносе количество тем в форуме и количество сообщений нужно указывать вручную… мы указали только количество сообщений, потому что темы потом были перенесены в другие форумы.
6. у сообщения vBulletin есть доп. поле – описание, которе в битрикс нет. Но им и не пользуются
7. В vBulletin при регистрации пользователей возможны дополнительные поля – их нужно сопоставлять вручную

Ну и из требований:
1. База форума vBulletin загружена в базу битрикс (для простоты операций)
2. Старые ID сохраняются в XML_ID
3. Программа распространяется as is, т.е. без гарантий.

Да, самое главное – эту программу нужно сохранить с расширением php куда-нибудь на сайте и открыть через браузер



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"]." успешно добавлен.
";
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"]." успешно добавлена.
";
else {

echo "нет".$ID;
echo "

";
      print_r($arFields);
      echo "

";

}
}
}
}

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"]." успешно добавлено.
";
else {
echo "нет! ".$item["postid"];
echo "

";
      print_r($arFields);
      echo "

";

}
}
}
}

?>


Автор поста: Петров Роман

Метки записи: , , ,

Связанные записи:

1 Comment »

  1. Комментирует Денис

    March 22, 2010 at 5:04 am

    В переносе сообщений выбирается по несколько одинаковых, group by post.postid я добавил.
    И не “AUTHOR_ID” => $item["userid"],
    а “AUTHOR_ID” => $item["ID"],
    тогда правильно сообщения считаются.

    И что-то дата у меня не вносится так “DATE_REGISTER” => date(“Y-m-d H:i:s”,$item["joindate"]),
    только так нормально “DATE_REGISTER” => ConvertTimeStamp($item["joindate"],”FULL”),

    Вообще, огромное спасибо! сэкономили мне кучу времени.

Оставить комментарий

Также Вы можете войти используя: Yandex Google Facebook Вконтакте Twitter Mail.ru OpenID