XF 2.2 Конвертирование решенных тем из 2.1 в 2.2

Версия XenForo
2.2

john_j

Проверенные
Сообщения
422
Решения
8
Реакции
133
Баллы
745
Вопрос пока только чисто теоретический, но может уже есть практика.
В общем, будет стоять задача сконвертировать темы с префиксом "Решено" в новую систему XF 2.2.

И если сами типы тем можно будет изменить через пакетную обработку, то как быть с опцией "решено" ?
Возможно ли массово отметить такие темы решенными, но без привязки к конкретному сообщению с решением ?
 
Насколько я понял, в XF 2.2 вообще нет понятия "решенный вопрос" в том смысле, о котором вы говорите. Есть:
  • вопрос без ответов (считается вопросом без ответов + нерешенным)
  • вопрос с ответами (считается нерешенным)
  • вопрос с лучшим ответом (считается решенным)
Короче, система как на Stack Overflow.

Варианта два: принять новые правила игры или продолжить использовать префиксы параллельно с функционалом 2.2.
Правда, даже в этом случае вопросы с префиксом "Решено", но без лучшего ответа будут содержаться в разделе "Нерешенные вопросы", поэтому есть смысл их куда-нибудь перемещать.
 
Последнее редактирование:
Варианта два: принять новые правила игры или продолжить использовать префиксы параллельно с функционалом 2.2.
О том и речь, как перенести из старой системы решенных тем через префиксы, в новую систему.
Есть ли какие-нибудь варианты ? По идее движок должен содержать в базе id сообщения "лучшего" ответа.

Возможно, например для старых темы с префиксом "решено" сделать запись лучшего ответа, которым будет сам вопрос. Что-бы в итоге старая тема в разделе стала отображаться как решенная ? В самой теме конечно решения не будет.
 
сделать запись лучшего ответа, которым будет сам вопрос.
Очень плохая идея)

К тому же, тогда придется придумывать страшное костыльное фронэнд решение, чтобы скрыть отображение этого самого лучшего ответа, которым и является вопрос, ибо иначе будет выглядеть ужасно.

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

А вообще, если нужен пример переноса, гляньте код вот этого:

Конкретно вам нужен вот этот файл (с корректировкой для случая префиксов (ID префикса указан в таблице xf_thread)):

PHP:
<?php

namespace CMTV\QTConverter;

use XF\AddOn\AbstractSetup;
use XF\AddOn\StepRunnerInstallTrait;
use XF\AddOn\StepRunnerUninstallTrait;
use XF\AddOn\StepRunnerUpgradeTrait;

class Setup extends AbstractSetup
{
    use StepRunnerInstallTrait;
    use StepRunnerUpgradeTrait;
    use StepRunnerUninstallTrait;

    //
    // Конвертация типов форумов
    //
    public function installStep1()
    {
        $db = $this->db();

        // Конвертация форумов только для вопросов
        $db->update(
            'xf_forum',
            [
                'forum_type_id' => 'question',
                'type_config' => json_encode(['allow_answer_voting' => true, 'allow_downvote' => true])
            ],
            'CMTV_QT_type = ?', ['questions_only']
        );

        // Конвертация смешанных форумов (вопросы + обычные темы)
        $db->update(
            'xf_forum',
            [
                'forum_type_id' => 'discussion',
                'type_config' => json_encode(['allowed_thread_types' => ['question'], 'allow_answer_voting' => true, 'allow_downvote' => true])
            ],
            'CMTV_QT_type = ?', ['both']
        );
    }

    //
    // Конвертация лучших ответов в лучшие ответы в XF
    //
    public function installStep2()
    {
        $db = $this->db();

        // Converting threads to questions
        $db->update(
            'xf_thread',
            [
                'discussion_type' => 'question',
                'type_data' => json_encode(['allow_question_actions' => 'yes'])
            ],
            'CMTV_QT_is_question = ?', [true]
        );

        $questions = $db->fetchAll("SELECT `thread_id` FROM `xf_thread` WHERE `CMTV_QT_is_question` = ?;", [true]);

        $db->beginTransaction();

        foreach ($questions as $question)
        {
            $db->insert(
                'xf_thread_question',
                [
                    'thread_id' => $question['thread_id']
                ],
                false,
                '`thread_id` = `thread_id`'
            );
        }

        $db->commit();

        // Конвертация лучших ответов в лучшие ответы в XF
        $bestAnswers = $db->fetchAll("SELECT `thread_id`, `post_id`, `post_user_id` FROM `xf_cmtv_qt_best_answer`;");

        $db->beginTransaction();

        foreach ($bestAnswers as $bestAnswer)
        {
            $db->update(
                'xf_thread',
                [
                    'type_data' => json_encode(['solution_post_id' => $bestAnswer['post_id'], 'solution_user_id' => $bestAnswer['post_user_id'], 'allow_question_actions' => 'yes'])
                ],
                'thread_id = ?', [$bestAnswer['thread_id']]
            );

            $db->insert(
                'xf_thread_question',
                [
                    'thread_id' => $bestAnswer['thread_id'],
                    'solution_post_id' => $bestAnswer['post_id'],
                    'solution_user_id' => $bestAnswer['post_user_id']
                ],
                false,
                "`solution_post_id` = {$bestAnswer['post_id']}, `solution_user_id` = {$bestAnswer['post_user_id']}"
            );
        }

        $db->commit();
    }

    //
    // Обновление счетчиков лучших ответов
    //
    public function installStep3()
    {
        $db = $this->db();
        $db->query("UPDATE `xf_user` SET `question_solution_count` = `CMTV_QT_best_answer_count`;");
    }
}
 
Последнее редактирование:
Очень плохая идея)
Возможно )
Но это чисто для визуального отражения из списка тем того, что ответ в теме уже не требуется. Для отображения зеленой галочки.
А внутри темы для первого сообщения в новой системе XF нет значка лучшего ответа.
Меня бы такой вариант устроил.

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

CMTV, В общем, немного разобрался в структуре.
Попробовал на одной теме локальной копии форума, вроде получается.
Буду писать "конвертер" на базе твоего кода, php немного знаю.
 
Последнее редактирование модератором:
  • Мне нравится
Реакции: CMTV
Если что, обращайся, но код за тебя писать не буду)
Только имей в виду, что тот, код, который я привел, только переведет обычные темы в вопросы. Проблему с отсутствием лучших ответов это не решит.
 
Современный облачный хостинг провайдер | Aéza
Назад
Сверху Снизу