1. Приветствуем Вас на неофициальном форуме технической поддержки XenForo на русском языке. XenForo - коммерческий форумный движок от бывших создателей vBulletin, написанный на PHP.

Программное создание тем и сообщений на форуме

Тема в разделе "Статьи по XenForo Framework", создана пользователем FractalizeR, 17.10.2010.

Загрузка
  1. gunpowder

    gunpowder Активный пользователь

    Регистрация:
    17.09.13
    Сообщения:
    116
    Симпатии:
    1
    Версия XF:
    1.2.1
    Спасибо, работает.
     
  2. gunpowder

    gunpowder Активный пользователь

    Регистрация:
    17.09.13
    Сообщения:
    116
    Симпатии:
    1
    Версия XF:
    1.2.1
    Слушайте, братья, а как поставить Prefix ID? Я где-то взял код из внутреннего кода Ксении

    $newThread->set('prefix_id', $prefix_id);

    Не уверен, что он правильный, поскольку таки префикс не устанавливается.
     
  3. gunpowder

    gunpowder Активный пользователь

    Регистрация:
    17.09.13
    Сообщения:
    116
    Симпатии:
    1
    Версия XF:
    1.2.1
    Да, действительно не ставится префекс. Хотя везде где я нагуглил такой код используется , который выше.

    Ни у кого нет догадок почему так происходит? Темы создаются, никакиие ошибки вроде выводятся.
     
    Последнее редактирование: 02.04.2015
  4. infis

    infis Местный

    Регистрация:
    27.06.11
    Сообщения:
    5 966
    Симпатии:
    3 548
    Версия XF:
    1.5.9
    Какой-то неправильный у Вас код. Даже и близко подобного кода в ксене нет.
    Например, код, отвечающий за непосредственное сохранение темы, выглядит так:
    Код:
        $dw = XenForo_DataWriter::create('XenForo_DataWriter_Discussion_Thread');
         $dw->setExistingData($threadId);
         $dw->bulkSet($dwInput);
         $dw->setExtraData(XenForo_DataWriter_Discussion_Thread::DATA_FORUM, $forum);
         $dw->save();
    
     
  5. gunpowder

    gunpowder Активный пользователь

    Регистрация:
    17.09.13
    Сообщения:
    116
    Симпатии:
    1
    Версия XF:
    1.2.1
    В одном из мест API имено используется подобный, близко к подобному. Но тот код который я использую тоже рабочий. ОН и в гугле есть и в этой теме указан.

    Вот что пишет ксюша

    PHP:
    $writer XenForo_DataWriter::create('XenForo_DataWriter_Discussion_Thread');
         
    $writer->bulkSet(array(
           
    'user_id' => $visitor['user_id'],
           
    'username' => $visitor['username'],
           
    'title' => $input['title'],
           
    'prefix_id' => $input['prefix_id'],
           
    'node_id' => $forumId
         
    ));

         
    // discussion state changes instead of first message state
         
    $writer->set('discussion_state'$this->getModelFromCache('XenForo_Model_Post')->getPostInsertMessageState(array(), $forum));

         
    // discussion open state - moderator permission required
         
    if (!empty($input['_set']['discussion_open']) && $this->_getForumModel()->canLockUnlockThreadInForum($forum))
         {
           
    $writer->set('discussion_open'$input['discussion_open']);
         }

         
    // discussion sticky state - moderator permission required
         
    if (!empty($input['_set']['sticky']) && $this->_getForumModel()->canStickUnstickThreadInForum($forum))
         {
           
    $writer->set('sticky'$input['sticky']);
         }

         
    $postWriter $writer->getFirstMessageDw();
         
    $postWriter->set('message'$input['message']);
         
    $postWriter->setExtraData(XenForo_DataWriter_DiscussionMessage::DATA_ATTACHMENT_HASH$input['attachment_hash']);
         
    $postWriter->setExtraData(XenForo_DataWriter_DiscussionMessage_Post::DATA_FORUM$forum);
         
    $postWriter->setOption(XenForo_DataWriter_DiscussionMessage_Post::OPTION_MAX_TAGGED_USERS$visitor->hasPermission('general''maxTaggedUsers'));

    $writer->setExtraData(XenForo_DataWriter_Discussion_Thread::DATA_FORUM$forum);
    --- добавлено : 2 апр 2015 в 12:13 ---
    Вот этот кусок кода

    PHP:
    $writer->bulkSet(array(
    'user_id' => $visitor['user_id'],
    'username' => $visitor['username'],
    'title' => $input['title'],
    'prefix_id' => $input['prefix_id'],
    'node_id' => $forumId
    ));
    В принципе заменяет как я понимаю обычный Set по одному параметру. И как мы видим здесь есть prefix_id и видимо он работает. У меня же почему то нет, ставится 0, хотя параметр специально вывожу на страницу - там 1.
    --- добавлено : 2 апр 2015 в 12:13 ---
    Вот этот кусок кода

    PHP:
    $writer->bulkSet(array(
    'user_id' => $visitor['user_id'],
    'username' => $visitor['username'],
    'title' => $input['title'],
    'prefix_id' => $input['prefix_id'],
    'node_id' => $forumId
    ));
    В принципе заменяет как я понимаю обычный Set по одному параметру. И как мы видим здесь есть prefix_id и видимо он работает. У меня же почему то нет.
    --- добавлено : 2 апр 2015 в 12:15 ---
    Может быть нужно это вписать ?
    PHP:
    $dw->setExtraData(XenForo_DataWriter_Discussion_Thread::DATA_FORUM$forum);
    Не знаю зачем это нужно но $forum содержит либо ID либо имя форума. Вобщем, все равно не помогло.
     
    Последнее редактирование модератором: 10.04.2015
  6. infis

    infis Местный

    Регистрация:
    27.06.11
    Сообщения:
    5 966
    Симпатии:
    3 548
    Версия XF:
    1.5.9
    Во-первых, это далеко не весь код. А во-вторых, используется не set, а bulkSet, если Вы не обратили внимание. Я бы Вам посоветовал просто понять, как это должно работать, а не просто копировать куски кода из разных мест, ожидая, что должно сработать.
    --- добавлено : 2 апр 2015 в 12:16 ---
    И еще. Есть тег
    Код:
    [code]
    Используйте его.
     
    Последнее редактирование модератором: 10.04.2015
  7. gunpowder

    gunpowder Активный пользователь

    Регистрация:
    17.09.13
    Сообщения:
    116
    Симпатии:
    1
    Версия XF:
    1.2.1
    Вообщем,похоже проблема была в том что для префиксов не были выставлены используемые форумы :D
     
  8. gunpowder

    gunpowder Активный пользователь

    Регистрация:
    17.09.13
    Сообщения:
    116
    Симпатии:
    1
    Версия XF:
    1.2.1
    а как в бб коды хтмл сконвертить?
     
  9. Exile

    Exile Местный

    Регистрация:
    27.06.11
    Сообщения:
    997
    Симпатии:
    545
    Версия XF:
    1.4.4
    gunpowder, ну если учитывать что движок в html не хранит, то значит вы хотите конвертировать левый текст - а значит пишите конструкции замены используя магию preg_replace и регулярных выражений.
     
  10. FractalizeR

    FractalizeR XenForo Addicted

    Регистрация:
    27.09.10
    Сообщения:
    1 085
    Симпатии:
    832
    Версия XF:
    1.3.2
    Какую задачу вы пытаетесь решить?
     
  11. Sergey№1

    Sergey№1 Местный

    Регистрация:
    09.07.15
    Сообщения:
    6
    Симпатии:
    1
    Версия XF:
    1.4.4
    А можете выложить готовый аддон?
     
  12. SAS1024

    SAS1024 Местный

    Регистрация:
    23.04.15
    Сообщения:
    85
    Симпатии:
    87
    Версия XF:
    1.4.10
    Аддон? Который что будет делать?
    Кстати, вот обновленный пример кода, который создаёт тему.
    PHP:
            /** @var XenForo_DataWriter_Discussion_Thread $writer */
            
    $writer XenForo_DataWriter::create'XenForo_DataWriter_Discussion_Thread' );
            
    $writer->bulkSet( [
                
    'user_id'          => $userId,
                
    'username'         => $userName,
                
    'title'            => $title,
                
    'node_id'          => $nodeId,
            ] );
            
    $postWriter $writer->getFirstMessageDw();
            
    $postWriter->set'message'$message );

            
    $writer->preSave();

            if (
    $writer->hasErrors())
            {
                foreach (
    $writer->getErrors() as $threadError) {
                    echo 
    $threadError;
                }
            }

            
    $writer->save();
            
    $thread   $writer->getMergedData();
            
    $threadId $thread['thread_id'];
    Перед тем как его использовать, надо заполнить переменные $userId, $userName, $title, $nodeId, $message.
     
    GERAsimov и Sergey№1 нравится это.
  13. Sergey№1

    Sergey№1 Местный

    Регистрация:
    09.07.15
    Сообщения:
    6
    Симпатии:
    1
    Версия XF:
    1.4.4
    Вот какой код получился у меня

    PHP:
    <?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();

    //Если нужен какой-нить класс модели
    $threadModel XenForo_Model::create('XenForo_Model_Thread');

    //Если нужен DataWriter
      
    $dw = new XenForo_DataWriter_User();

    $authorID 1;
    $authorName 'test';
    $subject 'Заголовок';
    $messageText 'Поле с сообщением';
    $forumId 4;
      
    $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();
    }
    В итоге у меня не находит нужных классов:

    Код:
    Fatal error: Class 'XenForo_DataWriter_Discussion' not found
    Помогите решить проблему пожалуйста, заранее благодарен!

    p.s. XenForo версии 1.4.4.
     
    GERAsimov нравится это.
  14. SAS1024

    SAS1024 Местный

    Регистрация:
    23.04.15
    Сообщения:
    85
    Симпатии:
    87
    Версия XF:
    1.4.10
    Sergey№1, я бы вместо всяких $fileDir рекомендовал для начала указать нормальный абсолютный путь к директории с движком форума.
     
    Sergey№1 нравится это.
  15. Sergey№1

    Sergey№1 Местный

    Регистрация:
    09.07.15
    Сообщения:
    6
    Симпатии:
    1
    Версия XF:
    1.4.4
  16. SAS1024

    SAS1024 Местный

    Регистрация:
    23.04.15
    Сообщения:
    85
    Симпатии:
    87
    Версия XF:
    1.4.10
    Sergey№1, ну вы сравните пути в методах XenForo_Application::initialize и XenForo_Autoloader::getInstance()->setupAutoloader - видно же что пути отличаются от того, что был в require.

    Никакой магии в этом коде нет.
     
    Sergey№1 нравится это.
  17. Sergey№1

    Sergey№1 Местный

    Регистрация:
    09.07.15
    Сообщения:
    6
    Симпатии:
    1
    Версия XF:
    1.4.4
    пути изменил, теперь появились новые ошибки :
    Код:
    An exception occurred: Запрашиваемый форум не найден. in H:\OpenServer\domains\xenoForo\library\XenForo\DataWriter.php on line 1345
    
    XenForo_DataWriter->_haveErrorsPreventSave() in H:/OpenServer/domains/xenoForo/library/XenForo/DataWriter.php at line 1387
    XenForo_DataWriter->save() in H:/OpenServer/domains/xenoForo/library/XenForo/DataWriter/Discussion.php at line 542
    XenForo_DataWriter_Discussion->_updateContainerPostSave() in H:/OpenServer/domains/xenoForo/library/XenForo/DataWriter/Discussion.php at line 431
    XenForo_DataWriter_Discussion->_postSave() in H:/OpenServer/domains/xenoForo/library/XenForo/DataWriter.php at line 1409
    XenForo_DataWriter->save() in H:/OpenServer/domains/xenoForo/add/addNewTheame.php at line 37
    Причем и со старым кодом, и с вашим кодом одни и те же ошибки :(
     
  18. infis

    infis Местный

    Регистрация:
    27.06.11
    Сообщения:
    5 966
    Симпатии:
    3 548
    Версия XF:
    1.5.9
    Причем и со старым кодом, и с вашим кодом одни и те же ошибки :([/QUOTE]
    Это ведь не одни и те же ошибки. Если не находит классы, значит, неверные пути используются. А если не находит форум, значит классы загружаются, но вот передаваемые параметры не верны.
     
    Sergey№1 нравится это.
  19. Sergey№1

    Sergey№1 Местный

    Регистрация:
    09.07.15
    Сообщения:
    6
    Симпатии:
    1
    Версия XF:
    1.4.4
    Спасибо большое, решил проблему. Я неправильно заполнял поле 'node_id', залез в БД, посмотрел правильные значения в таблице 'xf_forum' и все стало на свои места!

    Всем спасибо за помощь!
     
    Последнее редактирование модератором: 12.07.2015
  20. n0rt37

    n0rt37 Активный пользователь

    Регистрация:
    29.12.13
    Сообщения:
    26
    Симпатии:
    6
    Версия XF:
    1.3.0
    парни, а не подскажете что в код добавить, чтобы таким же образом в тему можно было теги добавлять и например вложения?
     

Поделиться этой страницей