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

[Pomoc] Modyfikacja Custom Pages to działania z php


Sim00n

Rekomendowane odpowiedzi

Witam, piszę właśnie - a właściwie próbuję dodać własną stronę do IpBoard'a 3.0.2 . Przeszedłem wszystkie pliki, ale mój umysł po prostu nie potrafi ogarnąć jak tam dodać własną stronę.

Z pomocą przyszedł mi Custom Pages napisany przez DawPi'ego ale tam również jest problem bo nie można używać PHP. Z frustrowany tym, postanowiłem zmodyfikować kod pliku display.php tegoż modu, żeby przypisać wszystko na sztywno gdyż użyję tego tylko do jednej strony. No i tu kolejny problem...

Otóż zauważyłem, że tak linijka:

	    $page['cp_text']      = IPSText::getTextClass( 'bbcode' )->preDisplayParse( IPSText::getTextClass( 'bbcode' )->preDbParse( $page['cp_text'] ) );

przypisuję zmienne do tpl'i w postaci {$zmienna['wartosc;']} w tym wypadku {$page['cp_text']} .

Postanowiłem więc stworzyć swoją tabelkę i pobrać dane z niej w taki sposób:

	$panel = $this->DB->buildandFetch( array (
										'select'	=> 'UserName',
										'from'		=> 'users',
										'where' 	=> 'UserId = 2'
							   			) );

potem tylko linijeczka:

$panel['UserName']      = IPSText::getTextClass( 'bbcode' )->preDisplayParse( IPSText::getTextClass( 'bbcode' )->preDbParse( $panel['UserName'] ) );

oraz w tpl'u

 {$panel['UserName']}

Wszystko wygląda dobrze ale nic się nie wyświetla. Pomyślicie, że to wina zapytania - otóż nie bo sprawdziłem echo $panel['UserName']; i wszystko pięknie wyświetla.

Potem znalazłem tę linijkę :

$this->output = $this->registry->output->getTemplate('custompages')->showPage( $page );

Więc pomyślałem, że jak dodam taką samą ale ze zmienna $panel na końcu to będzie działać, otóż nie ...

Jeżeli ktoś ma jakiś pomysł lub wiedzę jak to zrobić, to proszę o wypowiedzenie się.

Dodatkowo mam pytanie czy IpBoard przechowuję gdzieś (w jakiejś ogólno dostępnej zmiennej/ciasteczku/sesji) id zalogowanego usera.

Z góry dzięki za pomoc - Pozdrawiam, Sim00n.

Odnośnik do komentarza
Udostępnij na innych stronach

  • Manager

Witamy na forum,

