Jump to content
Дизайн и модификация IPS Community IPBSkinsBETA
Search In
  • More options...
Find results that contain...
Find results in...
Sign in to follow this  
Атаман

Перенос раздела с одного форума на другой.

Recommended Posts

Мой хороший знакомый просит перенести с существующего форума целый раздел на новый форум.

 

В нем тем 300, а постов я даже не подсчитаю сколько).

 

Как перенести тему и посты я знаю, каждая тема, а потом привязка к ней постов-это все в ручную, но через чур долго.

 

1) Нужно перенести раздел и все темы его

2) По возможности как-то переименовать авторов на другой ID, чтоб не было слово ГОСТЬ.

 

Есть ли экспорт сторонний?.

Share this post


Link to post
Share on other sites

Не изучал структуру БД особо. ID тем и постов сами увеличиваются при вставке записей в таблицы? Тогда ничего сложного, экспорт в файл и в select вписать ID пользователя с его форума, под которым потом сообщения и темы появятся.

 

У себя переделывал все темы и стартовые посты тем с одного пользователя на другого, чисто через sql. Там не только id пользователя нужны, ещё имена местами.

  • Upvote 1

Share this post


Link to post
Share on other sites

Готовых скриптов таких нет, скорее всего. Но написать не сложно под конкретную задачу.

 

P.S. sedito_conv.zip Можете вот это адаптировать для своих целей.

  • Upvote 1

Share this post


Link to post
Share on other sites

Спасибо. Это ты только-что создал скрипты?

Share this post


Link to post
Share on other sites

Нет, это я переносил форум с движка Sedito. На самом деле, там еще куча правок в теле сообщений была, бб-кодов одних два десятка, смайлов не считано...

 

P.S. Еще разницу в структуре таблиц разных версий учитывать нужно, переносил на 3.3.4 ещё.

Share this post


Link to post
Share on other sites

ТС, завтра в рабочее время по МСК смогу помочь. sql-запрос родим. Два. Один для тем, а второй для постов.

Share this post


Link to post
Share on other sites

Можно через конвертер ипс перенести раздел, но там тоже немало ебалы.

 

Самый простой вариант который приходит мне в голову:

1. Создаем две пустые таблицы топиков и постов. Форумов я думаю не нужно, если в разделе нет других форумов.

CREATE TABLE new_topics LIKE "ibf_topics";

CREATE TABLE new_posts LIKE "ibf_topics";

 

2. Копируем туда темы и сообщения из нужного нам раздела

INSERT INTO new_topics SELECT * FROM ibf_topics WHERE forum_id IN (ид_форума);

INSERT INTO new_posts SELECT p.* FROM ibf_posts p INNER JOIN ibf_topics t ON t.tid=p.topic_id WHERE t.forum_id IN (ид_форума);

 

3. Создаем новое поле в экспортируемой таблице топиков - old_tid. Дублируем туда ид топиков

ALTER TABLE new_topics ADD COLUMN old_tid int(10) NOT NULL DEFAULT '0';

UPDATE new_topics SET old_tid=tid;

 

ALTER TABLE new_posts ADD COLUMN old_post tinyint(1) NOT NULL DEFAULT '0';

UPDATE new_posts SET old_post=1;

 

В базе куда будем переносить раздел нужно выполнить следующие запросы:

ALTER TABLE ibf_topics ADD COLUMN old_tid int(10) NOT NULL DEFAULT '0';

ALTER TABLE ibf_posts ADD COLUMN old_post tinyint(1) NOT NULL DEFAULT '0';

 

4. Удаляем первичные ключи из таблиц new_topics и new_posts, и удаляем айдишники (в новой базе они будут новые).

ALTER TABLE new_topics DROP PRIMARY KEY;

ALTER TABLE new_posts DROP PRIMARY KEY;

 

ALTER TABLE new_topics CHANGE COLUMN `tid` `tid` int(10) DEFAULT null;

ALTER TABLE new_posts CHANGE COLUMN `pid` `pid` int(10) DEFAULT null;

 

UPDATE new_topics SET tid=NULL;

UPDATE new_posts SET pid=NULL;

 

5. Экспортируем таблицы new_topics и new_posts.

 

6. Импортируем таблицы в новом форуме. Копируем данные из них в рабочие таблицы форума.

INSERT INTO ibf_topics SELECT * FROM new_topics;

