[GX] SQL Запрос на создании темы

[GX] SQL Запрос на создании темы

Георгий Шевченко

Проверенные
Сообщения
2,205
Реакции
4,393
Баллы
8,750
Пользователь Георгий Шевченко разместил новый ресурс:

[GX] SQL Запрос на создании темы - Создаем тему с помощью SQL - запроса.

Посмотреть вложение 41571

Инструкция:

Место `mysql` - напишите свою базу данных.

`mysql`.`xf_post`
post_id -
ID поста (сообщения)
thread_id - ID темы (где сообщение)
user_id - ID автора
username - Имя пользователя
post_date - Время создание сообщения
message - Сообщение
ip_id - ID (IP адреса)
message_state - Состояния сообщения
attach_count - Количество вложений
position - Позиция...

Узнать больше об этом ресурсе...
 
Пользователь Георгий Шевченко разместил новый ресурс:

[GX] SQL Запрос на создании темы - Создаем тему с помощью SQL - запроса.



Узнать больше об этом ресурсе...
Если делать напрямую через БД может возникнуть ряд проблем. Например: не верное отображение тем или появление тем только после перестроения. Лучше использовать DataWriter для этого. Мне когда-то помог товарищ с этим вопросом, на этом форуме(правда для создания ответов в темах), но можно легко взять это за основу этот скрипт и переделать на "создание темы". Скрипт:

Код:
$startTime = microtime(true);
$fileDir = dirname(__FILE__);

require($fileDir . '/library/XenForo/Autoloader.php'); //это если наш скрипт в корне, иначе надо путь прописать к файлам ксена
XenForo_Autoloader::getInstance()->setupAutoloader($fileDir . '/library');

XenForo_Application::initialize($fileDir . '/library', $fileDir);
XenForo_Application::set('page_start_time', $startTime);

$deps = new XenForo_Dependencies_Public();
$deps->preLoadData();

function postingOnForum($threadId, $message, $isQuote = false) {

        $threadModel = XenForo_Model::create('XenForo_Model_Thread');

        $forumModel = XenForo_Model::create('XenForo_Model_Forum');

        $thread = $threadModel->getThreadById($threadId);
        $forum = $forumModel->getForumById(@$thread['forum_id']);

        if ($isQuote) {
//Загрузка последнего сообщения и обрамление в цитату.
            $postModel = XenForo_Model::create('XenForo_Model_Post');

            $lastPost = $postModel->getLastPostInThread($threadId);
            //С некоторыми ключами в массиве не уверен точно, надо сделать дамп и исправить возможно
            $message = '[QUOTE="'.$lastPost['username'].', post: '.$lastPost['message_id'].', member: '.$lastPost['user_id'].'"]'
                .$message.'[/QUOTE]';
        }

        $dw = XenForo_DataWriter::create('XenForo_DataWriter_DiscussionMessage_Post');
                $dw->set('message', $message);

$userId = XXX; //От кого пишем
$userName = 'YYY'; //От кого пишем

$dw->set('user_id', $userId);
$dw->set('username', $userName);

$dw->set('thread_id', $threadId); //В какую тему пишем

        $dw->setExtraData(XenForo_DataWriter_DiscussionMessage_Post::DATA_FORUM, $forum);
        return $dw->save();
    }
 
  • Мне нравится
Реакции: Hope
Если делать напрямую через БД может возникнуть ряд проблем. Например: не верное отображение тем или появление тем только после перестроения. Лучше использовать DataWriter для этого. Мне когда-то помог товарищ с этим вопросом, на этом форуме(правда для создания ответов в темах), но можно легко взять это за основу этот скрипт и переделать на "создание темы". Скрипт:

Код:
$startTime = microtime(true);
$fileDir = dirname(__FILE__);

require($fileDir . '/library/XenForo/Autoloader.php'); //это если наш скрипт в корне, иначе надо путь прописать к файлам ксена
XenForo_Autoloader::getInstance()->setupAutoloader($fileDir . '/library');

XenForo_Application::initialize($fileDir . '/library', $fileDir);
XenForo_Application::set('page_start_time', $startTime);

$deps = new XenForo_Dependencies_Public();
$deps->preLoadData();

function postingOnForum($threadId, $message, $isQuote = false) {

        $threadModel = XenForo_Model::create('XenForo_Model_Thread');

        $forumModel = XenForo_Model::create('XenForo_Model_Forum');

        $thread = $threadModel->getThreadById($threadId);
        $forum = $forumModel->getForumById(@$thread['forum_id']);

        if ($isQuote) {
//Загрузка последнего сообщения и обрамление в цитату.
            $postModel = XenForo_Model::create('XenForo_Model_Post');

            $lastPost = $postModel->getLastPostInThread($threadId);
            //С некоторыми ключами в массиве не уверен точно, надо сделать дамп и исправить возможно
            $message = '[QUOTE="'.$lastPost['username'].', post: '.$lastPost['message_id'].', member: '.$lastPost['user_id'].'"]'
                .$message.'[/QUOTE]';
        }

        $dw = XenForo_DataWriter::create('XenForo_DataWriter_DiscussionMessage_Post');
                $dw->set('message', $message);

$userId = XXX; //От кого пишем
$userName = 'YYY'; //От кого пишем

$dw->set('user_id', $userId);
$dw->set('username', $userName);

$dw->set('thread_id', $threadId); //В какую тему пишем

        $dw->setExtraData(XenForo_DataWriter_DiscussionMessage_Post::DATA_FORUM, $forum);
        return $dw->save();
    }

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

Ну а так спасибо, может тоже пригодиться :)
 
Не знаю что может быть не так, у меня работает всё отлично, без всяких проблем, и перестраивать не нужно.
Никто не говорит что это самый кошерный вариант, это просто вариант создания одной темы с помощь SQL запроса.
Понятное дело если нужно много тем создать, тут нужно уже чуть по другому делать.

Ну а так спасибо, может тоже пригодиться :-)
По идеи с вашим вариантом будут проблемы точно в: Не будет добавляться кол-во созданных тем для юзера, возможно в профиле этого же юзера созданные таким способом темы не будут отображаться.
 
Я использую для этого полностью штатные средства Ксены - DataWriter.
Примерно так:

... подключаем классы Ксены ...

Код:
$userModel = XenForo_Model::create('XenForo_Model_User');
$user = $userModel->getUserById($authorID);
$authorName = $user['username'];

$newThread = XenForo_DataWriter::create('XenForo_DataWriter_Discussion_Thread');
$newThread->set('user_id', $authorID);
$newThread->set('username', $authorName);
$newThread->set('title', $subject);
$newFirstPostInThread = $newThread->getFirstMessageDw();
$newFirstPostInThread->set('message', XenForo_Helper_String::autoLinkBbCode($messageText));
$newThread->set('node_id', $forumId);
$newThread->preSave();

if (!$newThread->hasErrors()) {
$newThread->save();
} else {
print_r($newThread->hasErrors());
}
Автоматом срабатывает все счетчики постов и тем, поисковый индекс сразу норм работает. Количество постов у юзверя и дата поста норм.

Может кто делал создание меток сразу при постинге темы ?
 
Современный облачный хостинг провайдер | Aéza
Назад
Сверху Снизу