Jump to content
Русская поддержка Invision Community
  • Данные из vBulletin iTrade в Trader Feedback System для Invision Community




    При миграции с vBulletin на Invision Community администраторы часто встречаются вопросом миграции данных некогда популярного для vBulletin приложения - iTrader, позволяющего производить оценку сделок, в похожее приложение для Invision Community - Trader Feedback System. В данной статье мы разберёмся как всё же перенести эти данные.

    1 этап - перенос общего рейтинга

    Сперва перенесём общее число рейтинга пользователей, который содержится в таблице user (vBulletin) в колонке itrader_total. Создадим php файл с произвольным именем и положим его в корень нашего установленного Invision Community и добавим в него следующий код:

    <?php
    
    require_once 'init.php';
    
    $userRatings = iterator_to_array( \IPS\Db::i()->select( 'username, itrader_total', 'user' ) );
    
    foreach ( $userRatings as $k => $v )
        {
            if ( $v['itrader_total'] != 0 ) {
                if ( $v['itrader_total'] > 0 ) {
                    \IPS\Db::i()->update('core_members', array('feedb_pos' => $v['itrader_total']), array('name=?', $v['username']));
                }
                if ( $v['itrader_total'] < 0 ) {
                    \IPS\Db::i()->update('core_members', array('feedb_neg' => $v['itrader_total']), array('name=?', $v['username']));
                }
            }                
        }

    Всё просто. Здесь мы подключаемся к базе Invision Community, добавляем в массив поля имени и рейтинг из таблицы user (ПРИМЕЧАНИЕ: таблица user должна быть в той же базе, в которую установлен Invision Community).

    Путём конструкции foreach проходим весь массив и добавляем рейтинг в поле feedb_pos таблицы core_members, если рейтинг положительный и в поле feedb_neg той же таблицы, если рейтинг ниже нуля.

    2 этап - перенос комментариев к сделке

    Теперь задача чуть посложнее. Нам нужно добавить сущности сделок в таблицу feedback_feedback для Trader Feedback System. Для этого замените код в нашем произвольном php файле (или создайте новый файл) на следующий код:

    <?php
    
    require_once 'init.php';
    
    foreach ( \IPS\Db::i()->select( '*', 'itrader_comments' ) as $row ) {
    	
    	try
    	{
    		/* Находим отправителя */
    		$sender_name = \IPS\Db::i()->select('username', 'user', array('userid=?', $row['userid']))->first();
    		$sender_id = \IPS\Db::i()->select('member_id', 'core_members', array('name=?', $sender_name))->first();
    
    		/* Находим получателя */
    		$itrader = \IPS\Db::i()->select('*', 'itrader', array('rateid=?', $row['rateid']))->first();
    		$receiver_name = \IPS\Db::i()->select('username', 'user', array('userid=?', $itrader['rateduserid']))->first();
    		$receiver_id = \IPS\Db::i()->select('member_id', 'core_members', array('name=?', $receiver_name))->first();
    	}
    	catch( \Exception $e ){}
    
    	/* Рейтинг */
    	if ( $itrader['rating'] == 0 ) { $rating = 1; }
    	elseif ( $itrader['rating'] == -1 ) { $rating = 0; }
    	else { $rating = 2; }
    
    	\IPS\Db::i()->insert( 'feedback_feedback', array(
    			'fb_id'					=> NULL,
    			'fb_date'				=> $row['dateline'],
    			'fb_sender_id'			=> $sender_id,
    			'fb_receiver_id'		=> $receiver_id,
    			'fb_ip'					=> $row['ipaddress'],
    			'fb_comment'			=> $row['comment'],
    			'fb_rating'				=> $rating,
    			'fb_content_id'			=> 117471,
    			'fb_type'				=> 0,
    			'fb_class'				=> 'IPS\forums\Topic'
    		) );
    }

    Поскольку после конвертирования пользователи получили другие ID, придётся выполнить некоторые манипуляции по соответствую ID старого пользователя новому.

    Здесь мы:

    • Находим имя получателя из по его id в vBulletin;
    • Находим id по имени в Invision Community.
    • Тоже самое с получателем.
    • Определяем рейтинг, т.к. у этих приложений разная система подсчёта.
    • Делаем инсерты в таблицу feedback.

    siv1987 предложил (за что ему огромное спасибо) упростить данный код и сделать всё одним запросом:

    \IPS\Db::i()->select( 'c.*, m.member_id as sender_id, m2.member_id as receiver_id, u.username as sender_name, u2.username as receiver_name, i.rating', array( 'itrader_comments', 'c' ) )
    			->join( array( 'user', 'u' ), 'u.userid=c.userid' )
    			->join( array( 'core_members', 'm' ), 'm.name=u.username' )
    			->join( array( 'itrader', 'i' ), 'i.rateid=c.rateid' )
    			->join( array( 'user', 'u2' ), 'u2.userid=i.rateduserid' )
    			->join( array( 'core_members', 'm2' ), 'm2.name=u2.username' )

    Если данных в таблице itrader_comments много, можно воспользоваться одним запросом, что значительно уменьшит нагрузку на сервер mysql. 

    3 этап - пересчёт данных

    Для этого запустим задачу пересчёта данных, которая есть в приложении. Опять же создадим php файл и запустим его из браузера:

    <?php
    
    require_once 'init.php';
    
    \IPS\Task::queue( 'feedback', 'RecountFeedback' );

    На этом перенос завершён!





      Report запись


    User Feedback


    STAGE 2 have created error:

    INSERT INTO `feedback_feedback` ( `fb_id`, `fb_date`, `fb_sender_id`, `fb_receiver_id`, `fb_ip`, `fb_comment`, `fb_rating`, `fb_content_id`, `fb_type`, `fb_class` ) VALUES ( NULL, 1325351424, 18343, NULL, '90.190.244.172', '+++++++++++++++++++++++++++++++++++++++++++', 1, 117471, 0, 'IPS\forums\Topic' )
    IPS\Db\Exception: Column 'fb_receiver_id' cannot be null (1048)

    Share this comment


    Link to comment
    Share on other sites


    Join the conversation

    You can post now and register later. If you have an account, sign in now to post with your account.
    Note: Your post will require moderator approval before it will be visible.

    Guest
    Add a comment...

    ×   Pasted as rich text.   Paste as plain text instead

      Only 75 emoji are allowed.

    ×   Your link has been automatically embedded.   Display as a link instead

    ×   Your previous content has been restored.   Clear editor

    ×   You cannot paste images directly. Upload or insert images from URL.

    Loading...

×
×
  • Create New...

Important Information

By using our site you agree to our Privacy Policy