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

API. как создавать топики чтоб статистика обновлялась?


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

Так прочитать комментарии в файлах самого API и поиском по форуму воспользоваться, нэ?

 

А вот и НЭ! =)

И по форуму искал - страниц семь топиков отчитал...

 

При создании топика без "delay_rebuild = 1" все форумы пропадают; даже в админке.

 

Пробовал при включенном delay_rebuild заюзать tap_rebuild_forum($forumID) - исчезают все топики форума $forumID

А при tap_rebuild_stats() - пропадают все.

 

Однако, после того как что-то пропадает, при создании нового форума либо при ресинхронизации вручную (с открытой страницы управления форумами) - все встает на свои места.

 

Вопрос: это баг о котором я не знаю или как создавать топики и посты с грамотной ресинхронизацией статистики?

 

P.S.: все делаю по "EXAMPLE USAGE".

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

Вы на пол пути остановились. Делайте дебаг глубже.

 

Интерфес содержит только то, что описано в exmpl, следовательно делаете Вы все правильно. Работает, видимо что-то не так.

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

Интерфес содержит только то, что описано в exmpl, следовательно делаете Вы все правильно. Работает, видимо что-то не так.

 

И я к тому же склоняюсь! =)

 

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

а все к одному - tap_rebuild_forum - прячет все форумы, а tap_rebuild_stats - ваще ниче не делает.

 

ВЕЗДЕ где встречал РАБОЧИЙ код по созданию топиков/постов, там обязательно фигурирует delay_rebuild = 1

зачем это? позже понял - без него не работает (пропадают форумы).

 

я на 97% уверен что это баг, но фиксов не видел.

 

Вы лично добавляли топики/посты через АПИ? && статистика обновлялась?

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

Я, может, чего-то не понял, но у меня топики создавались и статистика обновлялась. Нечто в духе:

 

	$api = new api_topics_and_posts();
$api->ipsclass =& $this->ipsclass;
$api->set_author_by_name( $poster_name );
$api->set_post_content( $content['text'] );
$api->set_forum_id( $forum_id );
$api->set_topic_title( $content['title'] );
$api->set_topic_description( '' );
$api->topic_settings['topic_date'] = $content['time'];
$api->topic_invisible = $content['hide'];
$api->set_topic_state('open');
$api->create_new_topic();

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

<?php
require_once( './sources/api/api_topics_and_posts.php' );

$api = new api_topics_and_posts();
$api->api_init();

// ADD POST REPLY
$api->set_author_by_name('admin');
$api->set_post_content("<b>Hello World!</b> :D");
$api->set_topic_id( 1 );
# Default for show_signature is 1, added here for completeness
$api->post_settings['show_signature'] = 1;
# Optionally turn off rebuild to not rebuild topic, forum and stats
# $api->delay_rebuild = 1;
$api->create_new_reply();

echo "Post Created", '<br>';

// ADD NEW TOPIC
$api->set_author_by_name('admin');
$api->set_post_content("<b>Hello World!</b> :D");
$api->set_forum_id( 2 );
$api->set_topic_title('Hello World');
$api->set_topic_description('I am the description');
$api->set_topic_state('open');
$api->create_new_topic();

echo "Topic Created";
?>

 

Собственно никаких проблем.

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

Я, может, чего-то не понял, но у меня топики создавались и статистика обновлялась. Нечто в духе:

 

	$api = new api_topics_and_posts();
$api->ipsclass =& $this->ipsclass;
$api->set_author_by_name( $poster_name );
$api->set_post_content( $content['text'] );
$api->set_forum_id( $forum_id );
$api->set_topic_title( $content['title'] );
$api->set_topic_description( '' );
$api->topic_settings['topic_date'] = $content['time'];
$api->topic_invisible = $content['hide'];
$api->set_topic_state('open');
$api->create_new_topic();

 

Именно по этому варианту и делаю.

Но если не ставить "delay_rebuild = 1" то пропадают все форумы.

 

