Tworzenie własnych skryptów MyBB

Założony przez  ShadyFAN.

MyBB
Tworzenie własnych skryptów.

Pomyślałem, że podziele się tutaj z Wami wiedzą na temat tworzenia własnych rzeczy w Mybb. Może pierw słowem wstępu napiszę, że skrypt MyBB jest bardzo dobrym darmowym oprogramowaniem, godnym konkurencji z takimi skryptami jak choćby komercyjne vBulletin. W porównaniu do wspomnianego vBulettin autorzy omawianego forum stawiają na inne aspekty, MyBB jest bardziej 'minimalistyczne' tzn. nie ma zbyt przesadnej ilości funkcji jak ma to miejsce np. w phpBB - co w cale nie znaczy, że jest gorsze. Wręcz przeciwnie, dzięki przyjaznej budowie jest o wiele szybsze, optymalniejsze i na pewno znacznie wygodniejsze niż te phpBB ;) dlatego m.in. go tak bardzo lubię. Poza tym stosuję go wiele znanych for (jak choćby te, ktore teraz czytasz), a dzieje się tak zapewne z powodu, iż mało co 'zjada' i według mnie jest to najlepszy darmowy skrypt forum. Do innych zalet można zaliczyć świetne rozwijanie projektu przez ich programistów, czy ogromną ilość darmowych pluginów i motywów.

Kończąc gadanine, postanowiłem nie opisywać tworzenia pluginów, które choć są dobrym rozwiązaniem, bo można je wgrywać i usuwać automatycznie, to wymagają zagłębienia się w głębsze zakamarki MyBB jak choćby np. popularne w programowaniu huksy. Dlatego też tworzyć będziemy rzeczy na 'sztywno', tzn. pisać nowe pliki lub dopisywać kod do obecnych (jak ma to miejsce w MyBBowskich silnikach od gvw ;)) co przy tworzeniu projektu wyłącznie do naszego użytku, może okazać się szybsze no i z pewnością wygodniejsze. Opisując ten poradnik będę skupiał się w dużej mierze na grach. Nie przelewając więcej zbędnych słów, do dzieła!

Pierwsze co zrobimy, to utworzenie nowej podstrony naszego forum. Przed tym musimy zapoznać się z tym co już mamy, czyli doskonałym budulcem jakim jest MyBB. Warto zdać sobie sprawę, że gotowy jest już doskonały system logowania (którego z pewnością sami nie napisali byśmy rówie dobrze co zespół programistów z MyBB Group), mamy także dobre wsparcie w pozycjonowaniu, dużo rzeczy jest pisane pod kątem bycia przyjaznym dla botów. To tylko dwa z kilkunastu plusów tworzenia gry osadzonej w forum. Szereg dobrych funkcji do dyspozycji na każdym kroku, z których nauczymy sie korzystać w każdym calu przyszłego skryptu ;)

1. Tak jak chyba każde z for, MyBB opiera się na systemie szablonów. Osoby zaznajomione w obiektowe PHP z pewnością nie potrzebują wyjaśnienia, jednak nie zapominając o początkujących, pokrótce objaśnie, iż systemem szablonów nazywamy bibliotekę, która posiada zdefiniowane instrukcje (można by rzec symulowany język), za pomocą których wstawimy zmienny kod (czyli coś co dla każdego projektu jest inne np. tytuł strony, opisy działów, informacje o podstronach) do szkieletu (x)html. Za pomocą schematu możemy to przedstawić w następujący sposób:

Szablon strony:
<html>
<head>
     <title>{$tytul_strony}</title>
</head>
<body>
     {$wyglad_gory}
     Właścicielem tej strony jest {$autor}
     {$wyglad_dolu}
</body>
</html>

Plik php z m.in. informacją o nazwie strony:
pobranie informacji z jakiegoś źródła..
sprawdzenie informacji i przefiltrowanie pod jakimś kątem..
zapis informacji do zmiennej szablonowej..
$tytul_strony = informacje

Jak widać, tak o to prezentuje się schemat prostego zastosowania systemu szablonów. W szablonie ze szkieletem html odnosimy się do zmiennych będących przetwarzanych w innych plikach, jest to podobne zastosowanie do umieszczania wstawek <?php ?> w kodzie html. W MyBB nowe szablony tworzyć możemy za pomocą opcji w Panelu Administratora. W wersji 1.6.9 znajdziemy tą możliwość przechodząc kolejno w: ACP -> Style i szablony -> Szablony.

