Единственный путь — автоматизация: Конвертер базы из TWS форума в DLE форум и некоторые подводные камни

Прошло много времени с тех пор, когда я переливал из чашки в чашку конвертировал форумы в связке с DLE. Поступил похожий заказ по следам предыдущего. На этот раз требовалось конвертировать базу данных TWS форума в новый форум DLE.

Казалось бы по проторенной дорожке, но без камешков в сандалиях не обошлось.

В прошлый раз я выложил в паблик конвертер и соответствие полей привел в статье. Некоторые (признаю, скудные) комментарии были не для красоты и понятности чтения, а оказались насущной надобностью при разборе структуры.

Значения некоторые полей пришлось вновь угадывать методом тыка, чем я и занялся.

Сначала приведу код, ниже приведу маленькие подлости, которые мне подготовил форум DLE:

Итак, подводные камни:

1) Права доступа.

К тому моменту я уже считал, что дело в шляпе. Конвертация прошла, в phpMyAdmin все светится как положено, количество строк сходится. А значит оп-ля, рефреш страницы форума и тут же облом. Такой страницы нет либо вы не имеете прав на ее просмотр.

Куда копать:

// это права доступа для групп, номера которых указаны
// названия ячеек говорят сами за себя
    $DLE_FORUM['access_read']='1:2:3:4:5'; 
    $DLE_FORUM['access_write']='1:2:3:4:5';
    $DLE_FORUM['access_mod']='1:2'; // права на модерацию
    $DLE_FORUM['access_topic']='1:2:3:4:5';
    $DLE_FORUM['access_upload']='1:2:3:4:5';
    $DLE_FORUM['access_download']='1:2:3:4:5';

Так вот, в TWS форума таких полей нет, а значит всязть их негде. Прописывать права в DLE придется вручную, в соответствии с надобностью и вкусами.

2) Пароль форума

В таблице форума DLE есть пароль. Если мы не хотим его использовать или его по-просту негде взять, используем 0.

3) Старый добрый кеш

Конечно же ваш форум может кешироваться. Меня это заставило повозиться с правами доступа на 5 минут дольше, чем следовало.

Заходим в /admin.php?mod=forum, нажимаем внизу «Очистить кеш»

Конвертер

Переносятся:

  • группы
  • пользователи
  • категории форумов
  • форумы
  • топики
  • посты
  • голосования
  • репутации

В этот раз также подключал парсер $DleForumParse->BB_Parse, для парсинга бб-тегов.

В качестве классов бд можете использовать свои или скачать мой класс работы с бд.

Подключается он так:

<?php

// база
define('HOST_TWS','localhost');
define('UZER_TWS','root');
define('SLOVO_TWS','root');
define('BAZA_TWS','mihel_armourdb_2');
define('PREFIX_TWS','dle');

define('HOST_DLE','localhost');
define('UZER_DLE','root');
define('SLOVO_DLE','root');
define('BAZA_DLE','mihel_armourdb_2');
define('PREFIX_DLE','dle');

define('CHARSET','utf8');//

include_once('fm_func_sql.php');

    $TWS_DB=new FM171_SQL;
    $TWS_DB->SERVAK=HOST_TWS;
    $TWS_DB->UZER=UZER_TWS;
    $TWS_DB->SLOVO=SLOVO_TWS;
    $TWS_DB->BAZA=BAZA_TWS;
    $TWS_DB->PREFIX=PREFIX_TWS;
    $TWS_DB->CHARSET=CHARSET;

    $DLE_DB=new FM171_SQL;
    $DLE_DB->SERVAK=HOST_DLE;
    $DLE_DB->UZER=UZER_DLE;
    $DLE_DB->SLOVO=SLOVO_DLE;
    $DLE_DB->BAZA=BAZA_DLE;
    $DLE_DB->PREFIX=PREFIX_DLE;
    $DLE_DB->CHARSET=CHARSET;

Ну и наконец вылаживаю сам скрипт конвертера.

