Перейти к содержанию
  • Данные из 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' );

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





      Пожаловаться на запись


    Обратная связь


    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)

    Поделиться этим комментарием


    Ссылка на комментарий
    Поделиться на другие сайты


    Присоединяйтесь к обсуждению

    Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
    Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

    Гость
    Добавить комментарий...

    ×   Вставлено с форматированием.   Вставить как обычный текст

      Разрешено использовать не более 75 эмодзи.

    ×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

    ×   Ваш предыдущий контент был восстановлен.   Очистить редактор

    ×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

    Загрузка...

×
×
  • Создать...

Важная информация

Используя наш сайт вы соглашаетесь с нашей Политикой конфиденциальности