<?php
require_once( './sources/api/api_topics_and_posts.php' );

$api = new api_topics_and_posts();
$api->api_init();

// ADD POST REPLY
$api->set_author_by_name('admin');
$api->set_post_content("<b>Hello World!</b> :D");
$api->set_topic_id( 1 );
# Default for show_signature is 1, added here for completeness
$api->post_settings['show_signature'] = 1;
# Optionally turn off rebuild to not rebuild topic, forum and stats
# $api->delay_rebuild = 1;
$api->create_new_reply();

echo "Post Created", '<br>';

// ADD NEW TOPIC
$api->set_author_by_name('admin');
$api->set_post_content("<b>Hello World!</b> :D");
$api->set_forum_id( 2 );
$api->set_topic_title('Hello World');
$api->set_topic_description('I am the description');
$api->set_topic_state('open');
$api->create_new_topic();

echo "Topic Created";
?>

 

Собственно никаких проблем.

 

У меня v2.1.6 и API 2.1 там юзадж как у Dr.Freddy.

Однако, я пробовал и этот вариант - фатал еррор. Встречал его чаще в гугле - решил от старой версии, потому как выпадает в PHP Fatal error: Call to a member function on a non-object in /path/sources/ipsclass.php on line 405

в ipclass там обращение к $this->DB, который, не инициализирован.

причем это при api_init()

 

Посмотрел в api_init() перед инициализацией DB есть проверка ! defined( 'IPSCLASS_DB_LOADED' )

Если у меня раньше, глобально определен $ipsclass (нужен юзеров идентифицировать), то когда у него определилась DB при init_db_connection() он делает define( 'IPSCLASS_DB_LOADED', 1 ) =)

...

С этого момента при использовании далее API, api_init() перестает инициализировать DB и я получаю PHP Fatal error =))

 

Бага?

 

Короче, последний вариант, в моем случае не работает.

 

Как инициализировал $ipsclass ниже.

Было меньше, но я все что подозревал - повключал =)

 

define( 'IPB_THIS_SCRIPT', 'public' );
define( 'IPB_LOAD_SQL'   , 'queries' );

require_once('/path/forum/init.php');

require_once ROOT_PATH   . "sources/ipsclass.php";
require_once ROOT_PATH   . "sources/classes/class_display.php";
require_once ROOT_PATH   . "sources/classes/class_session.php";
require_once ROOT_PATH   . "sources/classes/class_forums.php";
require_once KERNEL_PATH . "class_converge.php";
require_once ROOT_PATH   . "conf_global.php";

$ipsclass = new ipsclass();
$ipsclass->vars = $INFO;

$Debug = new Debug;
$Debug->startTimer();

$ipsclass->init_db_connection();

$ipsclass->print			=  new display();
$ipsclass->print->ipsclass  =& $ipsclass;

$ipsclass->sess			 =  new session();
$ipsclass->sess->ipsclass   =& $ipsclass;

$ipsclass->forums		   =  new forum_functions();
$ipsclass->forums->ipsclass =& $ipsclass;

$ipsclass->parse_incoming();

$ipsclass->converge = new class_converge( $ipsclass->DB );

$ipsclass->initiate_ipsclass();

$ipsclass->member	 = $ipsclass->sess->authorise();

 

может, я чет не то делаю?

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

GiV, я верю что у Вас все работает. Я не говорю что Вы меня обманываете =)

может я криво объяснил...

 

если я глобально создаю ipsclass, то при его инициализации, выставляется глобальная константа IPSCLASS_DB_LOADED в 1 при любом вызове init_db_connection это происходит(ipsclass.php:558):

 

		if ( ! defined( 'IPSCLASS_DB_LOADED' ) )
	{
		define( 'IPSCLASS_DB_LOADED', 1 );
	}

 

при вызове api_init() идет проверка - "а не инициализировали ли мы уже DB" посредством глобальной константы IPSCLASS_DB_LOADED - если 1, то ниче не делаем.