<?php
/*
** Конвертер из форума TWS в DLE Forum 2.5
** (c) Anton_Gorodezkiy
** http://www.nadvoe.org.ua
*/

header("Contetn-type: text/html;charset=UTF-8");

include_once('set.php');

/*
ini_set('display_errors',1);
error_reporting(E_ALL);
*/

ini_set('max_execution_time', 220);
ini_set('memory_limit', '256M');

define("DATALIFEENGINE",'');

include_once('parse.class.php');

$DleForumParse = new ForumParse;

// очистка
$CONFIG['truncate_first']=1;

// включение частей конвертора
$CONFIG['groups']=0;
$CONFIG['users']=0;
$CONFIG['categories']=0;
$CONFIG['forums']=0;
$CONFIG['topics']=0;
$CONFIG['posts']=0;
$CONFIG['poll_log']=0;
$CONFIG['reputation']=1;

/*
** Подготовка. Чистим целевой ДЛЕ форум
*/
if ($CONFIG['truncate_first'])
{

    //$q[] = "TRUNCATE `" .$DLE_DB->PREFIX. "_forum_forums`;";
    //$q[] = "TRUNCATE `" .$DLE_DB->PREFIX. "_forum_category`;";

    foreach($q as $qq)
    {
        $DLE_DB->query($qq);

    }
    echo 'Очищено...';

}

/*
** usergroup -> rel_usergroups
** Перенос групп
*/
if ($CONFIG['groups'])
{
    echo 'Перенос групп... ';

    $DLE_DB->query('TRUNCATE '.$DLE_DB->PREFIX.'_usergroups');

    $usergroup=$TWS_DB->select('usergroups_old');

    $i=0;
    $y=0;
    foreach($usergroup as $row)
    {
        $i++;
        $DLE_FORUM = array();

        unset($row['twsf_descr']);
        unset($row['twsf_status']);
        unset($row['twsf_rang']);
        unset($row['twsf_moderator']);

        // echo $DLE_DB->sql.'<br />';
        if (!$DLE_DB->insert('usergroups',$DLE_FORUM))
        {
            echo '<div style="color:red;">'.$DLE_DB->error.'</div><br />';

        }
        else
            $usergroup_id[$usergroup[$key]['usergroupid']] = $DLE_DB->last_id;

    }
    echo 'завершен (запорото '.$y.' из '.$i.' записей)<hr />';
}
/* usergroup -> rel_usergroups */

/*
** user -> rel_users
** Перенос пользователей
*/
if ($CONFIG['users'])
{
    echo 'Перенос пользователей... ';

    $result = $DLE_DB->query('TRUNCATE '.$DLE_DB->PREFIX.'_users');

    if (!$result)
            echo '<div style="color:red;">'.$DLE_DB->error.'</div><br />';    

    $users=$TWS_DB->select('users_old');

    foreach($users as $row)
    {
        $DLE_FORUM = $row;

        foreach($DLE_FORUM as $key => $val)
        {
            if (strstr($key,'twsf'))
                unset($DLE_FORUM[$key]);
        }

        unset($DLE_FORUM['country']);
        unset($DLE_FORUM['city']);
        unset($DLE_FORUM['useragent']);
        unset($DLE_FORUM['logged_proxy']);
        unset($DLE_FORUM['location']);

        $DLE_FORUM['forum_post'] = $row['twsf_posts'];
        $DLE_FORUM['forum_warn'] = $row['twsf_warnings'];
        $DLE_FORUM['forum_rank'] = $row['twsf_rank'];
        $DLE_FORUM['forum_reputation'] = $row['twsf_reputation'];
        $DLE_FORUM['forum_last'] = $row['twsf_forumvisit'];

        if (!$DLE_DB->insert('users',$DLE_FORUM))
            echo '<div style="color:red;">'.$DLE_DB->error.'</div><br />';    

    }
    echo 'завершен (запорото '.$y.' из '.$i.' записей)<hr />';
}    
/* user -> rel_users */

