Перейти к публикации
Дизайн и модификация IPS Community IPBSkinsBETA
Поиск в
  • Дополнительно...
Искать результаты, содержащие...
Искать результаты в...
Kill The STRELOK

Создать новую тему в форуме API

Рекомендованные сообщения

Собственно не получается, используя API форума, создать новую тему в отдельной ветке форума. Создаю следующим кодом:

require_once( 'forums/initdata.php' );
 require_once( IPS_ROOT_PATH . 'sources/base/ipsRegistry.php' );

 $registry = ipsRegistry::instance();
 $registry->init();

 $forumID = '2';
 $memberID = '109';

 require_once( IPSLib::getAppDir( 'forums' ) . '/sources/classes/post/classPost.php' );

 $postClass = new classPost( $registry );
 $postClass->setForumID( $forumID );
 $postClass->setTopicTitle( "My Topic" );
 $postClass->setPostContent( "Hello, I am post content!" );
 $postClass->setAuthor( $memberID );

 try
 {
     $postClass->addTopic();
 }
 catch( Exception $error )
 {
     print $error->getMessage();
 }

В чём проблема? Ошибок код не выдаёт, но и тема на форуме не создаётся. IPB 3.2.3

Поделиться сообщением


Ссылка на сообщение

До боли знакомый кусок кода. Где взяли? :)

 

Нашел тут на форуме свой старый пример, он работает?

 

<?php

define('IPS_ENFORCE_ACCESS', true);
require_once( 'initdata.php' );
require_once( IPS_ROOT_PATH . 'sources/base/ipsRegistry.php' );
require_once( IPS_ROOT_PATH . 'sources/base/ipsController.php' );

$registry = ipsRegistry::instance();
$registry->init();

$classToLoad = IPSLib::loadLibrary( IPSLib::getAppDir( 'forums' ) . '/sources/classes/post/classPost.php', 'classPost', 'forums' );
$post = new $classToLoad( $registry );

$post->setForumID( 1 ); 
$post->setAuthor( 1 );
$post->setPostContent( "[i]Hello[/i] [b]there![/b]" );
$post->setTopicTitle('Hi!');

if($post->addTopic()) {
   echo 'Тема успешно создана';
} else {
   echo 'Ошибка: '.$post->_postErrors;
}

?>

 

Если нет, то какую ошибку выводит? Что-то вполне могло поменяться с тех пор.

Поделиться сообщением


Ссылка на сообщение

Помню тоже сталкивался с такой проблемы, что темы не хотели создаваться. вот мой - вроде работал.

 

$post->setForumID( $forum_id );
$post->setForumData( $registry->class_forums->forum_by_id[ $forum_id ] );
$post->setAuthor( $author_id );
$post->setPostContent( "[i]Hello[/i] [b]there![/b]" );
$post->setTopicTitle( 'Hi!' );
$post->setPublished( true );
$post->setSettings( array(
   'enableSignature' => 1,
   'enableEmoticons' => 1,
   'post_htmlstatus' => 0,
   'enableTracker'   => 0,
) );

if( ! $post->addTopic() )
{
die( 'Error addTopic: '.$post->_postErrors );
}

$topic_data = $post->getTopicData();

Поделиться сообщением


Ссылка на сообщение

$post->setForumData( $registry->class_forums->forum_by_id[ $forum_id ] );

 

Вот это - костыль - был нужен из-за бага в классе, исправленного в 3.2.3.

Поделиться сообщением


Ссылка на сообщение

Проблему решил! Использую этот класс:

<?php
class AddTopic {
   /**
    * @var classPost
    */
   private $post;

   function __construct() {
       if (!defined('IPB3_ROOT')) {
           define('IPB3_ROOT', 'forums');
       }

       define('IPB_THIS_SCRIPT', 'public');
       define('IPS_PUBLIC_SCRIPT', 'index.php');
       define('IPS_ENFORCE_ACCESS', true);

       require_once IPB3_ROOT.'/initdata.php';
       require_once IPS_ROOT_PATH.'sources/base/ipsRegistry.php';
       require_once IPS_ROOT_PATH.'sources/base/ipsController.php';

       ipsRegistry::init();

       // Нет смысла каждый раз заново создавать
       require_once IPSLib::getAppDir('forums').'/sources/classes/post/classPost.php';

       $this->post = new classPost(ipsRegistry::instance());
   }

   public function createTopic($memberId=1, $forumId=2, $topicTitle='Новая тема',
           $postContent='Тело сообщения', $timestamp=null) {
       if (!$timestamp) {
           $timestamp = time();
       }

       if (!isset(ipsRegistry::getClass('class_forums')->forum_by_id[$forumId])) {
           return false;
       }

       // Настраиваем
       $this->post->_timestamp=$timestamp;
       $this->post->setIsPreview(false);
       $this->post->setForumData(ipsRegistry::getClass('class_forums')->forum_by_id[$forumId]);
       $this->post->setForumID($forumId);
       $this->post->setAuthor($memberId);
       $this->post->setPublished(true);
       $this->post->setSettings(array(
           'enableSignature' => 1,
           'enableEmoticons' => 1,
           'post_htmlstatus' => 1,
           'enableTracker'   => 0,
           ));

       $this->post->setTopicTitle($topicTitle);

       // Проблема в том, что контент кешируется при первом вызове
       // чтобы работало - его нужно сбросить
       $this->post->setPostContentPreFormatted(null);
       $this->post->setPostContent($postContent);

       // Создаем тему
       try {
           if ($this->post->addTopic() === false) {
               // А тут все наши ошибки...
               // $this->post->_postErrors;

               echo 'Тема не может быть создана<br />';
               return false;
           }
       } catch(Exception $exc) {
           echo 'Ошибка при создании темы: '.$exc->getMessage().'<br />';
           return false;
       }

       // Получаем свойства новой темы и её первого сообщения
       return array(
           $this->post->getTopicData(),
           $this->post->getPostData()
       );
   }
}

?>

 

$topic = new AddTopic();
$Result = $topic->createTopic(1, 1, 'Название темы', 'Контент');
print_r($Result);

Поделиться сообщением


Ссылка на сообщение

Опять тот же код, но в обертке класса. Ну ок, для коллекции отлично будет :)

Поделиться сообщением


Ссылка на сообщение

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас

  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу.

×
×
  • Создать...