Google+

Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Tutorial Interpretarea şi realizarea propriu-zisă a unei modificări!
#1
Pentru a putea realiza propriul nostru plugin va trebui mai întâi să ştim să analizăm, interpretăm o modificare deja existentă pentru a fi conştienţi de legăturile, de modul în care se face legătura dintre codul nostru şi core-ul MyBB. Consider că acest lucru va trebui să îl facem având la bază un exemplu. Aşa încât m-am gândit că ar fi bine să explic intrepretarea unui plugin luând ca exemplu un plugin făcut de mine care nu există pe piaţă. De fapt ultima versiune free a acestui plugin este realizată în octombrie 2008 şi el se numeşte Attachment Watcher. Nu face altceva decât adaugă o listă cu cei care au descărcat un ataşament în blocul “Fişier(e) ataşate” din cadrul unui post (dacă postul respectiv are ataşamente). Făcând o mică paranteză o să vedeţi că trecerea de la Attachment Watcher (care e pentru versiunea de MyBB 1.4) nu este aşa de uşoară la versiunea 1.6 datorită lipsei unui cârlig din core-ul MyBB 1.6. Pentru analizare voi pune mai jos 99% din codul pluginului :

PHP Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
if(!defined("IN_MYBB"))
die("This file cannot be accessed directly.");
// our hooks
$plugins->add_hook('attachment_end', 'whodownattachment_log');
$plugins->add_hook('whodownattachment_ref', 'whodownattachment_show');
function whodownattachment_info()
{
return array(
"name" => "Who Download An Attachment",
"description" => "Logs who downloads attachments and display list on postbit.",
"website" => "http://mybb.ro",
"author" => "Surdeanu Mihai",
"authorsite" => "http://mybb.ro",
"version" => "1.0",
"compatibility" => "16*"
);
}
function whodownattachment_activate()
{
global $db, $lang;
// create settings group
$insertarray = array(
'name' => 'whodownattachment',
'title' => 'Who Download An Attachment',
'description' => "Settings for Who Download An Attachment plugin.",
'disporder' => 100,
'isdefault' => 0
);
$gid = $db->insert_query("settinggroups", $insertarray);
$setting0 = array(
"sid" => NULL,
"name" => "whodownattachment_forums",
"title" => "Except Forums",
"description" => "The ID\'s of the forums where attachment downloads are not logged. (blank if you want to log all forums)",
"optionscode" => "text",
"value" => "",
"disporder" => 1,
"gid" => $gid
);
$db->insert_query("settings", $setting0);
$setting1 = array(
"sid" => NULL,
"name" => "whodownattachment_groups",
"title" => "Except Groups",
"description" => "The ID\'s of the user grous you do not want to log. (blank if you want to log all user groups)",
"optionscode" => "text",
"value" => "",
"disporder" => 2,
"gid" => $gid
);
$db->insert_query("settings", $setting1);
rebuild_settings();
$db->write_query("CREATE TABLE `".TABLE_PREFIX."whodownloadattachment`
(
`lid` bigint(30) UNSIGNED NOT NULL auto_increment,
`aid` bigint(30) UNSIGNED NOT NULL default '0',
`date` bigint(30) UNSIGNED NOT NULL default '0',
`whodownloadit` text NOT NULL default '',
PRIMARY KEY (`lid`)
) TYPE=MyISAM");
require '../inc/adminfunctions_templates.php';
find_replace_templatesets("postbit_attachments_attachment", '#'.preg_quote('{$attachment[\'downloads\']})').'#', '{$attachment[\'downloads\']}) ({$attachment[\'whodownload\']})');
}
function whodownattachment_deactivate()
{
global $db, $mybb;
$db->delete_query("settinggroups", "name = 'whodownattachment'");
$db->delete_query('settings', 'name IN ( \'whodownattachment_forums\', \'whodownattachment_groups\')');
rebuild_settings();
if ($db->table_exists('whodownloadattachment'))
$db->drop_table('whodownloadattachment');
require '../inc/adminfunctions_templates.php';
find_replace_templatesets("postbit_attachments_attachment", '#'.preg_quote(' ({$attachment[\'whodownload\']})').'#', '', 0);
}
function whodownattachment_show(&$attachment)
{
global $db, $mybb;
$rezultat = $db->fetch_array($db->query("SELECT whodownloadit FROM ".TABLE_PREFIX."whodownloadattachment 
WHERE aid = ".intval($attachment['aid'])." LIMIT 1"));
eval("\$attachment['whodownload'] = '".$rezultat['whodownloadit']."';");
}
function whodownattachment_log()
{
global $aid, $mybb, $db, $lang, $thread, $fid, $tid, $attachment;
if ($mybb->input['thumbnail'])
return;
$affected_fids = explode(',', $mybb->settings['attachmentlog_forums']);
if (in_array($fid, $affected_fids))
return;
if (!$mybb->user['username'])
$mybb->user['username'] = 'Guest';
$query = $db->query("SELECT * FROM ".TABLE_PREFIX."whodownloadattachment WHERE 
aid = ".intval($aid));
if ($db->num_rows($query) > 0)
{
if ($db->num_rows($db->query("SELECT * FROM ".TABLE_PREFIX."whodownloadattachment
WHERE aid = ".intval($aid)." 
AND whodownloadit LIKE '%".$mybb->user['username']."%'")) > 0)
return;
else
$db->query("UPDATE ".TABLE_PREFIX."whodownloadattachment SET whodownloadit = concat(whodownloadit, 
' [".$mybb->user['username']."]') WHERE aid = '".intval($aid)."'");
}
else {
$insert_array = array(
'aid' => intval($aid),
'date' => TIME_NOW,
'whodownloadit' => $db->escape_string(" [".$mybb->user['username']."] ")
);
$db->insert_query('whodownloadattachment', $insert_array);
}
}

Primul if este cel care testează dacă pluginul a fost rulat de către platforma MyBB sau direct de către user din browser. Dacă este apelat de către user atunci pe ecran va apărea un mesaj de eroare, iar codul de mai jos (următoarele linii ale pluginului) nu va mai fi rulat (vezi modul în care funcţionează funcţia die() din PHP). După acest test, urmează hook-urile, cârligele care definesc legătura cu core-ul MyBB. În cazul de faţă avem 2 cârlige, unul deja existent în MyBB 1.6 (attachament_end) care provoacă rularea funcţiei whodownattachment_log() de fiecare dată când un user descarcă un ataşament ( dă click pe linkul său). Cel de-al doilea cârlig va rula funcţia whodownattachment_show() dacă este referinţiat în core-ul MyBB prin whodownattachment_ref. Acest cârlig nu este definit în mod natural în core-ul MyBB de aceea va trebui să-l definim noi. Acest pas va fi un exerciţiu pentru dvs.
Mai departe sunt incluse funcţiile info, activate şi deactivate. Funcţia info returnează un array cu informaţiile despre modificare şi autorul ei. Funcţia de activare cuprinde 2 setări care vor fi instalate în sistem şi afişate într-un gru propriu. Tot în cadrul acestei funcţii am mai adăugat şi o nouă tabelă în baza de date, numită “whodownloadattachment” care urmează să stocheze utilizatorii care au descărcat ataşamente. La sfârşitul funcţiei de activare se foloseşte o funcţie de modificare a template-ului prin care se adaugă un nou element în template. Acest lucru este foarte important deoarece avem nevoie ca rezultatul să se afişeze pe pagina userului şi nu să fie doar aşa în sistem, în spate şi userul să nu vadă nimic. În fine, funcţia de dezactivare produce efectul invers al celor prezentate în cadrul funcţiei de activare, lucru de altfel normal. Apoi urmează două funcţii deosebit de importante. Acestea sunt :
whodownattachment_log() şi whodownattachment_show() . Prima are rolul de a test, introduce în sistem noi utilizatori care au descărcat ataşamente. Primul if din cadrul acestei funcţii testează dacă ataşamentul este thumbail. Dacă este atunci userii care văd ataşamentul nu sunt contabilizaţi (se iese din funcţie prin return). Urmează alte teste prin care se verifică dacă nu cumva forumul în care este postat acel post a fost setat de către administrator cu restricţia de a nu se contabiliza acolo. Şi în acest caz să iese din funcţie, tot prin return.
În fine, mai departe urmează testele de bază. Algoritmul este următorul : dacă ataşamentul există în tabela nouă definită de pluginul, atunci se trece la verificarea existenţei userului în acel rând (dacă există atunci nu se întâmplă nimic , el este deja contabilizat), dacă nu există atunci se adaugă în acel rând prin concatenare ; în cazul în care nu există un rând în tabelă atunci se adaugă un rând (userul este singurul care a descărcat până acum).
Cea de a două funcţie, după cum îi spune şi numele, produce afişarea utilizatorilor care au descărcat un ataşament pe pagina cu postul. Funcţia după cum se poate vedea primeşte un parametru prin referinţă. La fel ca şi în C++ acest parametru va fi modificat de către funcţie. În mare funcţia setează în cadrul variabilei $attachment['whodownload'] userii care au descărcat un ataşament. Aceştia sunt preluaţi din baza de date prin intermediul unei interogări de selectare. Se observă astfel că variabila primită ca parametru se schimbă. Această variabilă nu este altceva decât un vector (array). De asemenea mai trebuie făcută o remarcă. Dacă vă uitaţi puţin la funcţia de activare, la linia de modificare a template-ului se poate observa că o astfel de variabilă a fost adăugată în template. Asta înseamnă că la afişarea paginii utilizatorului, la existenţa unui ataşament în cadrul mesajului se va afişa şi conţinutul variabilei $attachment['whodownload']. Mai rămâne totuşi un lucru de făcut?! Trebui să facem legătura dintre core-ul MyBB şi funcţia de afişare. De fapt va trebui să apelăm dintr-un fişier MyBB , prin referinţa funcţia de afişare, prin care are loc crearea noii variabile.
EXERCIŢIU : Acest ultim pas o să-l las ca şi exerciţiu pentru dvs. O să vă dau totuşi un hint pentru a nu căuta într-o veselie (nu e scopul acestui tutorial). Va trebui să adăugaţi o variabilă globală şi o linie în cadrul fişierului functions_post.php din directorul root/inc.
REZOLVARE : Variabila globală care va fi adăugată va fi : $plugins . Ea se va adăuga în aceeaşi funcţie ca şi linia de cod. Linia de cod se va adăuga după linia

PHP Code:
foreach($attachcache[$id] as $aid = $attachment) {

şi ea este următoarea :

PHP Code:
$plugins->run_hooks_by_ref("whodownattachment_ref", $attachment);

Funcţia în care se produc aceste modificări are numele get_post_attachments().

Acest tutorial a fost realizat de Mihu şi este proprietate a MyBB.ro. Toate drepturile rezervate autorului.

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
Extrem de detaliat acest tutorial! Felicitari1
It always seems impossible until its done.


Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)