Skocz do zawartości
"Idzie nowe..." - o zmianach i nie tylko ×
Przeniesienie zakupów z IPS Marketplace / Moving bought items from IPS Marketplace ×

Rekomendowane odpowiedzi

Opublikowano

Witam

W sumie krótkie pytanie

Czy korzystając z klasy sources\classes\post\classPost można pobrać listę tematów lub postów wg id, jeśli tak to jak?

Próbuję to zrobić z zewnętrznej aplikacji, forum to v3.0.3

rejestr i kontroler wgrany i zainicjowany bo tablice aktualnie zalogowanego usera mogę vardumpować

Jeśli się mylę to proszę mnie poprawić

require_once( IPSLib::getAppDir( 'forums' ) . '/app_class_forums.php' );
$appClass       = new app_class_forums( $this->registry ); 

require_once( IPSLib::getAppDir( 'forums' ) . '/sources/classes/post/classPost.php' );
$post = new classPost( $this->registry );

i co dalej?

$post->setIsPreview( false );
$post->setAuthor( 2 );
$post->setForumID( 62 );
$post->setTopicID(5803);
$post->setPostID(585001);
$post->setPublished( true );

$temp = $post->getTopicData();

var_dump($temp);

które z ustawień sa konieczne, które zbędne i co jest nie tak ze zwraca pusta tablice. Forum, topic, post id sa poprawne i dostępne dla gościa.

Wiem ze mogę pobrać to sobie zewnętrznym zapytaniem z bazy ale liczyłem na to ze uda się w taki sposób by od razu dostać sparsowaną treść postu bbcode na html i wyświetlić wg ostawień aktualnie zalogowanego usera.

Będę dźwięczny za każdą wskazówkę.

  • Manager
Opublikowano

Tak czy siak pobranie danych z bazy nie skutkuje, że te dane będą sparsowane. Wręcz odwrotnie - w bazie w serii 3.x tagi BBCode są zapisywane tak, jak je widać, czyli konieczne będzie ich sparsowanie.

Widzę, że wzorowałeś się na tym tutorialu:

Jednak on się odnosi do pisania, nie do pobierania.

Myślę, że to Cię może zaciekawić: (IM) IPB SDK V3.

intermedia - profesjonalne rozwiązania Invision Power Board

---

Chcesz uzyskać szybko i sprawnie pomoc? Uzupełnij wersję i adres w profilu.

Opublikowano

Dzieki i zaciekawiło, ale logowanie i obsługę uzyszkodnika już mam dzięki artom dla deva. I właśnie teraz przydało by mi sie listowanie tematów czy postów jako powiedzmy komentarzy. Normalnie pobieram liste z bazy tego co mi potrzeba (tematu) osobnym zapytaniem i wynik przepuszczam przez forumowy parser (bbcode->html) jesli chodzi o tresc posta, podobnie jest z awatarem postu tak ze zwraca mi odpowiedni obrazek. Wydaje mi sie jednak ze to jest podejscie niejako dookola problemu.

Zapewne jest jakas funkcja ktora przyjmnie parametry w stylu topic_id, ofset limit i wypluje dane w postaci tablicy z przypisanym userem i sparsowanyą lub nie trescia. tylko jeszcze tego nie znalazlem ;/ a tego w sdk dla ipb 3 nie ma.

  • Manager
Opublikowano

No to może: admin/api/forums/api_topic_view.php

public function return_topic_list_data( $view_as_guest=0 )

;)

Tyle, że to dla listy tematów z forum. Jak widzisz innej funkcji to API nie oferuje, a zatem Twoje rozwiązanie jest poprawne.

A ładowanie tematu masz w: admin/applications/forums/modules_public/forums/topics.php

	/**
 * Loads the topic and forum data for the specified topic id
 *
 * @access	public
 * @param	mixed	$topic	Array of topic data, or single topic id
 * @return	void
 **/
public function loadTopicAndForum( $topic="" )

intermedia - profesjonalne rozwiązania Invision Power Board

---

Chcesz uzyskać szybko i sprawnie pomoc? Uzupełnij wersję i adres w profilu.

Opublikowano (edytowane)

Dzieki opcji 2 właśnie mniej więcej szukałem.

W jednym miejscu jest pobieranie postów forumowym builderem db, parsowanie treści, autora postu i kesz. Pozostało to tylko ubrać w zgrabna funkcje.

Edytowane przez OmegaOne
Opublikowano

Dzięki i bez obaw podzielę się wynikami, jestem mniej więcej w połowie drogi.

W sumie takie spostrzeżenie...

