Nawigacja
PHP-Fusion v7 - BBCodes API
Napisane przez Wooya dnia 30 czerwca 2008 21:42 · 3 komentarze · 10399 czytań · · ·
Streszczenie:
Aplication Programming Interface (API) dla bbcode w PHP-Fusion v7 Nowy system bbcodes zapoczątkowany w PHP-Fusion v7 (nie chwaląc się jam to uczynił ;) ) posiada 3 główne pliki:
1) NAZWA_bbcode_include.php - w tym pliku budujemy własnego interpretera dla naszego bbcode. Najprostszym przykładem jest bbcode służący do pogrubiania tekstu (usunięto nagłówek licencji):
< ?php
if (!defined("IN_FUSION")) { die("Access Denied"); }
$text = preg_replace('#\[b\](.*?)\[/b\]#si', '< strong>\1< / strong>', $text);
?>
Jak widzicie, pierwsza linia zwiera kod zabezpieczający przed bezposrednimi odwołaniami do pliku, a nastepna główną procedurę, która zamienia nam odpowiedni bbcode do postaci pogrubionego tekstu. Interpreter wyszukuje w zmiennej $text jakichkolwiek tagów [b][/b] i zamienia je na odpowiednie taki HTML - STRONG.
Ten plik jest wywoływany za każdym razem, gdy parsujemy jakikolwiek tekst przy pomocy funkcji parseubb(), pod warunkiem, że dany bbcode został włączony w panelu administracyjnym.
Informacja: zmienna $text jest wymagana w tym pliku! Nie można użyć innej zmiennej.
Ważne! nieinteraktywne nazwy bbcode (czyli takie, które nie posiadają własnego przycisku, ale powinny zostać przetworzone, np.: autolink bbcode) MUSZĄ zaczynać się od znaku !, np.: !autolink_bbcode_include.php, !autolink_bbcode_include_var.php
2) NAZWA_bbcode_include_var.php - ten plik zawiera informacje, niezbędne do wyświetlenia przycisku bbcode. Przykład (jeden z bardziej zaawansowanych bbcode, usunięto informację o licencji):
< br >";
}
return $generated;
}
}
$__BBCODE__[] =
array(
'description' => $locale['bb_geshi_description'],
'value' => "geshi",
'bbcode_start' => "[geshi=".$locale['bb_geshi_lang']."]",
'bbcode_end' => "[/geshi]",
'usage' => "[geshi=".$locale['bb_geshi_lang']."]".$locale['bb_geshi_usage']."[/geshi]",
'onclick' => "return overlay(this, 'bbcode_geshi_".$textarea_name."', 'rightbottom');",
'onmouseover' => "",
'onmouseout' => "",
'html_start' => ">",
'includejscript' => "",
'calljscript' => "",
'phpfunction' => "echo generate_geshi_langs('".$textarea_name."', '".$inputform_name."');",
'html_middle' => "",
'html_end' => "< / div>"
);
?>
Ten plik wymaga bardziej szczegółowych informacji:
- pierwsza linia zabezpiecza przed bezpośrednim dostępem do pliku
- jak widzicie możemy definiować własne funkcje wewnątrz własnych bbcode. Ważne: zawsze sprawdzajcie, czy dana funkcja nie została już wcześniej zdefiniowana przy pomocy funkcji function_exists(), ponieważ dany bbcode może być wywoływany więcej niż raz przy jednym przeładowywaniu strony
- tablica dwuwymiarowa$__BBCODE__:
- description - główny opis bbcode; zmienne lokalizacyjne mogą być wpisane bezpośrednio w pliku lub też zapisane w odpowiednim pliku lokalizacyjnym (locales/JĘZYK/bbcodes/NAZWA.php)
- value - nazwa bbcode; musi być taka sama jak prefix plików _bbcode_include.php, _bbcode_include_var.php i nazwa pliku lokalizacyjnego
- bbcode_start - początkowy tag bbcode; ten parametr może być wykorzystany do tworzenia do zamkniętych lub otwartych bbcode (otwarte bbcode, to takie, gdzie nie występuje tag zamykający; może zostać użyty, np.: jako bezpośredni link do danego artykułu)
- bbcode_end - końcowy tag bbcode; jeżeli chcesz utwożyć otwarty bbcode, zostaw to pole puste
- usage - krótka informacja na temat, jak używać danego bbcode; można wpisać tekst na trwałe lub użyć odpowiedniej zmiennej z pliku lokalizacyjnego
- onclick - ten parametr może zostać użyty np.: przy otwieralnych bbcode jak np.:P w powyższym przykładzie w GeSHi bbcode; głównym celem tego parametru jest używanie funkcji JS overlay(), która została zapoczątkowana w jscript.js v7 (użycie tej funkcji zostanie wyjaśnione później)
- onmouseover - jeżeli chcesz zrobić coś gdy twoja myszka znajduje się nad przyciskiem bbcode... przeznaczenie dla skryptów JS
- onmouseout - jak wyżej
- html_start - tutaj możesz zdefiniować początkowy kod HTML dla rozwijanych bbcode (i nie tylko; jakikolwiek kod HTML zostanie wykonany); w większości wypadków będzie to tag DIV; pamiętaj aby dodać funkcję JS do zdarzenia onclick - overlayclose(). W innym wypadku kliknięty button nie zamknie się aż do następnego przeładowania strony :) Powyżej możesz zobaczyć podstawowy schemat używania tej funkcji
- includejscript - jeżeli twój bbcode potrzebuje jakichkolwiek funkcji JS, to tutaj możesz załączyć pliki, które posiadają te funkcje; bbcode COLOR jest jednym z przykładów, który korzysta z tej funkcji
- calljscript - w tym miejscu możesz wywołać funkcję JS, która została zawarta w powyższym pliku
- phpfunction - tutaj wpisujesz funkcję PHP, którą chcesz wywołać; bbcode SMILEY jest jednym z bbcode, który korzysta z tej funkcji; wywołuje on funkcję display_smileys(); w bbcode GeSHi wywołaliśmy funkcję nazwaną generate_geshi_langs()
- html_middle - tutaj umieszczamy główny kod HTML dla naszych rozwijanych bbcode; jak widzicie powyżej, dzięki funkcji generate_geshi_langs() wygenerowaliśmy przyciski dla dostępnych języków parsera; są tam przyciski, które zawierają funkcję JS addText(), która dodaje nasze bbcode do pola TEXTAREA (używanie funkcji JS addText() i insertText() zostanie wyjaśnione dalej w tym artykule)
- html_end - w większości wypadków, będzie to tag zamykający DIV
2.a) małe wyjaśnienie na temat tablicy $__BBCODE_NOT_QUOTABLE__ ...
Zobaczmy przykład (hide_bbcode_include_var.php; pominięto nagłówek licencyjny):
if (!defined("IN_FUSION")) { die("Access Denied"); }
if (iADMIN) {
$__BBCODE__[] =
array(
"description" => $locale['bb_hide_description'],
"value" => "hide",
"bbcode_start" => "[hide]",
"bbcode_end" => "[/hide]",
"usage" => "[hide]".$locale['bb_hide_usage']."[/hide]"
);
} else {
$__BBCODE_NOT_QUOTABLE__[] = "hide";
}
?>
Zawartość tej tablicy pozwala na wycinanie z cytowanego źródła bbcode HIDE na forum. Dlaczego? To zdarzenie zostało zareportowane jako błąd, kiedy wiadomość wysłana przez administratora zawierała bbcode HIDE, to nie była ona widoczna dla zwykłych uzytkowników tak długo, aż ... użytkownik nie zacytował wiadomości administratora :) I dlatego. Jeżeli twój bbcode z jakichś przyczyn nie powinien być cytowany, to po prostu dodaj nowy element do tablicy $__BBCODE_NOT_QUOTABLE__ (który w rzeczywistości jest wartością "value" z danego bbcode)...
3) locale/JĘZYK/bbcodes/NAZWA.php - ten plik zawiera definicje lokalizacyjne dla bbcode. Tablice językowe nie są ustandaryzwoane, ale ja zdecydowałem się stosować poniższy schemat (przykład locale dla Allegro bbcode):
< ?php
$locale['bb_allegro'] = "Allegro";
$locale['bb_allegro_description'] = "Szuka towarów na Allegro - polskim serwise aukcyjnym";
$locale['bb_allegro_usage'] = "Tekst do wyszukania na Allegro";
?>
- $locale['bb_allegro'] - nazwa bbcode; ten tekst pojawia się przed wywołaniem parsera (po parsowaniu wyglada to tak "Allegro: cabria exclusive" gdzie Allegro jest pogrubione a cabria exclusive jest linkiem do wyszukiwarki Allegro z teksetem "cabria exclusive" jako parametr)
- $locale['bb_allegro_description'] - opis bbcode Allegro
- $locale['bb_allegro_usage'] - opis uzywania bbcode Allegro
Oczywiście każdy plik lokalizacyjny bbcode może być bardziej skomplikowany. Jak napisałem wyżej osobiście preferuję schemat tablicy lokalizacyjnej jak poniżej:
$locale['bb_BBNAZWA_CO'] zamiast numerów używanych powszechnie w plikach lokalizacyjnych PHP-Fusion.
Teraz wyjaśnię używanie funkcji JS overlay(), która jest powszechnie stosowana w rozwijanych bbcode. Wywołanie tej funkcji jest bardzo proste. Wywołujemy ją w pliku NAZWA_bbcode_include_var.php w tablicy $__BCODE__ w zdarzeniu onclick:
"return overlay(this, 'bbcode_NAZWA_".$textarea_name."', 'rightbottom');"
);
?>
Jedyną rzeczą jaką musimy zmienić w naszym rozwijanym bbcode jest NAZWA. Kiedy rozwijany bbcode zostanie otwarty (rozwinięty), to aby go zamknąć musimy wywołać funkcję JS overlayclose() w sekcji html_start DIV (onclick).
< ?php
$__BBCODE__[] =
array (
'html_start' => ">"
);
?>
Funkcje JS addText() i insertText() w rozwijanych bbcode.
Nie ma potrzeby tłumaczyć jak używać tych funkcji w nierozwijanych bbcode, ponieważ są one wywoływane automatycznie przez funkcję display_bbcodes(). Kiedy budujemy rozwijany bbcode wtedy musimy wywołać te funkcje w przycisku INPUT w metodzie onclick w sekcji html_middle:
- zamknięte bbcode (posiadające tag otwierający i zamykający):
< input type='button' value='VALUE' class='button' style='width:100px' onClick=\"addText('".$textarea_name."', '[BBCODE]', '[/BBCODE]', '".$inputform_name."');return false;\">
- otwarte bbcode (posiadające tylko tag otwierający):
< input type='button' value='VALUE' class='button' style='width:100px' onClick=\"insertText('".$textarea_name."', '[BBCODE]', '".$inputform_name."');return false;\">
Jedynymi wartościami jakie musimy zmienić są WARTOŚĆ i BBCODE oraz style jeśli jest taka potrzeba.
I na końcu objasnienie funkcji display_bbcodes() i parseubb().
1) display_bbcodes()
< ?php
include_once INCLUDES."bbcode_include.php";
echo "< form name='some_form' method='POST' action='".FUSION_SELF."'>";
echo "< textarea name='some_textarea'>";
echo display_bbcodes("some_textarea", "some_form", "b|u|i");
echo "< input type='submit' name='post' value='Submit'>";
echo "< / form>";
?>
Właśnie wyświetliliśmy bbcode dla pola some_textarea (wartość domyślna to "message"), które jest położone w formie some_form (wartość domyślna to "inputform") i chcemy wyświetlić tylko bbcode b, u, i (domyślnie wszystkie włączone bbcode).
2) parseubb()
< ?php
//query calls
$sometext = $data['some_field'];
$sometext = parseubb($sometext, "b|u|i");
echo $sometext;
?>
Właśnie przetworzyliśmy tekst w $sometext i tylko bbcode b, u, i. Jeżeli w tekście $sometext wystąpią inne bbcode - nie zostaną one przetworzone.
Mam nadzieję, że ten artykuł pomoże wam tworzyć więcej wspaniałych bbcode dla PHP-Fusion v7, który stanie się najlepszym CMS kiedykolwiek ;)
Zawsze wasz:
Robert Gaudyn aka Wooya
Komentarze
Dodaj komentarz
Oceny
Zaloguj się lub zarejestruj, żeby móc zagłosować.
Świetne! | 0% | [0 głosów] | |
Bardzo dobre | 0% | [0 głosów] | |
Dobre | 100% | [1 głos] | |
Średnie | 0% | [0 głosów] | |
Słabe | 0% | [0 głosów] |