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

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();

 

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

 

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

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

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

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

Гость
Ответить в этой теме...

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

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

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

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

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

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

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

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