/*
** forum_category -> twsf_categories
** Перенос категорий
*/
if ($CONFIG['categories'])
{
    echo 'Перенос категорий... ';
    $rows=$TWS_DB->select('twsf_categories');

    foreach($rows as $key=>$row)
    {

        $DLE_FORUM = array();
        $DLE_FORUM['sid']=$row['cat_id'];
        $DLE_FORUM['cat_name']=$row['cat_title'];
        $DLE_FORUM['posi']=$row['cat_order'];

        if (!$DLE_DB->insert('forum_category',$DLE_FORUM))
        {
            echo '<div style="color:red;">'.$DLE_DB->error.'</div><br />';
        }

    }
    echo 'завершен (запорото '.$y.' из '.$i.' записей)<hr />';
}
/* forum_category -> twsf_categories */

/*
** forum -> rel_forum_forums
** Перенос форумов
*/
if ($CONFIG['forums'])
{
    echo 'Перенос форумов... ';
    $rows=$TWS_DB->select('twsf_forums');
    $i=0;
    $y=0;
    foreach($rows as $key=>$row)
    {
        $i++;
        $DLE_FORUM = array();
        $DLE_FORUM['id']=$row['forum_id'];
        $DLE_FORUM['parentid']=$row['parentid'];
        $DLE_FORUM['main_id']=$row['cat_id'];
        $DLE_FORUM['topics']=$row['forum_topics'];
        $DLE_FORUM['posts']=$row['forum_posts'];
        $DLE_FORUM['name']=$row['forum_name'];
        $DLE_FORUM['description']=$row['forum_desc'];
        $DLE_FORUM['position']=$row['forum_order'];
        $DLE_FORUM['status']=( $row['forum_status']=='unlock' ? 1 : 0 ); // форум закрыт/открыт
        $DLE_FORUM['access_read']='1:2:3:4:5:6:7:8';
        $DLE_FORUM['access_write']='1:2:3:4:5:6:7:8';
        $DLE_FORUM['access_topic']='1:2:3:4:5:6:7:8';
        $DLE_FORUM['access_upload']='1:2:3:4:5:6:7:8';
        $DLE_FORUM['access_download']='1:2:3:4:5:6:7:8';
        $DLE_FORUM['password']=0;
        $DLE_FORUM['moderators']=$row['moderators'];
        $DLE_FORUM['q_reply']=1;

        if (!$DLE_DB->insert('forum_forums',$DLE_FORUM))
        {
            if ($DLE_DB->error != '')
                echo '<div style="color:red;">'.$DLE_DB->error.'</div><br />';

        }

    }

    echo 'завершен (запорото '.$y.' из '.$i.' записей)<hr />';
}
/* forum -> rel_forum_forums */

/*
** forum -> rel_forum_topics
** Перенос тем
*/
if ($CONFIG['topics'])
{
    echo 'Перенос тем... ';
    $rows=$TWS_DB->select('twsf_topics');
    $i=0;
    $y=0;
    foreach($rows as $row)
    {
        $i++;
        $DLE_FORUM = array();
        $DLE_FORUM['tid']=$row['topic_id'];
        $DLE_FORUM['forum_id']=$row['forum_id'];
        $DLE_FORUM['title']=$row['topic_title'];
        $DLE_FORUM['topic_descr']=$row['topic_subject'];
        $DLE_FORUM['post']=$row['topic_replies'];
        $DLE_FORUM['views']=$row['topic_views'];
        $DLE_FORUM['author_topic']=$row['topic_poster'];
        $DLE_FORUM['last_poster_name']=$row['lastposter'];
        $DLE_FORUM['topic_status']=$row['topic_lock'];
        $DLE_FORUM['fixed']='1';  // 1 - не важные
        $DLE_FORUM['first_post']=$row['topic_first_post_id'];
        $DLE_FORUM['last_post_id']=$row['topic_last_post_id'];
        $DLE_FORUM['start_date']=$row['topic_time'].' 08:00:00';

        if (!$DLE_DB->insert('forum_topics',$DLE_FORUM))
        {

            if ($DLE_DB->error != '')
                echo '<div style="color:red;">'.$DLE_DB->error.'</div><br />';
        }

    }
    echo 'завершен (запорото '.$y.' из '.$i.' записей)<hr />';
}
/* forum -> rel_forum_topics */