Zapytania do bazy to mogli by nieco zoptymalizować bo póki co to jakieś dziwne tam konstrukcje występują, przydało by się tez więcej trzymania się dry i kiss. Nie żebym ja był jakimś guru, i tak wiem która godzina ;)

Opublikowano (edytowane)

Słowem wstępu.

Zadanie jest proste, kod ma pobierać dane o temacie z uwzględnieniem ustawień user/gość na forum, listę postów pozwalając na stronicowanie i sortowanie wg daty wraz z awatarem autora. Treść postu powinna zostać sparsowana tak by tagi bbcode zostały zamienione na html.

Aby użyć funkcji należy mieć zainicjowany rejestr i kontroler a w konstruktorze klasy muszą znajdować się poniższe skróty, ale to chyba jest dość oczywiste.

       $this->DB         =  $this->registry->DB();
       $this->settings   =& $this->registry->fetchSettings();
       $this->request    =& $this->registry->fetchRequest();
       $this->lang       =  $this->registry->getClass('class_localization');
       $this->member     =  $this->registry->member();
       $this->memberData =& $this->registry->member()->fetchMemberData();
       $this->cache      =  $this->registry->cache();
       $this->caches     =& $this->registry->cache()->fetchCaches();

Funkcja info o temacie

wejście tid -> id tematu

wyjście false lub tablica z danymi tematu.

//----------------------------------------------------------------------------------
// Informacje o temacie wg ID
//----------------------------------------------------------------------------------

public function get_topic_info( $tid = 0 )
{
	//-----------------------------------------
	// id tematu jest niepoprawne, wychodzimy
	//-----------------------------------------

	if ( intval($tid) <= 0 )
	{
		return FALSE;
	}

	//-----------------------------------------
	// zapytanie do bazy o dane tematu
	//-----------------------------------------


	$this->DB->build( array( 'select' => '*', 'from' => 'topics', 'where' => 'tid=' . intval($tid) ) );									
	$this->DB->execute();

	$topic = $this->DB->fetch();


	//-----------------------------------------
	// temat nie jest zatwierdzony, wychodzimy
	//-----------------------------------------

	if ( $topic['approved'] != 1)
	{
		return FALSE;
	}

	//-----------------------------------------
	// nie ma uprawnień do oglądania 
	// tematów z tego forum, wychodzimy
	//-----------------------------------------

	if ( $this->registry->class_forums->forumsCheckAccess( $topic['forum_id'], 1, 'forum', $topic, TRUE) == FALSE )
	{
		return FALSE;
	}

	//-----------------------------------------
	// do tej pory ok, wychodzimy
	//-----------------------------------------

	return $topic;
}

Funkcja lista postów z tematu

wejście tid -> id tematu, page -> nr strony, limit -> ile postów na stronie, sort_field -> wg której kolumny sortujemy, sort_order -> jak sortujemy asc/desc

wyjście false lub tablica z danymi postów.

//----------------------------------------------------------------------------------
// lista postów wg ID tematu  
//----------------------------------------------------------------------------------