[Obrazek: 94463510.png]

Powinniśmy ujrzeć 3 podstawowe paczki:
1 - szablony globalne,
2 - szablony domyślne,
3 - szablony motywu - tych może być paczek kilka, w zależności od tego ile mamy wgranych motywów.

Szablony globalne są dostępne z każdego poziomu, dlatego też utworzymy nasz pierwszy szablon właśnie tam. Wybieramy Nowy szablon i w pole Nazwa szablonu wpisujemy po prostu jego identyfikacyjną nazwę np. przyklad. W treść wklejamy ten kod:
<html>
<
head>
    <
title>{$mybb->settings['bbname']} - {$pageTitle}</title>
    {
$headerinclude}
</
head>
<
body>
{
$header}
    {
$tresc}
{
$footer}
</
body>
</
html

Jest to zwykły kod html z zmiennymi szablonowymi.
$mybb->settings['bbname'] - zwraca nazwę strony, a $pageTitle obecnie przeglądaną zakładkę. Z kolei $headerinclude dołącza nie wartość, ale cały kod z takimi rzeczami jak nagłówki (słowa kluczowe, arkusz stylów etc). $header i $footer wyświetlają ciało strony (wszelkie divy i inne selektory) przed naszą własną treścią. Dopiero zmienna $tresc zostala stworzona przez nas samych i będzie przyjmować wszystko co tylko będziemy chcieli wypuścić w świat :) Zapiszmy ten szablon i przejdźmy do kwestii pliku php..

2. Ostatnim elementem w tworzeniu naszej podstrony będzie utworzenie jej źródła, czyli pliku php, który będzie przetwarzał to co chcemy i zwracał do zmiennej $tresc wcześniej utworzonego szablonu.

Utwórzmy nowy plik w głównym katalogu z forum nazywając go przyklad.php. Jako jego treść podajmy następujący kod:
<?php
define
("IN_MYBB"1);

$templatelist "przyklad";

require_once 
"./global.php";
require_once 
"./inc/init.php";

$pageTitle "Podstrona przykładowa";
add_breadcrumb("Podstrona przykładowa");

//nasz skrypt
$tresc 'Witaj świecie :)';
//koniec wykonywania naszego skryptu

$site "<html><head>";
eval(
"\$site .= \"".$templates->get("przyklad")."\";");
$site .= "</body></html>";

output_page($site);
?>

Omówienie:
define("IN_MYBB", 1);
- ten fragment tworzy stałą, która informuje jądro MyBB, że dany plik jest podstroną, a każdy plugin czy cokolwiek istniejące w katalogach systemowych dołączających go, nie może zostać wyświetlone za pośrednictwem ścieżki (np. strona.pl/inc/plugins/plugin.php). Na tym poziomie to co on dokładnie robi jest nie istotne, ważne aby każdy nasz plik miał tą stałą zdefiniowaną.

$templatelist = "przyklad";
- zmienna ta zawiera nazwy styli, które MyBB ma obecnie używać. oczywiście musi się tam znaleźć nasz głowny szablon (przyklad), a opcjonalnie (po przecniku) można dołączyć inne (np. jego rozczepione elementy).

require_once "./global.php";
require_once "./inc/init.php";

- dołącza jądro i funkcje MyBB.

$pageTitle = "Podstrona przykładowa";
- tytuł podstrony wyświetlany m.in. w tytule karty przeglądarki.

add_breadcrumb("Podstrona przykładowa");
- tzw. okrzuszki chleba, czyli przyjazna nawigacja strony, wyświetlana przed jej treścią. Jako element zmiennej podajemy nazwę podstrony, na której znajduje się użytkownik, opcjonalny jest również 2 parametr przyjmujący adres.

$site = "<html><head>";
eval("\$site .= \"".$templates->get("przyklad")."\";");
$site .= "</body></html>";

- zmienna $site przechowuje kod strony, a przy pomocy eval dodajemy do niej wcześniej utworzony szablon. Aby wybrać nasz szablon w $templates->get() podajemy jego nazwę.

output_page($site);
- wyświetla na ekranie wszystko co zawarliśmy w zmiennej $site - czyli wygląd strony.

