Google+

Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Tutorial Folosirea paginării în MyBB
#1
Paginarea este un pas deosebit de important în realizarea unui script sau a unei aplicaţii web şi nu numai. Ea nu aduce o contribuţie importantă doar în ceea ce priveşte designul ci şi în probleme legate de performanţă. Ca să înţelegeţi importanţa paginării voi lua un exemplu din domeniul jocurilor. Majoritatea aplicaţiilor mari, aşa cum sunt şi jocurile, folosesc noţiunea de frame-uri. În momentul în care sunteţi într-o cameră cu protagonistul jocului, în memoria RAM nu se încarcă tot conţinutul jocului pentru că nu are rost. După ce terminaţi o misiune, sau intraţi într-o altă cameră din joc, vă apare pe ecran un mesaj prin care sunteţi informaţi că jocul se încarcă. În acel moment, obiectele ce compuneau vechea cameră sunt eliberate din memoria RAM şi sunt adăugate cele ce vor compune noua cameră. De ce nu poate fi încărcat tot jocul? Răspunsul este foarte simplu. Pentru că este destul de mică. Doar de câţiva GB. Şi totuşi de ce nu sunt datele preluate direct de pe hard-disk? Şi această întrebare deţine un răspuns banal. Pentru că accesarea datelor de pe hard-disk se face mult mai lent decât din memoria RAM, iar userul nu doreşte să aştepte o secundă când el face un pas în faţă.
Ca să revin la subiectul acestui articol voi preciza faptul că aşa se întâmplă şi cu paginarea tabelelor, a informaţiei din domeniul web. Să presupunem că avem o pagină web care afişează dintr-o bază de date toate înregistrările din tabelul X. Şi sunt 20000 de mii de înregistrări. Dacă sunt afişate rând pe rând fiecare înregistrare, atunci timpul de încărcare al acelei pagini va fi foarte mare (de ordinul secundelor). Din acest motiv s-a inventat paginarea. Astfel, scriptul nu mai afişează toate cele 20000 de înregistrări dar face în aşa fel încât îi oferă posibilitatea userului să aibă acces la toate. El nu le poate vedea în mod direct pe toate ci un anumit număr dintre ele. Dar poate că nici nu doreşte să le vadă pe toate? Ce rost are să vadă toate mesajele dintr-un subiect dacă el doreşte să îl vadă doar pe ultimul?! Nu are niciun rost.
Astfel, suntem foarte des nevoiţi să apelăm la paginare. Paginarea are la bază un algoritm matematic destul de simplu, în care cele n înregistrări sunt grupate după câte m înregistrări. MyBB vine în sprijinul celor care doresc să realizeze paginări pentru aplicaţiile sau modificările lor. Algoritmul de efectuare a paginării este implementat în MyBB prin intermediul funcţiei <strong>multipage</strong> ce este definită în fişierul inc/functions.php.
Definiţia funcţiei este următoarea :

Code:
1
2
3
4
5
6
7
8
multipage($count, $perpage, $page, $url, $breadcrumb=false)
Generează o paginare a informaţiei

param: int Numărul de înregistrări care urmează să fie paginate
param: int Numărul de înregistrări care vor face parte dintr-o pagină
param: int Pagina curentă
param: string URL-ul către scriptul în care se foloseşte paginarea
return: string Se returnează codul HTML al paginării