public function get_post_list ( $tid = 0, $page = 1, $limit = 10, $sort_field = 'pid', $sort_order = 'asc' ) 
{
	//----------------------------------------- 
	// id tematu jest niepoprawne, wychodzimy
	//-----------------------------------------

	if ( intval($tid) <= 0 )
	{
		return FALSE;
	}

	$tid = intval($tid);

	//-----------------------------------------
	// zapytanie o ilość postów w temacie
	//-----------------------------------------

	$this->DB->build( array(
							'select' => 'COUNT(*) as pcount',
							'from'   => 'posts',
							'where'  => 'topic_id=' . $tid . ' and queued=0'
						)	);

	$post_count 	= $this->DB->fetch( $this->DB->execute() );

	//-----------------------------------------
	// tematu nie ma w bazie, 
	// lub temat nie ma postów, wychodzimy
	//-----------------------------------------

	if ( $post_count <= 0 )
	{
		return FALSE;
	}

	//-----------------------------------------
	// nr strony, ilość postów na stronie
	// przeliczenie pozycji startowej i
	// końcowej limitu
	//-----------------------------------------

	$page 			= ( intval($page) <= 1 ) ? 1 : intval($page);
	$post_pp 		= (intval($limit) <= 0 ) ? (  ( intval( $this->settings['au_cutoff'] ) <= 0 ) ? 10 : intval( $this->settings['au_cutoff'] ) ) : intval($limit);
	$post_start 	= $post_pp * ( $page - 1 ); 
	$post_end		= $post_start + $post_pp;

	//-----------------------------------------
	// strona która nie istnieje, wychodzimy
	//-----------------------------------------

	if ( $post_start > $post_count )
	{
		return FALSE;
	}

	//-----------------------------------------
	// sortowanie a-z, z-a i wg jakiego pola
	//-----------------------------------------

	$sort_order 	= ( $sort_order != 'asc') ? 'desc' : 'asc';
	$sort_options	= array('pid', 'post_date' );
	$sort_field 	= ( !in_array($sort_field, $sort_options, TRUE) ) ? $sort_options[0] : $sort_field;

	//-----------------------------------------
	// ustawienie joina dodatkowych tabel
	//-----------------------------------------

	$_joins = array(
							array( 
									/*'select' => 'm.member_id as mid,m.name,m.member_group_id,m.email,m.joined,m.posts, m.last_visit, m.last_activity,m.login_anonymous,m.title,m.hide_email, m.warn_level, m.warn_lastwarn, m.members_display_name, m.members_seo_name, m.has_gallery, m.has_blog, m.members_bitoptions',*/
									'select' => 'm.member_id, m.name, m.member_group_id, m.warn_level, m.members_display_name, m.members_seo_name',
									'from'   => array( 'members' => 'm' ),
									'where'  => 'm.member_id=p.author_id',
									'type'   => 'left'
								),
							array( 
									'select' => 'pp.avatar_type, pp.avatar_location, pp.avatar_size, pp_reputation_points',//'pp.*',
									'from'   => array( 'profile_portal' => 'pp' ),
									'where'  => 'm.member_id=pp.pp_member_id',
									'type'   => 'left'
							),
							/*array( 
									'select' => 'g.g_access_cp',
									'from'   => array( 'groups' => 'g' ),
									'where'  => 'g.g_id=m.member_group_id',
									'type'   => 'left'
							)*/
						);	

	//-----------------------------------------					
	// join keszu postów jeśli jest
	//-----------------------------------------

	if ( IPSContentCache::isEnabled() )
	{
		if ( IPSContentCache::fetchSettingValue('post') )
		{
			$_joins[] = IPSContentCache::join( 'post', 'p.pid' );
		}
	}			

	//-----------------------------------------					
	// zapytanie o dane postów 
	//-----------------------------------------

	$this->DB->build( array( 
							'select'	=> 'p.*',
							'from'		=> array( 'posts' => 'p' ),
							'where'		=> 'topic_id='.$tid.' and queued=0',
							'order'		=> $sort_field .' '. $sort_order, 
							'add_join'	=> $_joins,
							'limit'  	=> array( $post_start, $post_end )
					)	);

	$oq = $this->DB->execute();

	while ( $row = $this->DB->fetch( $oq ) )
	{
		//-----------------------------------------
		// parsowanie danych, avatar, 
		// bbcode -> html tresci postu itp
		//-----------------------------------------

		$post[] = $this->parse_post( $row );

	}

	//-----------------------------------------
	// do tej pory ok, wychodzimy
	//-----------------------------------------

	return $post;		
}

Funkcja parsująca usera i treść postu

wejscie tablica -> post pobrany z bazy z poprzedniej funkcji

wyjscie tablica zwracajac sparsowane i skonwertowane dane w postaci array ( 'content' => dane posta, 'poster' => dane autora postu )