Zapisz plik i uruchom go w przeglądarce (strona.pl/przyklad.php).
W ten oto sposób stworzyliśmy nasz pierwszy własny skrypt w MyBB.

3. Tekst na ekranie został wyświetlony bez żadnych obramowań i 'bajerów' (w zależności od stylu):
[Obrazek: przechwycenieobrazuekrar.png]

Ponieważ nasz szablon nie był zbyt bogaty w kod, możemy zmodyfikować go tak, aby uzyskać poniższe efekty:
[Obrazek: przechwycenieobrazuekrar.png]
kod:
<html>
<
head>
<
title>{$mybb->settings['bbname']} - {$pageTitle}</title>
{
$headerinclude}
</
head>
<
body>
{
$header}
<
table width="100%" cellspacing="0" cellpadding="{$theme['tablespace']}border="0" align="center" class="tborder">
<
tr>
<
td class="thead" valign="top" width="200" align="center">Tytuł box</td>
</
tr>
<
tr>
<
td class="trow1" valign="top" width="200" align="center" style="font-size: 12px">
Boczny box
</td>
<
td>&nbsp;</td>
<
td>
{
$tresc}
</
td>
</
tr>
</
table>
{
$footer}
</
body>
</
html
- została zastosowana tabelka dostępna w każdym motywie, różniąca się jedynie wyglądem.

Opcja kolejna zawierająca boczny pasek i prosty boks główny:
[Obrazek: przechwycenieobrazuekra.png]
kod:
<html>
<
head>
<
title>{$mybb->settings['bbname']}</title>
{
$headerinclude}
</
head>
<
body>
{
$header}
{
$ps_header_index}
<
div class="sidebar" style="float: right;width: 19%;">
<
table border="0" cellspacing="{$theme['borderwidth']}cellpadding="{$theme['tablespace']}class="tborder">
<
tr>
<
td class="thead"><strong>
Tytuł
</strong></td>
</
tr>
<
tr>
<
td class="trow1">
Tekst Tekst Tekst Tekst Tekst Tekst Tekst Tekst Tekst 
Tekst Tekst Tekst Tekst Tekst Tekst Tekst Tekst Tekst 
zamiast powyższego tekstu lepiej byłoby napisać zmienną {$paseki przypisywać do niej tą treść w dokumencie php (o ile ma być dynamiczna..)
</
td>
</
tr>
</
table>
</
div>
<
div class="forums" style="float: left;width: 80%;">
  <
div class="sidebar" style="float: right;width: 100%;margin-bottom: 1%">
    <
table border="0" cellspacing="0" cellpadding="4" class="tborder">
      <
tbody>
        <
tr>
          <
td class="thead">
            <
strong>Tytuł</strong>
          </
td>
        </
tr>
        <
tr>
          <
td class="trow1">
            {
$site}
          </
td>
        </
tr>
      </
tbody>
    </
table>
  </
div>
</
div>
{
$ps_footer_index}
<
br class="clear" />
{
$footer}
</
body>
</
html
- użyto 2 tabelek co wcześniej.

Jak widać możliwości są duże, a to tylko podstawowe struktury szablonów. Zawsze możemy posilić się wzorcem z instniejących już stron np. index - co pozwoli nam uzyskać taki sam wygląd jak strony głównej ;)

4. Wróćmy na chwilę do naszego pliku php i spróbujmy rozszerzyć go o jakieś dość sensowne instrukcję.
<?php
define
("IN_MYBB"1);

$templatelist "przyklad";

require_once 
"./global.php";
require_once 
"./inc/init.php";

$pageTitle "Podstrona przykładowa";
add_breadcrumb("Podstrona przykładowa");