/*
** forum -> rel_forum_posts
** Перенос сообщений
*/
if ($CONFIG['posts'])
{
    echo 'Перенос сообщений... ';
    $TWS_DB->query('SELECT * FROM '.$TWS_DB->PREFIX.'_twsf_posts LEFT JOIN '.$TWS_DB->PREFIX.'_twsf_posts_text ON t_post_id = post_id ORDER BY post_id ');
    $rows = $TWS_DB->fetch();

    foreach($rows as $row)
    {

        $DLE_FORUM = array();
        $DLE_FORUM['pid']=$row['post_id'];
        $DLE_FORUM['topic_id']=$row['topic_id'];
        $DLE_FORUM['post_date']=$row['post_time'];
        $DLE_FORUM['post_author']=$row['poster'];
        $DLE_FORUM['post_text']=addslashes($DleForumParse->BB_Parse($row['text']));
        $DLE_FORUM['post_ip']=$row['ip'];
        $DLE_FORUM['is_register']=1;
        $DLE_FORUM['e_mail']=$row['email'];
        $DLE_FORUM['edit_time']=$row['post_edit_time'];

        if (!$DLE_DB->insert('forum_posts',$DLE_FORUM))
        {
            if ($DLE_DB->error != '')
                echo '<div style="color:red;">'.$DLE_DB->error.'</div><br />';
        }

    }
    echo 'завершен (запорото '.$y.' из '.$i.' записей)<hr />';
}
/* forum -> rel_forum_posts */

/*
** forum_poll_log -> poll_log
** Перенос голосований
*/
if ($CONFIG['poll_log'])
{
    echo 'Перенос голосований... ';
    $rows = $TWS_DB->select('twsf_poll_log');

    foreach($rows as $row)
    {

        $DLE_FORUM = array();
        $DLE_FORUM['id']=$row['id'];
        $DLE_FORUM['topic_id']=$row['top_id'];
        $DLE_FORUM['member']=$row['member'];

        if (!$DLE_DB->insert('forum_poll_log',$DLE_FORUM))
        {
            if ($DLE_DB->error != '')
                echo '<div style="color:red;">'.$DLE_DB->error.'</div><br />';
        }

    }
    echo 'завершен (запорото '.$y.' из '.$i.' записей)<hr />';
}
/* forum_poll_log -> poll_log */

/*
** forum_reputation_log -> twsf_reputation
** Перенос репутации
*/
if ($CONFIG['reputation'])
{
    echo 'Перенос репутации... ';
    $TWS_DB->query(' SELECT * FROM '.$TWS_DB->PREFIX.'_twsf_reputation LEFT JOIN '.$TWS_DB->PREFIX.'_users ON name=user_to ');
    $rows = $TWS_DB->fetch();

    foreach($rows as $row)
    {

        $DLE_FORUM = array();
        $DLE_FORUM['rid']=$row['rep_id'];
        $DLE_FORUM['mid']=$row['user_id'];
        $DLE_FORUM['author']=$row['user_from'];
        $DLE_FORUM['action']=($row['direction']=='up' ? '+' : '-' );
        $DLE_FORUM['date']=strtotime($row['add_time']);
        $DLE_FORUM['cause']=$row['message'];

        if (!$DLE_DB->insert('forum_reputation_log',$DLE_FORUM))
        {
            if ($DLE_DB->error != '')
                echo '<div style="color:red;">'.$DLE_DB->error.'</div><br />';
        }

    }
    echo 'завершен (запорото '.$y.' из '.$i.' записей)<hr />';
}
/* forum_poll_log -> poll_log */

Заказчик остался доволен, а значит цель ради которой писался конвертор была достигнута.

Полезно(0)Бесполезно(0)
Комментарии закрыты.