Перейти к контенту
  • 0

API создания новой темы


Вопрос

Всем привет, проблема с API создания темы.

 

Вот файл 1.php, находится он в корне.

<?php
require_once( './initdata.php' );
require_once( IPS_ROOT_PATH . 'sources/base/ipsRegistry.php' );
$registry = ipsRegistry::instance();
$registry->init();
require_once( IPSLib::getAppDir( 'forums' ) . '/sources/classes/post/classPost.php' );
$forumID = 107;
$postClass = new classPost( $registry );
$postClass->setForumID( $forumID );
$postClass->setForumData( ipsRegistry::getClass('class_forums')->forum_by_id[$forumID] );
$postClass->setTopicTitle( "title" );
$postClass->setPostContent( "text" );
$postClass->setAuthor( 282 );
$postClass->addTopic();
?>

 

Тема создается только если файл открыл пользователь, у которого есть доступ к форуму ID 107, если у пользователя нет доступа, то тема не создается. У пользователя ID 282 есть доступ ко всему форуму. Из-за чего могут не создаваться темы, почему проверяет права пользователя, который открыл тему, а не права пользователя ID 282?

PS: Если запихнуть этот код в index.php, то тема тоже создается.

Изменено пользователем Иван_Никитаев
Ссылка на комментарий
Поделиться на других сайтах

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

  • 0

почитал код - вроде как сетАвтор должен принимать массив с пользователем, а не его ид

Взял отсюда: http://www.ibresource.ru/ipb3/network_and_integration

Если у меня есть доступ к форуму, то тема создается от автора ID 282, если я запихну код в index.php, то тема будет создана, не зависимо от того, есть у меня доступ к форуму или нет.

Ссылка на комментарий
Поделиться на других сайтах

  • 0

тут могут что угодно написать, для какой-нибудь не той версии

для начала откройте classPost.php и посмотрите комментарии перед функцией addTopic

там должно быть $this->setAuthor( $member );

так что попробуйте выгрузить полноценного пользователя из бд по всем правилам и передать в эту функцию

Ссылка на комментарий
Поделиться на других сайтах

  • 0

Единственная строка с setAuthor

$this->setAuthor( array_merge( $this->getAuthor(), $group_cache[ $this->getAuthor('member_group_id') ] ) );

Вот что нашел в функции addTopic

$topic = array( 'title'            => $this->_topicTitle,
				    'title_seo'		   => IPSText::makeSeoTitle( $this->_topicTitle ),
				    'state'            => $topic['state'],
				    'posts'            => 0,
				    'starter_id'       => $this->getAuthor('member_id'),
				    'starter_name'     => $this->getAuthor('member_id') ?  $this->getAuthor('members_display_name') : $this->request['UserName'],
				    'seo_first_name'   => IPSText::makeSeoTitle( $this->getAuthor('member_id') ?  $this->getAuthor('members_display_name') : $this->request['UserName'] ),
				    'start_date'       => IPS_UNIX_TIME_NOW,
				    'last_poster_id'   => $this->getAuthor('member_id'),
				    'last_poster_name' => $this->getAuthor('member_id') ?  $this->getAuthor('members_display_name') : $this->request['UserName'],
				    'seo_last_name'    => IPSText::makeSeoTitle( $this->getAuthor('member_id') ?  $this->getAuthor('members_display_name') : $this->request['UserName'] ),
				    'last_post'        => IPS_UNIX_TIME_NOW,
				    'author_mode'      => $this->getAuthor('member_id') ? 1 : 0,
				    'poll_state'       => ( count( $this->poll_questions ) AND $this->can_add_poll ) ? 1 : 0,
				    'last_vote'        => 0,
				    'views'            => 0,
				    'forum_id'         => $this->getForumData('id'),
				    'approved'         => ( $this->getPublished() === TRUE ) ? 1 : 0,
				    'pinned'           => intval( $topic['pinned'] ),
				    'topic_open_time'  => intval( $this->times['open'] ),
				    'topic_close_time' => intval( $this->times['close'] ) );

