Google+

Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Tutorial Cum facem un plugin pentru MyBB?!
#1
ULTIMA MODIFICARE : 18.03.2011
AUTOR : Mihu
VERSIUNE : 1.1
NOTĂ : Acest tutorial va fi îmbunătăţit periodic! Vă rog să consultaţi update-urile ulterioare!

Mulţi dintre noi îşi doresc să-şi realizeze propriile pluginuri / modificări dar foarte puţini ştiu cu ce se mănâncă şi ce trebuie să faci pentru ca acest lucru să devină realitate!
În primul rând aş dori să precizez faptul că nu orice utilizator de internet poate ajunge să-şi îndeplinească visul în câteva zile! De ce? Păi foarte simplu! Necesită cunoştinţe de programare! Totodată mulţi dintre noi se întreabă cam ce ar trebui să ştie - ca limbaje de programare – pentru a li se putea îndeplini acest vis? Răspunsul vi-l pot da numai în funcţie de nivelul la care doriţi să lucraţi ...
I.Cerinţe
Pentru un plugin:
- simplu : HTML şi puţin PHP;
- mai complicat (care utilizează şi template-uri) : HTML, CSS şi PHP;
- complex (gen NewPoints, MyTracker) : HTML, CSS, Javascript (+ Ajax) şi PHP la nivel de intermediar - chiar avansat;
Trebuie să ştiţi să vă apreciaţi, să vă vedeţi lungul nasului şi să fiţi în orice moment conştienţi de nivelul la care sunteţi pentru a şti ce puteţi face! Aş mai dori să specific că dacă îndepliniţi condiţiile de mai sus nu înseamnă că veţi şti chiar aşa de uşor cum se face un plugin MyBB! Ce vreau să spun?! Păi trebuie să ştiţi cum funcţionează sistemului de pluginuri MyBB şi chiar cum funcţionează MyBB în sine! Într-un cuvânt trebuie să ştiţi că relaţionaţi scriptul vostru cu sistemul MyBB! Din fericire MyBB vine cu o serie de funcţii prin care acest lucru se realizează relativ uşor.
II.Prezentare generală
Să presupunem că îndeplinim, în mare, condiţiile nesare dar nu şi suficiente pentru a putea realiza un plugin, astfel încât o să sar direct la partea de dezvoltare MyBB. O să vă spun din capul locului că dezvoltarea unui plugin este de cele mai multe ori mult mai dificilă decât modificarea codului platformei MyBB, bineînţeles cu câteva mici excepţii : cum ar fi modificările mari care produc o serie de caracteristici şi implementări.
După cum aţi putut observa plugin-uri sunt de obicei încărcate în cadrul directorului /inc/plugins . La rularea sa MyBB va include orice plugin-uri active pe fiecare pagină de încărcare. Acest lucru vă permite executarea propriul dumneavoastră cod în cadrul diferitor pagini. MyBB a acordat un interes deosebit în crearea unui sistem integrat de înglobare a pluginurilor. Acest sistem va fi numit în continuare Hook System. Ca să fiţi conştienţi de importanţa acestuia o să vă spun că acest sistem permite rularea codului dumneavoastră doar în anumite secţiuni, pagini de pe forum. Astfel , de exemplu, dacă fac un plugin pentru adăugarea mai multor statistici pe forum, am nevoie ca acestea să se încarce, pluginul să îşi facă treaba, doar când sunt pe pagina de index şi nu şi în alte pagini. Nu o să intru foarte mult în detaliu referitor la acest sistem de "cârlige" (hook system) pentru că nu are rost să dicutăm despre ele. Trebuie ştiut doar cum se utilizează pentru a ne putea crea propriile modificări.
Ca să fie foarte bine înţeles am să aduc în discuţie o analogie între acest caz şi echivalentul său în C++. În cazul nostru, platforma, core-ul MyBB îl constituie funcţia main din C++ care are în cadrul său o serie de apeluri către alte funcţii externe. Aceste funcţii externe sunt, în cazul de faţă înglobate sub denumirea de Hook System. Funcţiile externe permit modificarea unor variabile transmise fie ca parametru, fie ca şi variabile globale.
Cum ne putem crea un plugin simplu?
În continuare voi ilustra cum putem crea un plugin simplu! Acest lucru îl voi face prin parcurgerea următorilor paşi:
1.În primul rând accesăm folderul inc/plugins şi aici vom plasa un nou fişier PHP cu numele de NUME_FISIER_PLUGIN;
2.Apoi vom începe editarea propriu-zisă a fişierului creat la pasul anterior;
3.În general un plugin MyBB prezintă 3 funcţii standarde:
- NUME_FISIER_PLUGIN_info() - această funcţie returneză diferite informaţii despre plugin precum : autorul ei, versiunea cu care este compatibil pluginul etc.;
- NUME_FISIER_PLUGIN_activate() - este o funcţie de activare care rulează în momentul în care purcedeţi la activarea pluginului din Panoul de Administrare (în cadrul acestei funcţii se pot crea template-uri, realiza unele interogări etc.);
- NUME_FISIER_PLUGIN_deactivate() - această funcţie rulează în momentul în care dezactivaţi pluginul;
Observaţie: Am spus în general 3 funcţii pentru că sunt şi pluginuri care mai au alte 2 funcţii adiţionale:
- NUME_FISIER_PLUGIN_install() - rulează în momentul în care userul dă Install la plugin din Panoul de Administrare;
- NUME_FISIER_PLUGIN_uninstall() - rulează în momentul în care userul dă Uninstall la plugin din Admin CP;
De obicei aceste funcţii se folosesc numai în cazul unor pluginuri mai complexe care vin cu noi tabele în baza de date. Poate vă puneţi întrebarea de ce nu au fost adăugate tot în "activate" şi "deactivate" şi aceste noi tabele. Problema e că dacă se fac update-uri la plugin atunci nu trebuie se fiecare dată se ştergem şi să adăugăm tabele în baza de date. Informaţia se păstrează.
4.Pe lângă aceste funcţii se mai foloseşte şi un mic script care are rolul de a verifica dacă fişierul plugin-ului este accesat direct sau nu de un user!

