При миграции с 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' );
На этом перенос завершён!
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.