Используется ID пользователя, имя пользователя используется для версии 2.3.x

Такой же код по созданию темы стоит в register.php, при регистрации пользователя проверяет IP, если IP зарегистрированного пользователя уже ранее зарегистрирован, то создается тема в разделе, к которому есть доступ только у администроторов, тема создается без проблем.

Изменено пользователем Иван_Никитаев
Ссылка на комментарий
Поделиться на других сайтах

  • 0

  • имя тут ни при чем
  • права проверяются не здесь
  • искать надо в комментариях, если их нет - нуль кривой

/**
 * Post a new topic
 * Very simply posts a new topic. Simple.
 *
 * Usage:
 * $post->setTopicID(100);
 * $post->setForumID(5);
 * $post->setAuthor( $member );
 *
 * $post->setPostContent( "Hello [b]there![/b]" );
 * # Optional: No bbcode, etc parsing will take place
 * # $post->setPostContentPreFormatted( "Hello [b]there![/b]" );
 * $post->setTopicTitle('Hi!');
 * $post->addTopic();
 *
 * Exception Error Codes:
 * NO_FORUM_ID  : No forum ID set
 * NO_AUTHOR_SET	 : No Author set
 * NO_CONTENT	    : No post content set
 * NO_SUCH_FORUM  : No such forum
 * NO_REPLY_PERM	 : Author cannot reply to this topic
 * NO_POST_FORUM  : Unable to post in that forum
 * FORUM_LOCKED  : Forum read only
 *
 * @return mixed
 */