PHP Code:
if(!defined("IN_MYBB"))
{
	die("Acest fisier nu poate fi accesat direct!");
}

Acest script este opţional, poate lipsi din cadrul fişierului nostru! Totuşi fiind un element de securitate se recomandă cu căldură să-l folosim!
5.Mai jos aveţi un exemplu de funcţie ce conţine informaţii despre plugin:

PHP Code:
1
2
3
4
5
6
7
8
9
10
11
function NUME_FISIER_PLUGIN_info()
{
    return array(
        "name"        => "NUME PLUGIN",
        "description"   => "O DESCRIERE A PLUGINULUI",
        "website"    => "URL-UL SITE-ULUI DE SUPPORT",
        "author"     => "INFORMAŢII DESPRE AUTOR",
        "authorsite"    => "SITE-UL AUTORULUI",
        "version"     => "VERSIUNE (exemplu : 1.0)",
    );
}

Informaţiile din cadrul acestei funcţii sunt afişate în secţiunea Plugins din Panou de Administrare.
6.Poate cel mai important la aceste plugin-uri sunt hook-urile! Acestea se adaugă imediat după scriptul de la pasul 4. Care este rolul lor? Păi aceste hook-uri produc rularea unor funcţii (definite de noi în cadrul fişierului pluginului) în paginile forumului...
De exemplu dacă am hook-ul următor adăugat :

PHP Code:
$plugins->add_hook("newthread_start", "nume_functie");

înseamnă că în momentul în care un membru apasă pe butonul de "New Thread" dintr-un forum / categorie, sistemul va încerca să ruleze funcţia "nume_functie". În acest fel dacă în cadrul funcţiei "nume_funcţie" pun un cod ca acesta

PHP Code:
error("Nu este permis accesul");