polecam znacznie bardziej to: :(

[ + ]

Dodatkowo mam pytanie czy IpBoard przechowuję gdzieś (w jakiejś ogólno dostępnej zmiennej/ciasteczku/sesji) id zalogowanego usera.

Tabela SQL o nazwie sessions.

intermedia - profesjonalne rozwiązania Invision Power Board

---

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

Odnośnik do komentarza
Udostępnij na innych stronach

Dzięki, jesteś wielki bo szukałem jak to zrobić przez długi czas. Mam jeszcze jedno pytanie, ponieważ próbuję pobrać dane z bazy danych i wyświetlić je na ekranie.

Mój kod:

$row = $this->DB->buildandFetch(array('select' => 'UserName', 'from' => 'users'));		
$this->output .= $row['UserName'];

To tylko przykład ale problem jest taki, że potrzebuje dodać tam WHERE id = (id właśnie zalogowanego na forum) i nie mam pojęcia jak pobrać wartość po = ;p

Proszę o pomoc, dziękuję za powitanie, i dziękuję za linka bo bardzo mi pomógł.

Pozdrawiam, Sim00n.

Odnośnik do komentarza
Udostępnij na innych stronach

  • Manager

Pisane z palca:

$row = $this->DB->buildAndFetch( array( 'select' => 'members_display_name', 'from' => 'members', 'where' => 'member_id = ' . $this->memberData['member_id'] ) );              

$this->output .= $row['members_display_name'];

P.s. nie wiem skąd wziąłeś te nazwy pól i tabel. :(

intermedia - profesjonalne rozwiązania Invision Power Board

---

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

Odnośnik do komentarza
Udostępnij na innych stronach

Niestety miałeś błąd więc poprawiłem Ci go gdyby ktoś inny szukał tego kodu:

$row = $this->DB->buildAndFetch( array( 
							'select' 	=> 'members_display_name',
							'from' 	=> 'members',
							'where' 	=> 'member_id = '.$this->memberData['member_id']
					) );              

$this->output .= $row['members_display_name'];

P.s. nie wiem skąd wziąłeś te nazwy pól i tabel. ;)

To moja tabelka z której chciałem pobrać dane :(

Dodatkowo mam jeszcze jedno pytanie, czy da się w środku tego kodu połączyć z inną bazą danych na innym serwerze, pobrać dane, zamknąć połączenie i zrobić to bezboleśnie :( ?

Dziękuję za dotychczasową pomoc, Pozdrawiam, Sim00n.

Odnośnik do komentarza
Udostępnij na innych stronach

  • Manager

Ale gafa, aż się poprawiłem i usunąłem mój kod z Twojego pliku.. Tak to jest, jak się pisze po %. :(

Cóż - odnośnie połączenia :( jest to możliwe. Trzeba po prostu otworzyć nowe połączenie.. ;)

intermedia - profesjonalne rozwiązania Invision Power Board

---

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

Odnośnik do komentarza
Udostępnij na innych stronach

No tak ale chyba zwykłe

mysql_connect('host', 'user', 'pass');
mysql_select_db('base');

Nie wystarczy bo wywala błąd, więc pewnie muszę użyć jednej z gotowych funkcji w IpBoardzie.

W pliku classDb.php na górze znalazłem w komentarzach mały tut jak używać klasy mysql w tym skrypcie ale nie ma nic o łączeniu się z bazą danych.

Dodatkowo mam jeszcze jeden problem. Muszę na tą stronę dodać dość pokaźny html: http://178.63.168.234/pawno/test.html (źródło strony)

no i potrzebuje do tego jakiś tpl bo dodawanie w php'ie skończy się tragicznie ... Jest jakaś możliwość podpięcia tpl'a do tego page.php z linku wyżej :( ?

Pozdrawiam, Sim00n.

Odnośnik do komentarza
Udostępnij na innych stronach

  • Manager

Nowy kod HTML::

$this->registry->output->getTemplate('global')->customBit();

W edycji skina w Globalne szablony dodajesz nowy o nazwie customBit() i w nim wklejasz ten kod.

Łączenie z SQL:

Plik: admin/sources/base/ipsRegistry.php

Interesujące Cię funkcje to m.in.: setDB( $db_driver, $key='', $settings=array() ).

Resztę info doszukaj.

intermedia - profesjonalne rozwiązania Invision Power Board

---

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

Odnośnik do komentarza
Udostępnij na innych stronach

U mnie to wygląda nieco inaczej bo ta linijka działa tak:

self::$handles['db']->setDB( ipsRegistry::$settings['sql_driver'] );

A zmienna $settings to

		if ( is_array( $INFO ) )
		{
			foreach( $INFO as $key => $val )
			{
				ipsRegistry::$settings[ $key ]	= $val;
			}
		}

Natomiast plik conf_global.php z którego są pobierane zmienna $INFO wygląda mniej więcej tak:

<?php
$INFO['sql_driver']			=	'mysql';
$INFO['sql_host']			=	'localhost';
$INFO['sql_database']		=	'piotrek';
$INFO['sql_user']			=	'root';
$INFO['sql_pass']			=	'**********';
$INFO['sql_tbl_prefix']			=	'ipb_';
.......
?>

Więc próbowałem tak:

$this->setDB( 'jakas_moja_baza' );

No tylko, że niestety na tym historia się kończy ponieważ nie wiem gdzie jest reszta funkcji lub jakie mają nazwy do ustawiania hosta, usera, hasła itd.

--------------------------

Co do kodu na template to masz błąd bo powinno być

       $this->output = $this->registry->output->getTemplate('global')->customBit();

Zapomniałeś o $this->output =

Znalazłem ten błąd przeglądając kod pliku display.php z modu Custom Pages bo twój kod mi nie działał :(

Jeszcze raz dziękuję, że mi pomagasz i Pozdrawiam, Sim00n.

Edytowane przez Sim00n
Odnośnik do komentarza
Udostępnij na innych stronach

  • Manager

$this->registry->dbFunctions()->setDB($this->app['db_driver'], 'hb',
			array(
				'sql_database' => 'db,
				'sql_user' => 'user',
				'sql_pass' => 'pass',
				'sql_host' => 'host',
				'sql_tbl_prefix' => 'prefix',
				'sql_charset' => 'charset',
			)
		);


Oczywiście, że kod działał, tylko on zwraca wartość, którą przypisuje się do zmiennej. Przecież nie podaję Ci gotowych kodów, musisz trochę pogłówkować. :thumbsup:

intermedia - profesjonalne rozwiązania Invision Power Board

---

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

Odnośnik do komentarza
Udostępnij na innych stronach

  • 2 miesiące temu...

Witam ponownie. Na samym początku chciałbym Cię DawPi przeprosić, że nie podziękowałem za całą pomoc ale przez wakacje zrobiłem sobie przerwę i nawet tu nie zaglądałem stąd ten nie takt.

Mam jeszcze jedno pytanie odnośnie powyższego, a mianowicie jak przypisywać zmienne z php'a do mojego TPL'a o nazwie CustomBit.

Pozdrawiam, Sim00n.

Odnośnik do komentarza
Udostępnij na innych stronach

  • Manager

Np. tak..

Kod PHP:

$this->registry->output->getTemplate( 'global' )->custom_tpl_bit( 'jakis tekst' );

Potem kod w bicie skina custom_tpl_bit ( ze zmienną np. $txt ):

{$txt}

intermedia - profesjonalne rozwiązania Invision Power Board

---

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

Odnośnik do komentarza
Udostępnij na innych stronach

Chodzi mi o to o czym napisałeś czyli o używanie zmiennych typu {$txt} w plikach TPL, tylko nie rozumiem jak przypisać te wartości. W kodzie powyżej nie ma nic co by wskazywało na nazwę zmiennej którą użyje w TPL'u.

Hmm, może ktoś z was używał smarty, to mi będzie prościej wytłumaczyć.

PHP:

$zmienna = "jakiś tekst";
$smarty->assign('txt', $zmienna);

W TPL użyje po prostu {$txt} żeby wyświetlić "jakiś tekst";

Pozdrawiam, Sim00n.

Edytowane przez Sim00n
Odnośnik do komentarza
Udostępnij na innych stronach

Wydaje mi się, że dalej nie rozumiesz co ja chcę zrobić lub ja źle rozumiem to o czym mówisz.

Załóżmy, że mam taką zmienna:

$zmienna = 'Jakiś tekst';

I jest ona w pliku /admin/applications/core/modules_public/global/page.php

Teraz chce w pliku TPL, w panelu adminka dodać {$zmienna} i chcę żeby na stronie wyświetliło się "Jakiś tekst" ...

Proszę o gotowca bo wydaje mi się, że już i tak zakręciliśmy za bardzo :thumbsup:

Pozdrawiam, Sim00n.

Odnośnik do komentarza
Udostępnij na innych stronach

  • Manager

Przecież to tak nie działa. Daj lepiej kod, jaki masz, bo faktycznie zakręciłeś - a wystarczy spojrzeć na jakieś moje proste mody, by zobaczyć, jak są przesyłane dane do szablonów.

intermedia - profesjonalne rozwiązania Invision Power Board

---

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

Odnośnik do komentarza
Udostępnij na innych stronach

<?php

if ( ! defined( 'IN_IPB' ) )
{
print "<h1>Incorrect access</h1>You cannot access this file directly. If you have recently upgraded, make sure you upgraded all the relevant files.";
exit();
}

class public_core_global_page extends ipsCommand
{
public function doExecute( ipsRegistry $registry ) 
{
	$this->registry   =  $registry;
	$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();

	switch( $this->request['do'] )
       	{
	    default:
		$this->showPage();
	}

/*	echo "<pre>";
	$this->output .= print_r($this->memberData);
	echo "</pre>";
*/

	$sql = $this->DB->buildAndFetch( array( 'select'	=> '*',
						'from'		=> 'konta_graczy',
						'where'		=> 'Wlasciciel = '.$this->memberData['member_id']
						) );

	$this->output .= "Imie Postaci: ".$sql['ImieNazwisko'];
	$this->output .= "<br>Poziom Uprawnieni: ".$sql['PoziomUprawnien'];
	$this->output .= "<br>KontoPremium: ".$sql['KontoPrenium'];
	$this->output .= "<br>CzasGry: ".$sql['CzasGry'];
	$this->output .= "<br>Plec: ".$sql['Plec'];
	$this->output .= "<br>Wiek: ".$sql['Wiek'];
	$this->output .= "<br>Narodowosc: ".$sql['Narodowosc'];
	$this->output .= "<br>CK :".$sql['CK'];
	$this->output .= "<br>Uciszony :".$sql['Uciszony'];

	$this->registry->getClass('output')->addContent( $this->output );
	$this->registry->getClass('output')->sendOutput( array( 'TITLE' => $this->page_title, 'JS' => 0, 'NAV' => $this->nav ) );
	}

	public function showPage()
	{
	$this->registry->output->setTitle( 'Panel Gracza ' );
	$this->registry->output->addNavigation( 'Panel Gracza '.$this->memberData['name'], '' );
	$this->output = $this->registry->output->getTemplate('global')->customBit();
}
}
?>

Wyobraź sobie teraz, że te wszystkie zmienne jak $sql['ImieNazwisko'], $sql['PoziomUprawnien'], ...itd.

Chcę używać w pliku TPL w taki sposób: {$ImieNazwisko}, {$PoziomUprawnien}, ...itd.

PS, usunąłem twoje komentarze i stopkę autorską żeby kod był tutaj bardziej przejrzysty.

Odnośnik do komentarza
Udostępnij na innych stronach

  • Manager

To wtedy trochę inaczej to trzeba zrobić, o tak:

<?php

if ( ! defined( 'IN_IPB' ) )
{
       print "<h1>Incorrect access</h1>You cannot access this file directly. If you have recently upgraded, make sure you upgraded all the relevant files.";
       exit();
}

class public_core_global_page extends ipsCommand
{
       public function doExecute( ipsRegistry $registry ) 
       {
        $sql = $this->DB->buildAndFetch( array( 'select'        => '*',
                                                'from'          => 'konta_graczy',
                                                'where'         => 'Wlasciciel = '.$this->memberData['member_id']
                                                ) );

		$this->registry->output->setTitle( 'Panel Gracza ' );
        $this->registry->output->addNavigation( 'Panel Gracza '.$this->memberData['name'], '' );
        $this->registry->getClass('output')->addContent( $this->registry->output->getTemplate( 'global' )->custom_tpl_bit( $sql ) );
        $this->registry->getClass('output')->sendOutput();
       }

}// End of class

I wtedy w grupie bitów global dodajesz nowy szablon o nazwie custom_tpl_bit ze zmienną o dowolnej nazwie ( nawet $sql, by Ci się nie myliło ).

intermedia - profesjonalne rozwiązania Invision Power Board

---

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

Odnośnik do komentarza
Udostępnij na innych stronach

Okej, wszystko wygląda dobrze ale zostało mi jeszcze jedno pytanie. Co jeżeli chciałbym dodać kilka zmiennych.

Próbowałem w taki sposób:

$this->registry->getClass('output')->addContent( $this->registry->output->getTemplate( 'global' )->custom_tpl_bit( $sql ) );
$this->registry->getClass('output')->addContent( $this->registry->output->getTemplate( 'global' )->custom_tpl_bit( $inna_zmienna ) );

I mój TPL wyświetlił się 2 razy. Jak to obejść :P ?

Pozdrawiam, Sim00n.

Odnośnik do komentarza
Udostępnij na innych stronach

  • Manager

$this->registry->getClass('output')->addContent( $this->registry->output->getTemplate( 'global' )->custom_tpl_bit( $sql, $inna_zmienna ) );

Potem pamiętaj, by w zmiennych szablonu dopisać drugą zmienną po przecinku.

intermedia - profesjonalne rozwiązania Invision Power Board

---

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

Odnośnik do komentarza
Udostępnij na innych stronach

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ę.