Уважаемые пользователи!
C 7 ноября 2020 года phpBB Group прекратила выпуск обновлений и завершила дальнейшее развитие phpBB версии 3.2.
С 1 августа 2024 года phpBB Group прекращает поддержку phpBB 3.2 на официальном сайте.
Сайт официальной русской поддержки phpBB Guru продолжит поддержку phpBB 3.2 до 31 декабря 2024 года.
С учетом этого, настоятельно рекомендуется обновить конференции до версии 3.3.

импорт сообщений

Проблемы с установкой или работой phpBB 3.3.x? Получите помощь здесь!
Правила форума
Местная Конституция | Шаблон запроса | Документация (phpBB3) | Мини [FAQ] по phpBB 3.1.x/3.2.x | FAQ | Как задавать вопросы | Как устанавливать расширения

Ваш вопрос может быть удален без объяснения причин, если на него есть ответы по приведённым ссылкам (а вы рискуете получить предупреждение ;) ).
alexv145
phpBB 1.0.0
Сообщения: 3
Стаж: 3 года 10 месяцев

импорт сообщений

Сообщение alexv145 »

Подскажите как можно импортировать из другого источника сообщения и темы в форум? Есть ли какие то расширения или плагины? В каком формате им скармливать данные?
Аватара пользователя
rxu
phpBB Guru
phpBB Guru
Сообщения: 16367
Стаж: 17 лет 11 месяцев
Откуда: Красноярск
Благодарил (а): 521 раз
Поблагодарили: 1745 раз

Re: импорт сообщений

Сообщение rxu »

alexv145, само по себе добавление сообщений сложности не представляет, можно полистать здесь [FAQ] Как программно добавить тему / пост / личное сообщение (немного устарело, но принцип тот же).
Но могут быть нюансы. Смотря что, откуда, куда, от имени какого пользователя и т.п.
Изображение
Аватара пользователя
maklaut
phpBB 1.2.0
Сообщения: 13
Стаж: 3 года 11 месяцев
Благодарил (а): 6 раз

Re: импорт сообщений

Сообщение maklaut »

Я парсил с помощью content downloader и готовил csv файл, потом заливал на форум через PMA
Аватара пользователя
rxu
phpBB Guru
phpBB Guru
Сообщения: 16367
Стаж: 17 лет 11 месяцев
Откуда: Красноярск
Благодарил (а): 521 раз
Поблагодарили: 1745 раз

Re: импорт сообщений

Сообщение rxu »

maklaut писал(а): 29.05.2020 14:22 потом заливал на форум через PMA
Способ неправильный, ибо кроме таблицы постов в процессе задействован еще целый набор таблиц, плюс синхронизация статистики и апдейт поискового индекса.
Изображение
Аватара пользователя
maklaut
phpBB 1.2.0
Сообщения: 13
Стаж: 3 года 11 месяцев
Благодарил (а): 6 раз

Re: импорт сообщений

Сообщение maklaut »

rxu писал(а): 29.05.2020 14:27 Способ неправильный, ибо кроме таблицы постов в процессе задействован еще целый набор таблиц, плюс синхронизация статистики и апдейт поискового индекса.
Ну потом, через stk делал синхронизацию постов и запускал индексирование поисковых индексов
Аватара пользователя
maklaut
phpBB 1.2.0
Сообщения: 13
Стаж: 3 года 11 месяцев
Благодарил (а): 6 раз

Re: импорт сообщений

Сообщение maklaut »

rxu писал(а): 29.05.2020 14:27
maklaut писал(а): 29.05.2020 14:22 потом заливал на форум через PMA
Способ неправильный, ибо кроме таблицы постов в процессе задействован еще целый набор таблиц, плюс синхронизация статистики и апдейт поискового индекса.
А какой правильный способ?
Аватара пользователя
rxu
phpBB Guru
phpBB Guru
Сообщения: 16367
Стаж: 17 лет 11 месяцев
Откуда: Красноярск
Благодарил (а): 521 раз
Поблагодарили: 1745 раз

