Перейти к содержанию

Пашка

invision Member
  • Постов

    1
  • Зарегистрирован

  • Посещение

Достижения Пашка

Newbie

Newbie (1/14)

  • Conversation Starter Редкий
  • Week One Done
  • One Month Later
  • One Year In

Последние значки

0

Репутация

  1. При миграции с 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' ); На этом перенос завершён!
×
×
  • Создать...

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

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