api_core.php:164

		if ( ! defined( 'IPSCLASS_DB_LOADED' ) )
	{
		$this->ipsclass->vars['sql_force_new_connection'] = 1;
		$this->ipsclass->init_db_connection();
	}

 

Поэтому, DB никогда не инициализируется в объекте API елси экземпляр ipsclass создан!

 

Если концепция использования API позволяет создавать экземпляр класса ipsclass в контексте создания топиков, то это 100% баг.

 

Короче, в моем случае, вызов api_init() приведет к Fatal error.

 

Поэтому я пользую юзадж из файла api_topics_and_posts.php, где ссылку на ipsclass можно назначить

$api->ipsclass =& $this->ipsclass;

 

Помогите разобраться - почему ТАК не работает обновление статистики?

Я верю что тем путем все работает, а как быть в моем случае?

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

$this->ipsclass->init_load_cache( array('rss_export', 'bbcode', 'badwords', 'emoticons', 'settings', 'group_cache', 'systemvars', 'skin_id_cache', 'forum_cache', 'moderators', 'stats') );

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

Надеюсь я правильно понял - это после создания топика вставлять?

Вставил.

		$api->delay_rebuild = 1;
	$api->create_new_topic();
	$api->ipsclass->init_load_cache(array('rss_export', 'bbcode', 'badwords', 'emoticons', 'settings', 'group_cache', 'systemvars', 'skin_id_cache', 'forum_cache', 'moderators', 'stats'));

 

Топик создан, форумы на месте, стат. НЕ обновилась...

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

Да вообще то перед $api->ipsclass = & $this->ipsclass

 

=) дык это понятно

global $ipsclass;
$api->ipsclass = &$ipsclass;

 

на всякий случай весь кусок:

		global $ipsclass, $user;
	require_once('/path/sources/api/api_topics_and_posts.php');
	$api = new api_topics_and_posts();
	$api->ipsclass = &$ipsclass;
	$api->set_author_by_id($user->getID());
	$api->set_topic_description($df->russian($item->get('date'), true));
	$api->set_post_content($content);
	$api->set_forum_id($forumID);
	$api->set_topic_title($postTitle);
	$api->set_topic_state('open');
	$api->delay_rebuild = 1;
	$api->create_new_topic();
	$api->ipsclass->init_load_cache(array('rss_export', 'bbcode', 'badwords', 'emoticons', 'settings', 'group_cache', 'systemvars', 'skin_id_cache', 'forum_cache', 'moderators', 'stats'));

 

делал и

$ipsclass->init_load_cache(array('rss_export', 'bbcode', 'badwords', 'emoticons', 'settings', 'group_cache', 'systemvars', 'skin_id_cache', 'forum_cache', 'moderators', 'stats'));

 

ааа сорри перед строчкой "$api->ipsclass = &$ipsclass;" сделать init_load_cache?

сделал. ничего нового.

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

А такое у Вас работает?

<?php
define( 'IPB_THIS_SCRIPT', 'api' );

require_once( 'init.php' );

$INFO = array();

//--------------------------------
// Load our classes
//--------------------------------

require_once ROOT_PATH   . "sources/ipsclass.php";
require_once ROOT_PATH   . "conf_global.php";

# Initiate super-class
$ipsclass	   = new ipsclass();
$ipsclass->vars = $INFO;

$ipsclass->base_url = $ipsclass->vars['board_url'].'/index.'.$ipsclass->vars['php_ext'].'?';

$ipsclass->vars['sql_force_new_connection'] = 1;
$ipsclass->init_db_connection();

//-------------------------------
// DISPLAY Object?
//-------------------------------

require_once ROOT_PATH   . "sources/classes/class_display.php";

$ipsclass->print			=  new display();
$ipsclass->print->ipsclass  =& $ipsclass;


//-------------------------------
// SESSION Object?
//-------------------------------

require_once ROOT_PATH   . "sources/classes/class_session.php";

