MyBB
Tworzenie własnych skryptów.
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
![;) ;)](https://webboard.pl/images/smilies/wink.png)
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
![;) ;)](https://webboard.pl/images/smilies/wink.png)
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
![;) ;)](https://webboard.pl/images/smilies/wink.png)
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]](http://img855.imageshack.us/img855/5234/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
![:) :)](https://webboard.pl/images/smilies/smilling.png)
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]](http://img22.imageshack.us/img22/5060/przechwycenieobrazuekrar.png)
Ponieważ nasz szablon nie był zbyt bogaty w kod, możemy zmodyfikować go tak, aby uzyskać poniższe efekty:
![[Obrazek: przechwycenieobrazuekrar.png]](http://img547.imageshack.us/img547/5060/przechwycenieobrazuekrar.png)
kod:![[Obrazek: przechwycenieobrazuekrar.png]](http://img547.imageshack.us/img547/5060/przechwycenieobrazuekrar.png)
<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> </td>
<td>
{$tresc}
</td>
</tr>
</table>
{$footer}
</body>
</html>
Opcja kolejna zawierająca boczny pasek i prosty boks główny:
![[Obrazek: przechwycenieobrazuekra.png]](http://img90.imageshack.us/img90/2789/przechwycenieobrazuekra.png)
kod:![[Obrazek: przechwycenieobrazuekra.png]](http://img90.imageshack.us/img90/2789/przechwycenieobrazuekra.png)
<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ą {$pasek} i 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>
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
![;) ;)](https://webboard.pl/images/smilies/wink.png)
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'] == 0) error_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');
}
}
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
![;) ;)](https://webboard.pl/images/smilies/wink.png)
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
![;) ;)](https://webboard.pl/images/smilies/wink.png)
Matslom napisał 21.05.2013, 20:12:
Proszę Cię o dodanie tego wpisu także na naszą wiki, aby tutaj on nie zaginął.
Proszę Cię o dodanie tego wpisu także na naszą wiki, aby tutaj on nie zaginął.