public function addTopic()
{

* Usage:

* $post->setTopicID(100);

* $post->setForumID(5);

* $post->setAuthor( $member );

Ссылка на комментарий
Поделиться на других сайтах

  • 0

  • имя тут ни при чем
  • права проверяются не здесь
  • искать надо в комментариях, если их нет - нуль кривой

/**
 * Post a new topic
 * Very simply posts a new topic. Simple.
 *
 * Usage:
 * $post->setTopicID(100);
 * $post->setForumID(5);
 * $post->setAuthor( $member );
 *
 * $post->setPostContent( "Hello [b]there![/b]" );
 * # Optional: No bbcode, etc parsing will take place
 * # $post->setPostContentPreFormatted( "Hello [b]there![/b]" );
 * $post->setTopicTitle('Hi!');
 * $post->addTopic();
 *
 * Exception Error Codes:
 * NO_FORUM_ID  : No forum ID set
 * NO_AUTHOR_SET	 : No Author set
 * NO_CONTENT	    : No post content set
 * NO_SUCH_FORUM  : No such forum
 * NO_REPLY_PERM	 : Author cannot reply to this topic
 * NO_POST_FORUM  : Unable to post in that forum
 * FORUM_LOCKED  : Forum read only
 *
 * @return mixed
 */
public function addTopic()
{

* Usage:

* $post->setTopicID(100);

* $post->setForumID(5);

* $post->setAuthor( $member );

  • имя тут ни при чем
  • права проверяются не здесь
  • искать надо в комментариях, если их нет - нуль кривой

/**
 * Post a new topic
 * Very simply posts a new topic. Simple.
 *
 * Usage:
 * $post->setTopicID(100);
 * $post->setForumID(5);
 * $post->setAuthor( $member );
 *
 * $post->setPostContent( "Hello [b]there![/b]" );
 * # Optional: No bbcode, etc parsing will take place
 * # $post->setPostContentPreFormatted( "Hello [b]there![/b]" );
 * $post->setTopicTitle('Hi!');
 * $post->addTopic();
 *
 * Exception Error Codes:
 * NO_FORUM_ID  : No forum ID set
 * NO_AUTHOR_SET	 : No Author set
 * NO_CONTENT	    : No post content set
 * NO_SUCH_FORUM  : No such forum
 * NO_REPLY_PERM	 : Author cannot reply to this topic
 * NO_POST_FORUM  : Unable to post in that forum
 * FORUM_LOCKED  : Forum read only
 *
 * @return mixed
 */
public function addTopic()
{

* Usage:

* $post->setTopicID(100);

* $post->setForumID(5);

* $post->setAuthor( $member );

В обоих случаях ошибка NO_START_PERM

Ссылка на комментарий
Поделиться на других сайтах

  • 0

вот это уже ближе к правде - прав нет, да

надо нахардкодить их для данной операции (и убедиться, что они снимаются после нее)

Ссылка на комментарий
Поделиться на других сайтах

  • 0

		if ( $this->registry->permissions->check( 'start', $this->getForumData(), $perm_array ) === FALSE )
	{
		if ( $this->_bypassPermChecks !== TRUE )
		{
			throw new Exception( 'NO_START_PERM' );
		}
	}

Вот на этом месте выдает ошибку, по-моему что-то не так в этой строчке

$postClass->setForumData( ipsRegistry::getClass('class_forums')->forum_by_id[$forumID] );

 

Массив

$this->getForumData()

Если у меня есть доступ к форуму

 

array(77) { ["id"]=> string(3) "107" ["topics"]=> string(1) "4" ["posts"]=> string(1) "7" ["last_post"]=> string(10) "1360165955" ["last_poster_id"]=> string(2) "31" ["last_poster_name"]=> string(5) "BaHeK" ["name"]=> string(29) "Платные админки" ["description"]=> string(0) "" ["position"]=> string(3) "107" ["use_ibc"]=> string(1) "1" ["use_html"]=> string(1) "0" ["password"]=> string(0) "" ["password_override"]=> string(0) "" ["last_title"]=> string(5) "title" ["last_id"]=> string(4) "1159" ["sort_key"]=> string(9) "last_post" ["sort_order"]=> string(3) "Z-A" ["prune"]=> string(3) "100" ["topicfilter"]=> string(3) "all" ["show_rules"]=> NULL ["preview_posts"]=> string(1) "0" ["allow_poll"]=> string(1) "1" ["allow_pollbump"]=> string(1) "0" ["inc_postcount"]=> string(1) "0" ["skin_id"]=> NULL ["parent_id"]=> string(2) "14" ["redirect_url"]=> string(0) "" ["redirect_on"]=> string(1) "0" ["redirect_hits"]=> string(1) "0" ["rules_title"]=> string(0) "" ["rules_text"]=> NULL ["notify_modq_emails"]=> string(1) "0" ["sub_can_post"]=> string(1) "1" ["permission_custom_error"]=> string(0) "" ["permission_showtopic"]=> string(1) "0" ["queued_topics"]=> string(1) "0" ["queued_posts"]=> string(1) "0" ["forum_allow_rating"]=> string(1) "0" ["forum_last_deletion"]=> string(10) "1360177643" ["newest_title"]=> string(5) "title" ["newest_id"]=> string(4) "1159" ["min_posts_post"]=> string(1) "0" ["min_posts_view"]=> string(1) "0" ["can_view_others"]=> string(1) "1" ["hide_last_info"]=> string(1) "0" ["name_seo"]=> string(85) "%d0%bf%d0%bb%d0%b0%d1%82%d0%bd%d1%8b%d0%b5-%d0%b0%d0%b4%d0%bc%d0%b8%d0%bd%d0%ba%d0%b8" ["seo_last_title"]=> string(5) "title" ["seo_last_name"]=> string(5) "bahek" ["last_x_topic_ids"]=> string(106) "a:4:{i:1159;s:10:"1360160732";i:1158;s:10:"1360160534";i:1154;s:10:"1360145139";i:1125;s:10:"1360095818";}" ["forums_bitoptions"]=> string(1) "0" ["disable_sharelinks"]=> string(1) "0" ["deleted_posts"]=> string(1) "0" ["deleted_topics"]=> string(1) "0" ["rules_raw_html"]=> string(1) "0" ["tag_predefined"]=> string(0) "" ["perm_id"]=> string(3) "127" ["app"]=> string(6) "forums" ["perm_type"]=> string(5) "forum" ["perm_type_id"]=> string(3) "107" ["perm_view"]=> string(10) "10,9,4,8,6" ["perm_2"]=> string(12) ",10,9,4,8,6," ["perm_3"]=> string(12) ",10,9,4,8,6," ["perm_4"]=> string(12) ",10,9,4,8,6," ["perm_5"]=> string(9) ",9,4,8,6," ["perm_6"]=> string(12) ",10,9,4,8,6," ["perm_7"]=> string(0) "" ["owner_only"]=> string(1) "0" ["friend_only"]=> string(1) "0" ["authorized_users"]=> NULL ["perm_read"]=> string(10) "10,9,4,8,6" ["perm_reply"]=> string(10) "10,9,4,8,6" ["perm_start"]=> string(10) "10,9,4,8,6" ["perm_upload"]=> string(7) "9,4,8,6" ["perm_download"]=> string(10) "10,9,4,8,6" ["bw_disable_tagging"]=> int(0) ["bw_disable_prefixes"]=> int(0) ["fid"]=> string(3) "107" } 

 

Если доступа нет

NULL

 

Из-за этого выдает ошибку NO_START_PERM, где редактировать функцию $this->getForumData()?

Хотя кажется быстрее будет вручную добавлять в базу, чем использовать кривое API.

Ссылка на комментарий
Поделиться на других сайтах

  • 0

Рушил проблему, отправив запрос о теме вручную, а не через API, т.к. лень искать и править кривые классы

$postClass->setForumData( ipsRegistry::getClass('class_forums')->forum_by_id[$forumID] );

->

include "conf_global.php";
$sql = mysql_connect($INFO['sql_host'], $INFO['sql_user'], $INFO['sql_pass']) or die("Unable to connect to MySQL.");
mysql_select_db($INFO['sql_database'], $sql) or die ("Unable to select database.");
mysql_set_charset( 'utf8' );
$q = mysql_query(" SELECT f.*,p.* FROM forums f  LEFT JOIN permission_index p ON ( p.perm_type='forum' AND p.app='forums' AND p.perm_type_id=f.id ) WHERE `id` = ".$forumID);
$postClass->setForumData(mysql_fetch_assoc($q));

Получилось так:

<?php
require_once( './initdata.php' );
require_once( IPS_ROOT_PATH . 'sources/base/ipsRegistry.php' );
$registry = ipsRegistry::instance();
$registry->init();
require_once( IPSLib::getAppDir( 'forums' ) . '/sources/classes/post/classPost.php' );
$forumID = 107;
$postClass = new classPost( $registry );
$postClass->setForumID( $forumID );
include "conf_global.php";
$sql = mysql_connect($INFO['sql_host'], $INFO['sql_user'], $INFO['sql_pass']) or die("Unable to connect to MySQL.");
mysql_select_db($INFO['sql_database'], $sql) or die ("Unable to select database.");
mysql_set_charset( 'utf8' );
$q = mysql_query(" SELECT f.*,p.* FROM forums f  LEFT JOIN permission_index p ON ( p.perm_type='forum' AND p.app='forums' AND p.perm_type_id=f.id ) WHERE `id` = ".$forumID);
$postClass->setForumData(mysql_fetch_assoc($q));
$postClass->setTopicTitle( "title" );
$postClass->setPostContent( "text" );
$postClass->setAuthor( 282 );
if($postClass->addTopic())
{
echo("ok");
}
else
{
echo($postClass->_postErrors."<br>".$postClass->getAuthor( 'member_id' )."<br>".$postClass->getAuthor('g_post_new_topics')."<br>".$perm_array);
}
?>

И все прекрасно создается.

Ссылка на комментарий
Поделиться на других сайтах

  • 0
$sql = mysql_connect($INFO['sql_host'], $INFO['sql_user'], $INFO['sql_pass']) or die("Unable to connect

 

Очередной унылый говнокод. Есть же драйвер форума для запросов в котором уже инициировано подключение к БД. А во вторых, вам нужно было просто для мембера добавить доп права, и никакие классы или файлы править не нужно.

 

//-------------------------
// Init
//-------------------------

define( 'IPB_THIS_SCRIPT', 'public' );
define( 'IPS_PUBLIC_SCRIPT', 'index.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();
$DB = $registry->DB();

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

$member_id = 282;
$member = IPSMember::Load( $member_id, 'members' );
$member['member_group_id'] = 4;
$member['g_post_new_topics'] = 1;

$forumID = 2;

$postClass = new classPost( $registry );
$postClass->setForumID( $forumID );
$postClass->setForumData( ipsRegistry::getClass('class_forums')->forum_by_id[$forumID] );
$postClass->setTopicTitle( "title" );
$postClass->setPostContent( "text" );
$postClass->setAuthor( $member );
if($postClass->addTopic())
{
echo "ok";
}
else
{
echo $postClass->_postErrors."<br>".
		$postClass->getAuthor( 'member_id' )."<br>".
		$postClass->getAuthor('g_post_new_topics')."<br>".
		$perm_array;
}

Изменено пользователем siv1987
Ссылка на комментарий
Поделиться на других сайтах

  • 0

Уважаемые форумчане добрый день!

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

Ссылка на комментарий
Поделиться на других сайтах

  • 0

Подцепляем класс с тегами:
 

if ( ! $registry->isClassLoaded('tags') )
		{
			require_once( IPS_ROOT_PATH . 'sources/classes/tags/bootstrap.php' );/*noLibHook*/
			$registry->setClass( 'tags', classes_tags_bootstrap::run( 'forums', 'topics' ) );
		}

Добавляем тэги:

$registry->tags->add( Теги , array('meta_id' => номер топика,
				   'meta_parent_id' => номер форума,
	  		           'member_id'	   => номер автора,
				   'meta_visible'   => 1 ) );
Ссылка на комментарий
Поделиться на других сайтах

  • 0

Тогда получается так нужно создать топик. Затем получить его номер. И отредактировать.

Но addTopic как я понел по документации не возвращает ID топика. Если ошибаюсь то поправте плиз.

Ссылка на комментарий
Поделиться на других сайтах

  • 0

Тогда получается так нужно создать топик. Затем получить его номер. И отредактировать.

Но addTopic как я понел по документации не возвращает ID топика. Если ошибаюсь то поправте плиз.

Вы уже знаете id форума, select - ом найти id поста не составит труда.

Ссылка на комментарий
Поделиться на других сайтах

  • 0

Ну не, сразу запросами лезть - не дело. Можно вот так $postClass->getTopicData() получить данные топика.

А можно вообще без дополнительного кода попробовать, добавить тегов через правку суперглобальной $_POST['ipsTags'] перед вызовом $postClass->addTopic().

Ссылка на комментарий
Поделиться на других сайтах

Присоединиться к обсуждению

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

Гость
Ответить на вопрос...

×   Вы вставили отформатированный текст.   Удалить форматирование

  Допустимо не более 75 смайлов.

×   Ваша ссылка была автоматически заменена на медиа-контент.   Отображать как ссылку

×   Ваши публикации восстановлены.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

Зарузка...
×
×
  • Создать...

Важная информация

Находясь на нашем сайте, вы соглашаетесь на использование файлов cookie, а также с нашим положением о конфиденциальности Политика конфиденциальности и пользовательским соглашением Условия использования.