Написание простой функции на стандартных классах XenForo

Статус
В этой теме нельзя размещать новые ответы.

DiWorm

Проверенные
Сообщения
440
Реакции
142
Баллы
5,545
Добрый день,

Пытался сам, взорвался мозг от структуры форума :) По этому прошу платной помощи, ну или бесплатной, если кому-то крайне скучно))

Задача: Требуется написать простую функцию на PHP с использованием стандартных классов форума для использования в HTML формах сайта.
Подробнее: Функция должна принимать 3 значения: 1. Номер топика на форуме 2. Текст (с возможностью вставки BB кодов(не уверен, что есть какие-то проверки, но лучше уточнить)) 3. Цитировать предыдущее сообщение или нет (0/1). Целью соответственно будет отправить сообщение в конкретный пост форума по его номеру включая все проверки движка(установить, что есть новые сообщения, соблюдать порядок сообщений и т.п.).

Согласны взяться за работу? Пишите Л.С. с указанием цены.
 
Целью соответственно будет отправить сообщение в конкретный пост форума по его номеру включая все проверки движка(установить, что есть новые сообщения, соблюдать порядок сообщений и т.п.).
То есть должна к конкретному посту должна добавлять в базу к посту дополнительный текст или же добавлять текст с какой то другой таблицы БД?
Функция должна принимать 3 значения: 1. Номер топика на форуме 2. Текст (с возможностью вставки BB кодов(не уверен, что есть какие-то проверки, но лучше уточнить)) 3. Цитировать предыдущее сообщение или нет
Где это должно вводится в админке или пользовательской части?
 
То есть должна к конкретному посту должна добавлять в базу к посту дополнительный текст или же добавлять текст с какой то другой таблицы БД?
Не совсем меня поняли, возможно я не так выразился. На примере:
функция
Код:
postingOnForum(11880, "some text", 1);
Результатом выполнения которой будет ответ к данному посту (xf_post.thread_id = 11880) с цитирование последнего, кто оставил сообщение. Цитирование не критический функционал, можно обойтись без него.

Где это должно вводится в админке или пользовательской части?
Не должно никак интегрироваться в форум, просто отдельная PHP функция.

Cейчас я сделал через прямые запросы, но вот проблема, если я выполняю простой запрос на вставку записи, то запись появляется только после перекешированя форума и перестройки сообщений в посте.. Кусок из моего кода:
Код:
                    $db  = new mysql();
                    if(!$db->IsConnected())
                        exit("db error");
                   
                    $date = time();
                   
                    $q = "SELECT MAX( `position`) + 1 FROM `xf_post` WHERE `thread_id` = '{$threadID}'";
                    $maxPosition = $db->query($q);
                    
                    $text = htmlspecialchars(trim($text));
                    $q = "INSERT INTO `XXX`.`xf_post` (`post_id`, `thread_id`, `user_id`, `username`, `post_date`, `message`, `ip_id`, `message_state`, `attach_count`, `position`, `likes`, `warning_id`, `warning_message`, `last_edit_date`, `last_edit_user_id`, `edit_count`) VALUES (NULL, '{$threadID}', '{$userID}', '{$username}', '{$date}', '{$text}', '0', 'visible', '0', '{$maxPosition}', '0', '0', '', '0', '0', '0');";
                    $db->query($q);
После многочисленных гуглингов и вопросов по разным сообществам собрал единую идею, что нужно подключать файлы форума к скрипту с функцией и использовать штатный DataWriter для конечной цели, чтобы не было проблем.
 
Код:
<?php
$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 = 1; //От кого пишем
$userName = 'SomeName'; //От кого пишем

$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();
    }
 
Последнее редактирование:
Код:
<?php
$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 = 1; //От кого пишем
$userName = 'SomeName'; //От кого пишем

$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();
    }

вот как.. спасибо :-) чуть позже проверю, отпишусь по результатам.

UPD. Проверил, работает. Спасибо большое!

Тему можно закрыть, если вы перфекционист и хотите использовать код выше: объявите переменную $thread до ее вызова или используйте такой код (21 строка)
$forum = $forumModel->getForumById(@$thread['forum_id']);
 
Статус
В этой теме нельзя размещать новые ответы.
Современный облачный хостинг провайдер | Aéza
Назад
Сверху Снизу