atunci nimeni de pe forum nu ar mai putea posta un nou subiect/ topic! Userului i se va afişa următorul mesaj de eroare "Nu este permis accesul" când va încerca să posteze o astfel de informaţie.
Funcţia add_hook definită într-o clasă din cadrul core-ului MyBB are două argumente - numele de cârlig şi numele de handler care se va apela când se ajunge la interpretarea porţiunii de cod care a fost referenţiată. De asemenea MyBB permite să ne definim propriile hook-uri şi să le rulăm prin intermediul metodei run_hook. (sintaxa acesteia este asemănătoare cu cea a metodei add_hook)
7.Din capul locului trebuie ştiut faptul că există mai multe astfel de hook-uri... O listă completă veţi putea găsi aici!
Totodată există hook-uri care permit şi trasnsmiterea unor parametri. Un exemplu în acest sens îl constituie pre_output_page. Acest cârlig permite realizarea unor modificări la nivel de template (HTML şi CSS în special) înainte de afişarea paginii către user. Deci, ce înseamnă acest lucru? Practic, platforma MyBB, înainte de trimiterea ieşirii către utilizator, forţează executarea funcţiei hello_world (care a fost referenţiată). Se poate vedea acest lucru în cele ce urmează:

PHP Code:
$plugins->add_hook("pre_output_page", "hello_world");
$plugins->add_hook("postbit", "hello_world_postbit");

În mod similar, a doua linie din codul de mai sus face ca MyBB să ruleze funcţie numită hello_world_postbit ori de câte ori apar procese la nivel de afişare a mesajelor (postbit-ului). Cârligul (hook-ul) postbit este executat chiar înainte ca un post să fie generat pentru showthread.

PHP Code:
function hello_world($page)
{
	$page = str_replace("<div id=\"content\">", "<div id=\"content\"><p>Hello World!<br />This is a sample MyBB Plugin (which can be disabled!) that displays this message on all pages.</p>", $page);
	return $page;
}

Am spus mai sus că există câteva nume de cârlige ce permit transmiterea de parametri. Am dat şi un exemplu prin codul de mai sus. Parametrul transmis este variabila $page ce conţine tot codul HTML ce a rezultat din contopirea mai multor template-uri, respectiv executarea altor pluginuri. Ca să fac o analogie cu C++ spre exemplu, am o variabila în main pe care o trimit ca şi parametru unei funcţii care îmi va produce schimbarea valorii ei şi rezultatul modificat se va întoarce în main.
8.Aş dori să mai fac o remarcă... poate sunt unele persoane care nu înţeleg care e diferenţa de exemplu dintre aceste două hook-uri : "newthread_start" şi "newthread_end". Prima produce rularea funcţiei tale înainte de a se afişa câmpurile cu "Thread Subject", "Your Message" etc. iar a doua produce rularea funcţiei imediat după ce se termină afişarea informaţiei! Totodată mai apare şi ceva de genul "newthread_do_start" care produce rularea funcţiei introduse de tine imediat după ce membrul apasă pe unul dintre butoanele "Post Thread", "Preview Post" sau "Save as Draft" ... În mod asemănător există o serie de hook-uri care se termină atât în _start cât şi în _end . Sper să înţelegeţi cam cum funcţionează fiecare şi unde pentru că nu e foarte greu şi dacă doriţi să realizaţi pluginul vostru trebuie să le stăpâniţi foarte bine!
III.Funcţii şi variabile predefinite
Aşa cum tot am mai spus MyBB vine cu o serie de clasă de funcţii ce îl ajută pe dezvoltator să scrie cod cum mai puţin şi mai sigur în acest sens. De exemplu, pentru lucrul cu o bază de date putem folosi o serie de funcţii care ne permit realizarea de interogări din pluginul nostru. Un exemplu în acest sens poate fi văzut mai jos :

PHP Code:
$query = $db->simple_select("table", "*", "id='123'", array('order_by' => 'column2', 'order_dir' => 'DESC', 'limit_start' => 0, 'limit' => 5));