Re: импорт сообщений

Сообщение rxu »

Выше отвечал.
Изображение
Аватара пользователя
RedNaxi
Former team member
Сообщения: 933
Стаж: 17 лет 2 месяца
Откуда: BeBoss.ru
Благодарил (а): 2 раза
Поблагодарили: 10 раз

Re: импорт сообщений

Сообщение RedNaxi »

Я делал как.
Сначала спарсенный контент залил в 2 таблицы - "авторы" и "посты". Посты запарсенные у меня были от зарегистрированных авторов и от гостей.
Отдельно была таблица с темами (threads). В каждой таблице в поле phpbb_id фиксировался новый id этого автора, поста и темы - чтобы определять, что уже было перенесено, а также чтобы после переноса сделать редиректы со старых url на новые.

Потом их добавлял в базу вот таким кодом:

Код: Выделить всё

private function insertAuthors() {
        $res = $this->db->sql_query("SELECT * FROM " . $this->table_prefix . "parsed_authors WHERE phpbb_id = 0");
        $authors = $this->db->sql_fetchrowset($res);

        include($this->root_path . 'includes/functions_user.php');
        $this->user->session_begin();
        $this->auth->acl($this->user->data);
        $this->user->setup();

        foreach($authors as $author) {
            $username = $author['name'];
            $password = 'MyCoMpLeX_PaSsWoRd';
            $email_address = md5($author['name'] . time()) . '@parsed.ru';
            $group_name = 'REGISTERED';
            $sql = 'SELECT group_id
        FROM ' . GROUPS_TABLE . "
        WHERE group_name = '" . $this->db->sql_escape($group_name) . "'
            AND group_type = " . GROUP_SPECIAL;
            $result = $this->db->sql_query($sql);
            $row = $this->db->sql_fetchrow($result);
            $group_id = $row['group_id'];

            $timezone = '+3';
            $language = 'en';
            $user_type = USER_NORMAL;
            $user_actkey = md5(rand(0, 100) . time());
            $user_actkey = substr($user_actkey, 0, rand(8, 12));

            $registration_time = time();


            $user_row = array(
                'username'              => $username,
                'user_password'         => phpbb_hash($password),
                'user_email'            => $email_address,
                'group_id'              => (int) $group_id,
                'user_timezone'         => (float) $timezone,
                'user_lang'             => $language,
                'user_type'             => $user_type,
                'user_actkey'           => $user_actkey,
                'user_regdate'          => $registration_time,
            );

            $user_id = user_add($user_row);

            $this->db->sql_query("UPDATE " . $this->table_prefix . "parsed_authors 
            SET phpbb_id = " . $this->db->sql_escape($user_id) . " 
            WHERE id = "  . $this->db->sql_escape($author['id']));

            echo $author['id'] . " : " . $user_id . PHP_EOL;
        }
    }

	private function insertPosts() {
        include($this->root_path . 'includes/functions_posting.php');

        $res = $this->db->sql_query("SELECT * FROM " . $this->table_prefix . "parsed_posts WHERE phpbb_id = 0 ORDER BY post_time ASC LIMIT 10");
        $posts = $this->db->sql_fetchrowset($res);
        while($posts) {
            foreach ($posts as $post) {
                echo $post['id']. PHP_EOL;
                $thread_data_res = $this->db->sql_query("SELECT * FROM " . $this->table_prefix . "parsed_threads WHERE id = " . $this->db->sql_escape($post['id_thread']));
                $thread_data = $this->db->sql_fetchrow($thread_data_res);
                if($post['id_author'] > 0) {
                    $user_data_res = $this->db->sql_query("SELECT * FROM " . $this->table_prefix . "parsed_authors WHERE id = " . $this->db->sql_escape($post['id_author']));
                    $user_data = $this->db->sql_fetchrow($user_data_res);
                }
                $topic_id = 0;
                if(!empty($thread_data['phpbb_id'])) {
                    $topic_id = intval($thread_data['phpbb_id']);
                }
                var_dump($thread_data, $topic_id);
                $sql = "SELECT forum_id
                            FROM " . FORUMS_TABLE . "
                            WHERE forum_name = '" . $this->db->sql_escape($thread_data['forum_name']) . "'";
                $result = $this->db->sql_query($sql);
                $row = $this->db->sql_fetchrow($result);
                $forum_id = $row['forum_id'];

                $this->user->data['user_id'] = ($post['id_author'] > 0) ? $user_data['phpbb_id'] : ANONYMOUS;
                $this->user->data['is_registered'] = ($post['id_author'] > 0) ? 1 : 0;
                $this->user->data['user_colour'] = '';
                $this->user->ip = '127.0.0.0';
                $this->user->data['username'] = $post['author_name'];

                $message_text = $post['post_text'];
                $poll = $uid = $bitfield = $options = '';

                generate_text_for_storage($message_text, $uid, $bitfield, $options, true, true, true);

                $post_data = [
                    // General Posting Settings
                    'forum_id'            => $forum_id,    // The forum ID in which the post will be placed. (int)
                    'topic_id'            => $topic_id,    // Post a new topic or in an existing one? Set to 0 to create a new one, if not, specify your topic ID here instead.
                    'icon_id'            => false,    // The Icon ID in which the post will be displayed with on the viewforum, set to false for icon_id. (int)

                    // Defining Post Options
                    'enable_bbcode'    => true,    // Enable BBcode in this post. (bool)
                    'enable_smilies'    => true,    // Enabe smilies in this post. (bool)
                    'enable_urls'        => true,    // Enable self-parsing URL links in this post. (bool)
                    'enable_sig'        => true,    // Enable the signature of the poster to be displayed in the post. (bool)

                    // Message Body
                    'message'            => $message_text,        // Your text you wish to have submitted. It should pass through generate_text_for_storage() before this. (string)
                    'message_md5'    => md5($message_text),// The md5 hash of your message

                    'bbcode_bitfield'		=> $bitfield,
                    'bbcode_uid'			=> $uid,

                    // Other Options
                    'topic_title'        => $thread_data['thread_name'],    // Subject/Title of the topic. (string)
                    'post_time'         => $post['post_time'],        // Set a specific time, use 0 to let submit_post() take care of getting the proper time (int)
                    'enable_indexing'    => true,        // Allow indexing the post? (bool)
                    'force_approved_state'    => true, // Allow the post to be submitted without going into unapproved queue
                    'force_visibility'            => true, // Allow the post to be submitted without going into unapproved queue, or make it be deleted
                    'post_edit_locked' => 0
                ];
                $poll_data = [];
                $post_url = submit_post(($topic_id > 0) ? 'reply' : 'post', $post['post_title'], $post['author_name'],  POST_NORMAL, $poll_data, $post_data);

                $post_id = $this->db->sql_query("SELECT MAX(post_id) as id FROM " . POSTS_TABLE);
                $post_id = $this->db->sql_fetchrow($post_id);
                $post_id = $post_id['id'];
                $this->db->sql_query("UPDATE " . $this->table_prefix . "parsed_posts SET phpbb_id = " . intval($post_id) . " WHERE id = " . $post['id']);

                if($topic_id == 0) {
                    $post_data = parse_url($post_url);
                    $post_data['query'] = html_entity_decode($post_data['query']);
                    parse_str($post_data['query'], $get_array);
                    $topic_id = $get_array['t'];
                    $this->db->sql_query("UPDATE " . $this->table_prefix . "parsed_threads SET phpbb_id = " . intval($topic_id) . " WHERE id = " . $post['id_thread']);
                }
            }

            $res = $this->db->sql_query("SELECT * FROM " . $this->table_prefix . "parsed_posts WHERE phpbb_id = 0 LIMIT 10");
            $posts = $this->db->sql_fetchrowset($res);
        }
    }
Всё добавилось идеально, ничего пересинхронизировать и тд не пришлось.

Вернуться в «Поддержка phpBB 3.3.x»