Перейти к контенту
  • 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().

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

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

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

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить на вопрос...

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

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

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

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

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

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

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

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