if (
$mybb->user['uid'] == 0error_no_permission();

if (
$mybb->user['postnum'] >= 5) {
    
$kolor format_name('takim'$mybb->user['usergroup'], $mybb->user['displaygroup']);

    
$tresc 'Witaj '.$mybb->user['username'].', należysz do grupy '.$mybb->user['usergroup'].', która oznaczona jest kolorem: '.$kolor;
} else 
$tresc 'Nie masz nawet 5 postów..';

$site "<html><head>";
eval(
"\$site .= \"".$templates->get("przyklad")."\";");
$site .= "</body></html>";

output_page($site);
?>

Pierwszy raz odnieśliśmy się do danych użytkownika, które mamy do dyspozycji pod zmienną $mybb->user[indeks]. Jako indeksy służy nam tabela bazy danych mybb_users.

if ($mybb->user['uid'] == 0) error_no_permission();
- instrukcja warunkowa if sprawdza czy ID usera jest identyczne z 0 (czyli brak - niezalogowany), jeśli wynik zwróci prawdę wykonaj funkcję error_no_permission, oczywiście zamiast tej funkcji można podać die i wyświetlić komunikat o nie zalogowanym koncie, jednak MyBB ma coś lepszego.. ↓
error_no_permission();
- wyświetla formularz i informację z prośbą o zalogowanie bez przekierowania strony. Możemy tego użyć także do nie dopuszczenia kogoś na stronę. Jeśli warunek nie zostanie spełniony a ktoś będzie zalogowany, funkcja error_no_permission wyświetli informacje o niemożliwości przeglądania danej strony.
if ($mybb->user['postnum'] > 5) {
- sprawdźmy liczbę postów użytkownika i zezwólmy (bądź nie) na przegląd treści
format_name('takim', $mybb->user['usergroup'], $mybb->user['displaygroup']);
- funkcja ta wyświetla tekst (podany w 1 parametrze) pokolorowany według forumowych rang. 2 jak i 3 parametr wymaga podania grupy użytkownika.

Posile się moim skrawkiem kodu na skrypt czatu:
if(isset($mybb->input['n_msg'])) {
    if(
my_strlen($mybb->input['n_msg']) > 400 || my_strlen($mybb->input['n_msg']) < 4) {
        
$site .= '<script>alert("Wiadomość jest zbyt długa lub za krótka.");</script>';
    } elseif(
$mybb->user['usergroup'] == 5) {
        
$site .= '<script>alert("Przed napisaniem potwierdź rejestracje Twojego konta.");</script>';
    } else {
        require_once 
MYBB_ROOT 'inc/class_parser.php';
        
$parser = new postParser;

        
$options = array(
            
"allow_html" => 0,
            
"allow_mycode" => 1,
            
"allow_smilies" => 1,
            
"allow_imgcode" => 0,
            
"filter_badwords" => 0);

        
$msg $parser->parse_message($mybb->input['n_msg'], $options);

        
$new_msg = array(
        
"who" => $mybb->user['username'],
        
"what" => $db->escape_string($msg),
        
"when" => TIME_NOW);
        
$db->insert_query("chat"$new_msg);
        
header('Location: chat.php');
    }

W MyBB wszelkie zmienne superglobalne wysyłane do skryptu są filtrowane i dostępne spod $mybb->input['nazwa']. Nie musimy więc pisać $_POST['nazwa'], a mamy do użytku bezpieczne dane.

Mimo to nie możemy zapomnieć o sprawdzeniu ich przed dodaniem do bazy danych. escape_string jest aliasem funkcji mysql_real_escape_string w MySQLi - należy pamiętać o jej stosowaniu przed jakim kolwiek zapisem danych do db.

require_once MYBB_ROOT . 'inc/class_parser.php';
$parser = new postParser;

- dołączenie do skryptu funkcji formatujących tekst i przypisanie do zmiennej $parser obiektu klasy postParser.

$options = array(
"allow_html" => 0,
"allow_mycode" => 1,
"allow_smilies" => 1,
"allow_imgcode" => 0,
"filter_badwords" => 0);
$msg = $parser->parse_message($mybb->input['wiadomosc'], $options);

- przefiltrowanie danej zmiennej pod kątem opcji zawartych w tablicy $options. Zmieniając wartość na 1 możemy ustalić czy ciąg ma mieć możliwość wyświetlania obrazków, mycode (bbcode), html czy nawet ukrywania wulgaryzmów (jeśli forum ma je oczywiście włączone).

Gdy chchemy przefiltrować daną wartość pod kątem wyłącznie wulgaryzmów pomoże nam w tym metoda $parser->parse_badwords($wartosc);

$db->insert_query("tabela", $tablica_z_danymi);
- wykonuje zapytanie INSERT INTO do tabeli podanej w 1 parametrze, wpisując dane z tablicy 2 parametru.

$db->delete_query("chat", "id='".$db->escape_string($mybb->input['d_msg'])."'");
- usuwa rekord z tebeli podanej w 1 parametrze, a jako 2 ustalamy elementy klauzuli WHERE. Tak samo w 3 i 4 możemy podać ORDER BY i LIMIT.

zapytania typu SELECT lub UPDATE wykonujemy normalnie poprzez $db->query("zapytanie") choć do dyspozycji mamy przyjazną funkcję pobierającą rekord o danych warunkach:
$query = $db->simple_select('tabela', '*', "warunek1='wartość'");
- nie trudno się domyślić jak ona działa ;) zamiast "*" możemy podać konkretne pola zapytania.

TIME_NOW - stała przechowująca unixowy czas. Zaleca się jej używanie zamiast funkcji time().

$data = my_date($format_daty, $mybb->czat['kiedy']);
- konwertuje czas unixowy na normalną datę. Ustalając czas użytkownika jako pierwszy parametr funkcji możemy wyświetlić date według stref użytkowników (internacjonalizacja).

Przy okazji, za pomocą $mybb->settings odnosimy się do ustawień forum, zresztą wszystko podane po $mybb->* może odnosić się do jakiejś tabeli z bazy danych.

$dane = get_user($id);
- tworzy tablice z niektórymi danymi usera po podaniu jego ID (przydatne w rankingach etc.).

htmlspecialchars_uni($wartosc);
- funkcja działa podobnie jak htmlspecialchars wbudowane w php. Używamy jej do wyświetlenia pobranych danych.

my_substr, my_strlen i wszelkie tym podobne - aliasy zwykłych funkcji PHP (są oczywiście bardziej dostosowane do różnorodności forum).

get_thread_link($tid,NULL,"lastpost");
- tworzy link do tematu podanego w 1 parametrze, jako 3 możemy ustalić post, który ma wyświetlić (lastpost pokaże oczywiście ten ostatni).

get_profile_link($uid) / get_post_link($pid) /get_forum_link($fid)
- tworzy adres do profilu użytkownika/postu/forum po podaniu ID. Wygodne.

$lang->nazwa
- odniesienie się do zmiennych językowych. Nie przydatny dla nas śmieć, gdy tworzymy stronę w jednym jezyku. Można pisać na sztywno, bez edytowania paczek językowych.

require_once MYBB_ROOT.'inc/class_captcha.php';
$captcha = new captcha;
//$captcha->validate_captcha();

- dołącza captcha. W niektórych przypadkach wyręczy nam robote.

redirect($adres);
- przekierowuje w ładnym stylu z obsługą w obecnej stronie.

my_unsetcookie("coś");
- usuwa ciasteczko. (my_setcookie oczywiście tworzy nowe)

require_once MYBB_ROOT."inc/functions_image.php";
list($width, $height) = explode("|", $buddy['avatardimensions']);
$scaled_dimensions = scale_image($width, $height, 44, 44);

- scaluje obrazek (użyto funkcji scale_image dołączonej z pliku functions_image.php)

//poradnik ten pisalem juz dosc spory czas temu, w razie wystapienia jakichkolwiek bledow z gory przepraszam ;)
Matslom napisał 21.05.2013, 20:12:
Proszę Cię o dodanie tego wpisu także na naszą wiki, aby tutaj on nie zaginął.
ShadyFAN napisał(a):Wręcz przeciwnie, dzięki przyjaznej budowie jest o wiele szybsze, optymalniejsze i na pewno znacznie wygodniejsze niż te phpBB

1. Nie jest szybsze niż phpBB, jest odwrotnie. Kod MyBB jest na zupełnie innym poziomie, nie ma tu co chwila "dziwnych" zapisów, nie ma wstępnego parsowania, nie ma drzew binarnych... długo by wymieniać.

2. Nie ma rzeczy "optymalniejszych". Albo coś jest optymalne, albo nie.

3. Co do wygody to się zgadzam :D

4. MyBB nie jest minimalistyczne. To one ma nawalone sporo zbędnych rzeczy.

ShadyFAN napisał(a):1. Tak jak chyba każde z for, MyBB opiera się na systemie szablonów. Osoby zaznajomione w obiektowe PHP z pewnością nie potrzebują wyjaśnienia, jednak nie zapominając o początkujących, pokrótce objaśnie, iż systemem szablonów nazywamy bibliotekę, która posiada zdefiniowane instrukcje (można by rzec symulowany język), za pomocą których wstawimy zmienny kod

To co jest w MyBB trudno nazwać systemem szablonów. Ot eval i podstawienie zmiennych... sam piszesz o zdefiniowanych instrukcjach, symulowanym języku a... MyBB po prostu tego nie ma. Nie ma to też zbyt dużego związku z programowaniem obiektowym. Chyba że traktujesz oddzielenie logiki od widoku jako hermetyzację, ale to jednak co innego.

ShadyFAN napisał(a):require_once "./inc/init.php";

To jest zupełnie niepotrzebny zapis.
Plik global.php sam załącza init.php.
Warto zwrócić uwagę, że dołączanie samego init.php (bez global.php) przydaje się do obsługi xmlhttp.

ShadyFAN napisał(a):$db->delete_query("chat", "id='".$db->escape_string($mybb->input['d_msg'])."'");

W wypadku czegoś takiego jak id, czyli zakładam że wartość numeryczna, lepsze będzie jednak rzutowanie. Poza tym nie ma sensu w poradniku robić syf w kodzie - ta 1-2 zmienne więcej naprawdę nie zaszkodzą ;)


ShadyFAN napisał(a):$dane = get_user($id);
- tworzy tablice z niektórymi danymi usera po podaniu jego ID (przydatne w rankingach etc.).

Dla ścisłości: pobiera z tabeli users dane dla użytkownika o podanym ID (o ile nie znajdzie ich w swoim własnym podręcznym cache).
Dzieki, ze ktos wgle zwrocil uwage :D jak wspomnialem art ten byl pisany dosc spory czas temu, gdy moje ogolne pojecie o skryptach forum bylo bardzo niskie :P co do phpBB to dzieki, bo cos sie o nim wkoncu dowiedzialem, zwykle go nie lubilem (i nie przepadam), a ten tekst wstepny mozliwe, ze wydaje sie przesadny i zawyzony - akurat pisalem to by zachecic kogos do korzystania z MyBB - stad pewnie.ten przesad komplementow :P fajnie, ze wyraziles swoje refleksje, moze komus sie przyda ten oto tut, sam gdy poznawalem MyBB szukalem czegos takiego, bowiem integrowalem ten skrypt z gra i tak oto zajalem sie im na dluzsza mete.

Wytaptane z mojej Mini Galaktyki ;)
bardziej tutaj chyba tworzymy podstron:)
Dobra ale teraz pozostaje mi 1 pytanie. Np chcę zrobić aktywne menu. Zrobiłem szablon amxbans i plik amxbans.php i jak wywołać go w aktywnym menu? bo myślałem, że {$amxbans_active} zadziała lecz nic z tego ;D
Aktywne Zakładki Jak w I.P.B. Zrób tak, jak się nic nie stanie to dodaj to:
define('THIS_SCRIPT''amxbans.php'); 
Gdzieś na początku amxbans.php ;)
Mam zastosowane to na forum już dawno i chcę to podpiąć pod to...