Fiecare parametru al acestei funcţii este deosebit de important. Legat de primii doi parametri, cred că este clar ceea ce realizează. Parametrul cu numărul 3 îi permite funcţiei să vadă dacă cumva pagina curenţă nu este alta în afară de prima şi să stabilează linkurile către pagina anterioară şi următoarea. Nu trebuie neglijat nici ultimul parametru. Acesta îi dă userului posbilitatea să îi spună funcţiei adresa URL care va intra în compunerea link-urilor de paginare. Rezultatul funcţiei nu este altceva decât un cod HTML care va fi introdus în pagina dorită.
Însă după cum aţi putut vedea până acum această funcţie nu intervine în selectarea înregistrărilor. În momentul în care dorim să afişăm nişte înregistrări în cadrul unui tabel HTML trebuie să ştim ce date vom afişa. Cu alte cuvinte trebuie realizată o legătură între procesul de afişare şi cel de paginare.
Să studiem cu atenţie următorul script :

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
    define('IN_MYBB', 1);
    require "./global.php";
    // Creaza titlu
    add_breadcrumb("O simpla afisare", "afisare.php");
    // Numar de inregistrari din baza de date
    $count = $db->num_rows($db->simple_select("tabel", "*", ""));
    // Paginarea listei
    $perpage = $mybb->settings['threadsperpage'];
    if(intval($mybb->input['page']) > 0)
    {
        $page = intval($mybb->input['page']);
        $start = ($page - 1) * $perpage;
        $pages = ceil($count / $perpage);
        if($page > $pages)
        {
            $start = 0;
            $page = 1;
        }
    }
    else
    {
        $start = 0;
        $page = 1;
    }
    // Crearea URL-ului
    $multipage = multipage($count, $perpage, $page, "afisare.php"); 
    // Afisarea datelor din pagina
    $query = $db->simple_select("tabel", "*", "", array("order_by" => "timestamp", "order_dir" => "DESC", 
"limit_start" => $start, "limit" => $perpage));
    if ($db->num_rows($query) > 0)
    {
        $content = "";
	while ($row = $db->fetch_array($query))
        {
            $content .= '<tr>
                <td class="trow1">'. $db->escape_string($row['id']). '</td>
                <td class="trow1">'. $db->escape_string($row['username']) .'</td>
                <td class="trow1">'. $db->escape_string($row['email']) .'</td>
                <td class="trow1">'. $db->escape_string($row['ip']) .'</td>
                <td class="trow1">'. date("m.d.Y H:i:s", floatval($row['timestamp'])) .'</td>
		              </tr>';
        }
    }
    else
    {
        $content = '<tr><td class="trow1" colspan="5" align="center">In acest moment nu exista inregistrari in sistem!</td></tr>';
    }
    // Crearea paginii
    eval("\$output = \"".$templates->get("template")."\";");
    // Afisarea paginii
    output_page($output);

=> Liniile 1 şi 2 din codul de mai sus au rolul de a face legătura cu sistemul MyBB. Fără linia 2 spre exemplu nu am putea folosi funcţia multipage şi nici alte clase.
=> Linia 4 are rolul de a crea titlul paginii şi calea către fişierul scriptului.
=> Linia 6 are rolul de a salva în variabila $count numărul de înregistrări pe care le cuprinde tabela "tabel" din baza de date. Toate aceste înregistrări vor putea fi accesate de utilizator.
=> Linia 8 setează numărul de elemente ce vor fi afişate în cadrul unei pagini. În cazul nostru această valoare este preluată din setarea "threadsperpage", care are în mod normal valoarea 10 ca şi default.
=> Blocul de cod dintre liniile 10 şi 25 are rolul de a crea acea legătură dintre paginare şi afişarea informaţiei. Prin intermediul paginii curente şi a numărului de înregistrări / pagină se va seta o limită la ambele capete a înregistrărilor care vor fi afişate. Astfel scriptul va şti exact ce înformaţii va afişa pe ecranul utilizatorului. Variabila $start stocheză valoarea înregistrării cu care se va începe afişarea.
=> Linia 27 apelează funcţia multipage şi salvează în cadrul variabilei $multipage codul HTML rezultat în urma prelucrărilor pe care funcţia le face;
=> Blocul de cod dintre liniile 29 şi 47 realizează selecţia din baza de date a datelor cerute de user ţinându-se cont de paginare. Rândurile întoarse din baza de date sunt incluse în variabila $content.
=> Linia 49 are rolul de a include codul tuturor variabilor de mai sus în cadrul template-ului paginii;
=> Linia 51 produce afişarea template-ului userului;
Iată şi codul template-ului :

PHP Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<html>
<head>
<title>{$mybb->settings[bbname]}</title>
{$headerinclude}
</head>
<body>
{$header}
<table border="0" cellspacing="1" cellpadding="4" class="tborder">
<tr><td class="thead" colspan="5"><strong>Lista cu inregistrari</strong></td></tr>
<tr>
<td class="tcat"><span class="smalltext"><strong>ID</strong></span></td>
<td class="tcat"><span class="smalltext"><strong>Nume de utilizator</strong></span></td>
<td class="tcat"><span class="smalltext"><strong>Adresa de e-mail</strong></span></td>
<td class="tcat"><span class="smalltext"><strong>Adresa IP</strong></span></td>
<td class="tcat"><span class="smalltext"><strong>Data inregistrarii</strong></span></td>
</tr>
{$content}
</table>
{$multipage}
{$footer}
</body>
</html>

Acum totul este perfect şi funcţionează ca la carte. Utilizare plăcută în continuare!
PS : Pentru eventuale probleme vă rugăm să postaţi o replică la acest subiect.

Copyright : Acest tutorial a fost realizat de Mihu şi este proprietate a MyBB.ro! 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


Forum Jump:


Users browsing this thread: 1 Guest(s)