Funcţia se numeşte simple_select şi nu face altceva decât să creeze o comandă de selecţie către serverul MySQL. Comanda este construită mai departe cu ajutorul parametrilor transmişi de noi către funcţie. "table" nu reprezintă altceva decât numele tabelei şi nu necesită prefix pentru că acesta este adăugat automat. Apoi se vor selecta doar liniile care au id-ul egal cu 123, fiind afişate ordonat după coloana column2, în mod descrescător şi având o limită de maxim 5 elemente. Mai multe funcţii ce lucrează cu baza de date pot fi găsite aici.
O altă funcţie deosebit de importantă care este definită în core-ul MyBB şi care ne ajută să facem diferite modificări în cadrul sistemului de template al platformei noastre este find_replace_templatesets. Ea are 3 parametri, toţi deosebiţi de importanţi. Un prim parametru îl reprezintă numele setului de template în care se vor face modificările. Funcţia utilează în spate un preg_replace generalizat. Următorul parametru specifică sintaxa care va fi căutată şi care va fi înlocuită în totalitate cu parametrul 3. Dacă nu se găseşte nimic care să semene cu sintaxa definită de parametrul 2 atunci nu se va produce nicio modificare. Să vedem un exemplu:

PHP Code:
find_replace_templatesets("usercp_nav_misc", '#</tbody>#', '<tr><td class="trow1 smalltext"><a href="usercp.php?action=inviteonly" class="usercp_nav_item usercp_nav_usergroups">Invitations</a></td></tr></tbody>');

Această linie adaugă înainte de tagul </tbody>, din template-ul "usercp_nav_misc", un cod HTML. Este bine să se observe că parametrul 2 nu este altceva decât un Regex. În cazul nostru este deosebit de important să se folosească „#” înainte şi după ceea ce dorim să căutăm, pentru că dacă nu punem aceste caractere şi lăsăm doar tagul atunci se poate să se şteargă tot din template şi de aici erori. Pe scurt, codul de mai sus, mai adaugă un link cu titlul „Invitations” în User CP ( în meniul din stânga ). În momentul în care se dezinstalează un plugin care foloseşte şi modificări de template-uri ale core-ului atunci în funcţia „deactivate” se scrie o linie asemănătoare cu cea de mai sus, numai că parametrii 2 şi 3 sunt inversaţi de această dată.
Majoritatea modificărilor existente pe piaţă vin cu o serie de setări adiţionale care sunt instalate în tabela "settings" din baza de date şi care îi permit utilizatorului, în speţă administratorului să configureze după bunul său plac o modificare. Adăugarea şi ştergerea setărilor se face de obicei în funcţia „activate”, respectiv „deactivate”. Mai întâi se creează un grup de setări care vine să înglobeze o serie de astfel de setări. De obicei, unui plugin i se asociază un unic grup de setări. După adăugarea / ştergerea unor setări este nevoie să se apeleze funcţia de reconstrucţie a acestora ( rebuild_settings() ). MyBB salvează unele setări în cache, astfel încât nu solicită informaţii din baza de date despre acestea la fiecare încărcare a saitului. Dacă nu se dă rebuild (recache) atunci pur şi simplu, până la următorul recache automat, chiar dacă setările nu mai există din punct de vedere fizic în baza de date, administratorului îi apăr acele setări în Admin CP. Şi de aici multe erori.

Copyright : Acest tutorial a fost realizat de Mihu şi este proprietate a MyBBRomania.net! Numai cu acordul autorului acest tutorial poate fi postat şi pe alte site-uri!

Users : collective term for those who use computers. Users are divided into three types : novice, intermediate and expert.
Novice users : people who are afraid that simply pressing a key might break their computer.
Intermediate users : people who don`t know how to fix their computer after they`ve just pressed a key that broke it.
Expert users : people who break other people`s computers.
Reply
#2
Update : 18.03.2011
Quote:+ Restructurare
+ Explicarea unor funcţii predefinite
Users : collective term for those who use computers. Users are divided into three types : novice, intermediate and expert.
Novice users : people who are afraid that simply pressing a key might break their computer.
Intermediate users : people who don`t know how to fix their computer after they`ve just pressed a key that broke it.
Expert users : people who break other people`s computers.
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)