Plik amxbans.php:

<?php
define('THIS_SCRIPT', 'amxbans.php');
define("IN_MYBB", 1);

$templatelist = "amxbans";

require_once "./global.php";
require_once "./inc/init.php";

$pageTitle = "Cs-Wojna.pl - AmxBans";
add_breadcrumb("AmxBans");

if ($mybb->user['uid'] == 0) error_no_permission();



$site = "<html><head>";
eval("\$site .= \"".$templates->get("amxbans")."\";");
$site .= "</body></html>";

output_page($site);
?>

(brak $tresc bo wyświetla się z szablonu a nie z tego pliku)

Szablon mam w globalnych. Dodałem
define('THIS_SCRIPT', 'amxbans.php'); a menu wygląda tak:

<li {$amxbans_active}><a href="{$mybb->settings['bburl']}/amxbans.php">AmxBans</a></li>

i dalej nie działa.
Spróbuj tak:
<?php
define
('THIS_SCRIPT''amxbans.php'); 
define("IN_MYBB"1);
require 
"./global.php";

$templatelist "amxbans";

require_once 
"./global.php";
require_once 
"./inc/init.php";

$pageTitle "Cs-Wojna.pl - AmxBans";
add_breadcrumb("AmxBans");

if (
$mybb->user['uid'] == 0error_no_permission();



$site "<html><head>";
eval(
"\$site .= \"".$templates->get("amxbans")."\";");
$site .= "</body></html>";

output_page($site);
?>

Ps. Dodawanie nowej podstrony



Użytkownicy przeglądający ten wątek:

1 gości