INSERT INTO ibf_posts SELECT * FROM new_posts;

 

7. Обновляем данные ид тем в таблице ibf_posts

UPDATE ibf_posts p INNER JOIN ibf_topics t ON (t.old_tid=p.topic_id AND p.old_post=1) SET p.topic_id=t.tid;

 

Дальше идет обыкновенный пересчет статистики. Что запросами, что стандартными функциями пересчета. Отсюда уже будет гораздо проще.

По полному завершению переноса, в конце можно удалить две ненужные поля из ibf_topics И ibf_posts

ALTER TABLE ibf_topics DROP COLUMN old_tid;

ALTER TABLE ibf_posts DROP COLUMN old_post;

 

Вообщем это самый простой и быстрый способ который мне пришел на ум. :)

Вроде ничего не забыл...

  • Upvote 1
  • Downvote 1

Share this post


Link to post
Share on other sites

@siv1987, ИМХО, очень сложно. И не выполнена просьба автора по замене автора тем и сообщений. А без этого смысл какой в пересчёте?

Share this post


Link to post
Share on other sites

Таскер спасибо, я в первом посту написал, что я знаю как тему - пост перенести и тд, но мне нужно глобально все перетащить. Мне за 1 раз нужно 300 тем и 30000 постов.

Share this post


Link to post
Share on other sites

Сив спасибо, я случайно мин поставил. Кнопочки малые очень.

 

Спасибо всем за советы. Дмитрий - Таскер спасибо Вам.

 

Понравился метод Сива, буду пробовать.

Share this post


Link to post
Share on other sites

А помоему - скриптом проще. Вытаскиваете два массива из базы - топики принадлежащие нужному форуму и посты относящиеся к этим топикам. Останется только назначить им правильные иденты ( что нибудь типа "range([max tid в таблице ibf_topics + 1], [max tid в таблице ibf_topics + 1] + count($topics))" ), добавить в массивы свои данные пользователя и форума, и записать в базу...

Share this post


Link to post
Share on other sites

@Dmitriy427, а соответствие между массивами как? Ведь ID темы в массиве сообщений должен соответствовать ID темы в массиве тем.

Share this post


Link to post
Share on other sites

@Dmitriy427, а соответствие между массивами как? Ведь ID темы в массиве сообщений должен соответствовать ID темы в массиве тем.

Условиями во вложенном цикле все делается. То есть, массив сообщений обрабатывается в цикле размещенном внутри цикла обрабатывающего темы. Оно не так сложно выглядит в коде, как тут в описании, на самом деле. :).

 

P.S. Ну, вот например:

$tid = n1; // max tid + 1
$pid = n2; // max pid + 1
foreach ($topics as $key => $topic) {
$t_array[$key] = $topic;
$t_array['tid'][$key] = $tid;
foreach ($posts as $k => $post) {
	if ($post['topic_id'] == $topics['tid'][$key]) {
		$p_array[$k] = $post;
		$p_array['pid'][$k] = $pid;
		$p_array['topic_id'][$k] = $tid;
		$pid++;
	}
}
$tid++;
}

Share this post


Link to post
Share on other sites

@siv1987, ИМХО, очень сложно. И не выполнена просьба автора по замене автора тем и сообщений. А без этого смысл какой в пересчёте?

На первый взгляд. На самом деле ничего сложного нет, только выполнять запросы. Экспортировать таблицы и также потом выполнить пару запросов. И замена авторов это тоже все легко делается запросами - удаляется author_id, и заменяются имена пользователей.

Смысл в пересчете чтобы обновить статистику форумов.

 

Преимущество перед скриптом в том что не надо ничего отлаживать, не нужно писать гору кода - хотя задача и выглядит просто, но по нормальному сначала нужно записать тему в бд, получить ее last_insert_id, присвоить его постам и записать их базу. Базы должны быть на одном акаунте, а вдруг там 100500 тем и столько же сообщений?

Лично мне в данном случае проще было работать базой и запросами, тем более когда они на разных серверах.

Share this post


Link to post
Share on other sites

Преимущество перед скриптом в том...

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

 

И в поставленной тут задаче регулярки нужно будет применять прямо в скрипте переноса, видимо. Что бы иметь возможность сопоставить иденты сообщений и топиков в исходном и результирующем массивах. Или создавать поля old_tid, old_pid, как в вашем варианте, да.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...