Недавно перед нами встала задача перенести данные из форума 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");?> |