.
13 мая 2011

Bitrix API: конвертация форума с PHPBB

posted in Bitrix, Программирование |

Задача для меня, ещё совсем не опытного Bitrix программиста, не тривиальна ... но предположив, что я далеко не первый кодер, реализующий такую задачу я решил плотно погуглить ... и конечно-же нашел отличный материал, на основе которого и конвертировал таки форум.
Итак, статья — Переезжаем с phpBB на форум Битрикс
Материал в целом достаточный, причём неплохо прокомментирован, но всё же хочу акцентировать на некоторых моментах, с которыми пришлось столкнуться:

  • Во первых, в файле forum.php в начале на базе форума phpbb идёт проверка на существование таблиц TBL_WITH_FORUM_IDS и TBL_WITH_POSTS_IDS — логично предположить, что эти таблицы нужно создавать в базе форума phpbb — но это не так ! Вторая проверка — лишняя, в базе форума делаем только одну табличку b_gp_old_bb, две других b_gp_old_bb_topics и b_gp_old_bb_posts — в базе битрикса.
    Может кому поднадобится — вот скриптик добавления:

    // PHPBB
    
    CREATE TABLE `b_gp_old_bb` (
    `ID` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
    `OLD_ID` INT NOT NULL ,
    `NEW_ID` INT NOT NULL
    ) ENGINE = MYISAM ;
    
    // Начальное заполнение соответствий форумов
    INSERT INTO `b_gp_old_bb` VALUES (1, 2, 28);
    INSERT INTO `b_gp_old_bb` VALUES (2, 3, 29);
    INSERT INTO `b_gp_old_bb` VALUES (3, 4, 31);
    INSERT INTO `b_gp_old_bb` VALUES (4, 5, 30);
    INSERT INTO `b_gp_old_bb` VALUES (5, 6, 32);
    
    // Bitrix
    
    CREATE TABLE `b_gp_old_bb_topics` (
    `ID` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
    `OLD_ID` INT NOT NULL ,
    `NEW_ID` INT NOT NULL
    ) ENGINE = MYISAM ;
    CREATE TABLE `b_gp_old_bb_posts` (
    `ID` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
    `OLD_ID` INT NOT NULL ,
    `NEW_ID` INT NOT NULL
    ) ENGINE = MYISAM ;
    
  • Поле post_username в табличке _posts в моей версии phpbb было заполнено какой-то хернёй, поэтому для привязки юзера, пришлось клеить табличу _users по полю poster_id
    Второй запрос у меня выглядел так:

    	$strSql = "SELECT *
    			FROM ".PHPBB_PREFIX."posts as posts
    
    			RIGHT JOIN ".PHPBB_PREFIX."posts_text as posts_text
    			ON posts_text.post_id = posts.post_id
    
    			RIGHT JOIN ".PHPBB_PREFIX."users as posts_users
    			ON posts_users.user_id= posts.poster_id
    			WHERE posts.topic_id=".$arTopics["topic_id"]."
    			ORDER BY posts.post_id ASC";
    
  • в users.php define ('TBL_BANLIST', 'null'); — это было в комментах
  • ещё прикол — после того как форумы будут добавлены в админке, нужно будет зайти в свойства компонента (режим сайта режим правки — модуль форума) и тупо нажать сохранить — таким образом добавленные форумы пропишутся в видимые. Иначе пусто.
  • Правим /bitrix/modules/forum/classes/general/topic.php в методе ADD $arFields["VIEWS"] = 0; — это тоже было
  • define ('PATH_TO_AVATAR', $_SERVER['DOCUMENT_ROOT']... — сюда нужно копирнуть аватарки старого форума
  • С define ('LIMIT_FOR_ONE_STEP', ... я заморачиваться не стал, поставил set_time_limit (0); и всего делов — все юзеры перетащились за раз
  • Так как пришлось скриптик отлаживать и запускать по несколько раз, я дописал удаление всех юзеров созданных ранее (кроме себя)
    $rsUser = CUser::GetList($by="ID", $order="DESC", array());
    while ($arU = $rsUser->GetNext()) {
    	if($arU["ID"]>1) {
    		CUser::Delete($arU["ID"]);
    	}
    }
    $DB->Query('ALTER TABLE `b_forum_user` AUTO_INCREMENT = 2');
    $DB->Query('ALTER TABLE `b_user` AUTO_INCREMENT = 2');
    
  • В моём phpbb использовалось поле RANK которого нет в битриксе, для него я сделал ещё одно пользовательское свойство UF_PHPBB_RANK и добавил его заполнение
    «UF_PHPBB_RANK» => $arUser["user_rank"]
  • На счёт паролей — решил проэксперементировать — скопировал хэш из phpbb в битрикс — и о чудо — пасс подошел, НО при добавлении пароля через API сам хэш считался паролем и ещё раз хэшировался — мне же нужно было перетащить хэш «как есть», для этого ещё один допил:

    в начале скрипта дёргаем пароли старого форума

    $strSql = "SELECT user_id, user_password FROM ".PHPBB_PREFIX."users;";
    $rsPosts = mysql_query($strSql);
    if ($e = mysql_error($link)) {
    	die($e);
    }
    while ($asPosts = mysql_fetch_assoc($rsPosts)) {
    	$gtUsers[$asPosts["user_id"]]['pass'] = $asPosts["user_password"];
    }
    

    В конце скрипта (когда юзера уже на месте)

    $arParams["SELECT"] = array("UF_*");
    $rsUser = CUser::GetList($by="ID", $order="ASC", array(), $arParams);
    
    while ($arUser = $rsUser->GetNext()) {
    
    	$phpbb_id = (int)$arUser["UF_PHPBB_ID"];
    	if(!$phpbb_id>0) continue;
    	$pass = $gtUsers[$phpbb_id]['pass'];
    	$DB->Query("UPDATE b_user SET PASSWORD='$pass' WHERE ID=".$arUser["ID"]);
    }
    
  • Совсем не понял зачем чистить special chars — это дело в __ConvertPosts я закоментил
  • в forums.php трюк с $lastID у меня не прошел — т.к. не хватило оперативки для переноса всего форума, но каждый раз в ручную его править — не реально, поэтому в начале скриптика
    $lastID = file_get_contents ('last.id');
    define ('LIMIT_FOR_ONE_STEP', '500');
    и в цикле
    $lastID = $arItem["topic_id"];
    file_put_contents («last.id»,$lastID);
  • вроде всё

Яндекс.Метрика