Nawigacja
PHP-Fusion v7 - BBCodes API
Napisane przez Wooya
dnia 30 czerwca 2008 21:42 ·
3 komentarze ·
10617 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] |