$ipsclass->sess			 =  new session();
$ipsclass->sess->ipsclass   =& $ipsclass;


//-------------------------------
// FORUMS Object?
//-------------------------------

require_once ROOT_PATH   . "sources/classes/class_forums.php";

$ipsclass->forums =  new forum_functions();
$ipsclass->forums->ipsclass =& $ipsclass;


//-------------------------------
// Converge Object?
//-------------------------------

require_once KERNEL_PATH . "class_converge.php";

$ipsclass->converge = new class_converge( $ipsclass->DB );

//-------------------------------
// Caches init?
//-------------------------------

$ipsclass->init_load_cache( array('rss_export', 'bbcode', 'badwords', 'emoticons', 'settings', 'group_cache', 'systemvars', 'skin_id_cache', 'forum_cache', 'moderators', 'stats') );

$ipsclass->initiate_ipsclass();
$ipsclass->md5_check = $ipsclass->return_md5_check();
$ipsclass->parse_incoming();

if ( ! is_object( $ipsclass->forums ) )
{
$ipsclass->forums->ipsclass   =& $ipsclass;
$ipsclass->forums->strip_invisible = 1;
$ipsclass->forums->forums_init();
}

$ipsclass->load_skin();



require_once( ROOT_PATH . '/sources/api/api_topics_and_posts.php' );

$api = new api_topics_and_posts();
$api->ipsclass =& $ipsclass;

// ADD POST REPLY
$api->set_author_by_name('admin');
$api->set_post_content("<b>Hello World!</b> :D");
$api->set_topic_id( 1 );
# Default for show_signature is 1, added here for completeness
$api->post_settings['show_signature'] = 1;
# Optionally turn off rebuild to not rebuild topic, forum and stats
# $api->delay_rebuild = 1;
$api->create_new_reply();

echo "Post Created", '<br>';

// ADD NEW TOPIC
$api->set_author_by_name('admin');
$api->set_post_content("<b>Hello World!</b> :D");
$api->set_forum_id( 2 );
$api->set_topic_title('Hello World');
$api->set_topic_description('I am the description');
$api->set_topic_state('open');
$api->create_new_topic();

echo "Topic Created";
?>

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

А такое у Вас работает?

 

Да, спасибо!!

 

короче, не хватало только

$ipsclass->init_load_cache( array('rss_export', 'bbcode', 'badwords', 'emoticons', 'settings', 'group_cache', 'systemvars', 'skin_id_cache', 'forum_cache', 'moderators', 'stats'));

 

вот теперь рабочий вариант:

define( 'IPB_THIS_SCRIPT', 'api' );

require_once('/path/forum/init.php');
$INFO = array();

require_once ROOT_PATH   . "sources/ipsclass.php";
require_once ROOT_PATH   . "conf_global.php";

$ipsclass	   = new ipsclass();
$ipsclass->vars = $INFO;

$ipsclass->vars['sql_force_new_connection'] = 1;
$ipsclass->init_db_connection();

require_once ROOT_PATH   . "sources/classes/class_session.php";

$ipsclass->sess			 =  new session();
$ipsclass->sess->ipsclass   =& $ipsclass;

require_once ROOT_PATH   . "sources/classes/class_forums.php";

$ipsclass->forums =  new forum_functions();
$ipsclass->forums->ipsclass =& $ipsclass;

require_once KERNEL_PATH . "class_converge.php";

$ipsclass->converge = new class_converge( $ipsclass->DB );

$ipsclass->init_load_cache( array('rss_export', 'bbcode', 'badwords', 'emoticons', 'settings', 'group_cache', 'systemvars', 'skin_id_cache', 'forum_cache', 'moderators', 'stats'));

$ipsclass->member	 = $ipsclass->sess->authorise();

 

предлагаю внести в документацию по АПИ - все что необходимо инициализировать чтобы работало по указанному примеру.

 

еще раз спасибо за уделенное время =)

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

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

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

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

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

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

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

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

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

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

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

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