public function parse_post( $row = array() )
{
	$poster 		= array();

	//var_dump( $row );

	//-----------------------------------------
	// user czy gość?
	//-----------------------------------------

	if ( $row['author_id'] != 0 )
	{
		//-----------------------------------------
		// user jest w keszu?
		//-----------------------------------------

		if ( isset( $this->cached_members[ $row['author_id'] ] ) )
		{
			//-----------------------------------------
			// wiec wczytujemy
			//-----------------------------------------

			$poster = $this->cached_members[ $row['author_id'] ];
		}
		else
		{
			//-----------------------------------------
			// nie ma, wiec setup usera i zbieramy dane
			//-----------------------------------------

			//----------------------------------------------------------------------------------
			// pełny setup usera 
			/* $poster = IPSMember::buildDisplayData( $row, 
																array( 'signature' => 1, 
																'customFields' => 1, 
																'warn' => 1, 
																'avatar' => 1, 
																'checkFormat' => 1, 
																'cfLocation' => 'topic' ) ); */
			// poniżej uproszczona wersja
			//----------------------------------------------------------------------------------

			$poster['id'] 				= intval($row['author_id']);
			$poster['display_name'] 	= $row['members_display_name'];
			$poster['seo_name'] 		= ( $row['members_seo_name'] !='' ) ? $row['members_seo_name'] : IPSText::makeSeoTitle( $row['members_display_name'] );

			//-----------------------------------------
			// awatar w postaci ścieżki nie tagu img
			//-----------------------------------------

			$poster['avatar'] 			= preg_replace( "#<img(?:.+?)src=[\"'](\S+?)['\"][^>]+?>#is", "\\1", IPSMember::buildAvatar( $row ) );

			$poster['group_title'] 		= $this->caches['group_cache'][$row['member_group_id']]['g_title']; 
			$poster['warn_level']		= ( intval($row['warn_level']) <= 0 ) ? 0 : intval($row['warn_level']);

			//-----------------------------------------			
			// reputacja usera
			//-----------------------------------------

			if( $this->settings['reputation_enabled'] )
			{
				$poster['rep_total'] 	= $row['pp_reputation_points'] ? $row['pp_reputation_points'] : 0;
			}

			//-----------------------------------------			
			// dodajemy do keszu
			//-----------------------------------------

			$this->cached_members[ $row['author_id'] ] = $poster;

		}

	}
	else
	{
		//-----------------------------------------
		// setup gościa
		//-----------------------------------------

		//----------------------------------------------------------------------------------
		// pełny setup gościa 
		// $poster = IPSMember::setUpGuest( $row['author_name'] );
		// poniżej uproszczona wersja
		//----------------------------------------------------------------------------------

		$poster['id'] 				= 0;
		$poster['display_name'] 	= $this->settings['guest_name_pre'] . $row['author_name'] . $this->settings['guest_name_suf'];
		$poster['seo_name'] 		= IPSText::makeSeoTitle( $poster['display_name']);
		$poster['avatar'] 			= '';	
		$poster['group_title'] 		= $this->caches['group_cache'][$this->settings['guest_group']]['g_title'];
		$poster['warn_level']		= 0;
		$poster['rep_points']		= 0;
	}

	//-----------------------------------------
	// tresc posta w keszu?
	//-----------------------------------------

	if ( ! $row['cache_content'] )
	{
		//-----------------------------------------
		// parsujemy wg ustawień
		//-----------------------------------------

		IPSText::getTextClass( 'bbcode' )->parse_html				= 0;
		IPSText::getTextClass( 'bbcode' )->parse_nl2br				= 1;
		IPSText::getTextClass( 'bbcode' )->parse_bbcode				= 1;
		IPSText::getTextClass( 'bbcode' )->parse_smilies			= 1;//$row['use_emo'];
		IPSText::getTextClass( 'bbcode' )->parsing_section			= 'topics';
		IPSText::getTextClass( 'bbcode' )->parsing_mgroup			= $row['member_group_id'];
		IPSText::getTextClass( 'bbcode' )->parsing_mgroup_others	= $row['mgroup_others'];

		$row['post']	= IPSText::getTextClass( 'bbcode' )->preDisplayParse( $row['post'] );

		//-----------------------------------------
		// updatujemy kesz
		// przy ustawieniach wlasnych lepiej jednak nie
		//-----------------------------------------

		//IPSContentCache::update( $row['pid'], 'post', $row['post'] );
	}
	else
	{
		//-----------------------------------------
		// uzywamy danych z keszu
		//-----------------------------------------

		$row['post'] = '<!--cached-' . gmdate( 'r', $row['cache_updated'] ) . '-->' . $row['cache_content'];
	}

	//-----------------------------------------
	// szybki fix z <#EMO_DIR#> na katalog emotek 
	//-----------------------------------------

	$row['post']	= str_replace('<#EMO_DIR#>', $this->registry->output->skin['set_emo_dir'], $row['post']);

	$row['post'] 	= IPSText::getTextClass( 'bbcode' )->memberViewImages( $row['post'] );	

	//-----------------------------------------
	// setup tresci
	//-----------------------------------------

	$content['pid'] 		= $row['pid'];
	$content['post'] 		= $row['post'];
	$content['post_date'] 	= $row['post_date'];

	unset($row);

	return	array( 'content' => $content, 'poster' => $poster );
}

to chyba tyle, może się to komuś do czegoś przyda

wersja lekko testowana, wszelka konstruktywna krytyka mile widziana

Edytowane przez OmegaOne

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się
  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...

Powiadomienie o plikach cookie

Umieściliśmy na Twoim urządzeniu pliki cookie, aby pomóc Ci usprawnić przeglądanie strony. Możesz dostosować ustawienia plików cookie, w przeciwnym wypadku zakładamy, że wyrażasz na to zgodę.