Ndodheni ne: Guidat / PHP
Klasa Ndihmese në PHP

Klasa Ndihmëse në PHP

Nga më 1 August 2010 në PHP me 2 Komente

Titulli mund t’ju gënjejë paksa, por guida nuk flet për opsione të PHP-së. Përkundrazi, do të përdorim njohuritë bazë për të ndërtuar disa klasa që ofrojnë funksionalitete ndihmëse për veprime të shpeshta. Do ju tregoj si të ndërtoni 3 klasa ndihmëse: ndihmës lidhjesh (links), ndihmës sigurie (pastrim të dhënash dhe kriptim) dhe ndihmës formash html.

  • Shkarko Kodin

Së pari mos u gënjeni nga titulli. Këto klasat ndihmëse që do flas nuk janë ndonjë opsion i PHP-së për kodim me objekte apo ndonjë teknikë që do ju mësojë gjëra të reja rreth PHP-së. Përkundrazi, do t’ju tregoj të ndërtoni disa funksionalitete duke përdorur asgjë më tepër se njohuritë bazë në PHP dhe pak në HTML.

Ndihmësit (helpers) janë një koncept i bërë i “famshëm” nga Framework-et. Praktikisht çdo framework modern përmban një set funksionalitetesh ndihmëse të cilat ja lehtësojnë punën programuesëve në detyrat tipike dhe i bëjnë të shkruajnë më pak. Mendoni këtu mënyra të thjeshtësuara për të shkruar kod HTML, për të pastruar të dhënat hyrëse, për të manipuluar skedarët dhe direktoritë, etj.

Kujt i shërben guida

Edhe pse guida nuk është e limituar në audiencë, programuesit me eksperiencë mund të përfitojnë më tepër prej saj. Çfarë dua të them është se klasat ndihmëse mund të jenë zgjidhje e mirë për dikë që kodon tashmë me objekte dhe ka krijuar një set klasash të cilat i përdor për projekte të ndryshme, midis të cilave mund të futen shumë mirë edhe ndihmësit. Një fillestar mund t’i përdorë njohuritë e marra në këtë guidë për t’u stimuluar të kodojë me objekte dhe mund t’i përdorë ndihmësit në një të ardhme në projektet e tij.

Kini gjithashtu parasysh që guida nuk shërben për t’ju treguar hollësisht çfarë bën kodi, por për t’ju prezantuar me teknikën. Kodi që do t’ju tregoj është i komentuar mirë, por sërish nuk do të mund të kuptohet lehtë nga fillestarët absolutë. Pra, kjo është një guidë për programuesit që i njohin mirë bazat dhe i shërben plotësisht atyre që kodojnë me objekte.

Le të fillojmë guidën

Si ju thashë, ndihmësit janë funksionalitete që na ndihmojnë të bëjmë disa veprime standarte dhe të përsëritura. Duke krijuar një set klasash ndihmëse me fleksibilitetin dhe opsionet e duhura, këto ndihmësa mund të rrisin efikasetetin e të koduarit. Çështja a duhen përdorur apo jo, mbetet preferencë personale, ashtu si janë shumë gjëra të tjera (database wrapper, template engine, etj). Dikush pëlqen të shkruajë kod HTML në formën normale, dikush tjetër pëlqen të përdori ndihmësa dhe t’a shkruajë me funksione dhe variabla PHP. Dikush pëlqen të shkruajë kod PHP në formën normale për të ngarkuar skedarë, ndërsa dikush tjetër pëlqen të përdorë ndihmësa. Pra gjithçka varet nga stili dhe kërkesat tuaja. Megjithatë, për dikë që ka krijuar një “framework” për veten e tij me një sërë funksionalitetesh, jam i sigurt që ndihmësit do jenë interesant.

Unë kam krijuar 3 ndihmësa në formen e 3 klasave: ndihmës për të krijuar lidhje (links), ndihmës për siguri dhe një ndihmës për të krijuar forma HTML. Kompleksiteti i kodit dhe funksionaliteteve është mbajtur në standarte normale në mënyrë që të kuptohen nga kushdo dhe si rrjedhim mund të mos jenë të plota apo maksimalisht fleksibël. Sidoqoftë, kjo është një guidë dhe ka për qëllim t’ju mësojë konceptet, jo që kodi të jetë 100% gati të përdoret në projekte të vërteta.

Ndihmësi i Lidhjeve

Ky ndihmës shërben për të krijuar lidhje (links) duke gjeneruar HTML të vlefshme, specifikisht tagu <a>. Përmes disa parametrave përcaktohen lidhja, titulli, shënjestra, etj. Në projektet që unë kodoj, lidhjet janë ndër elementët më të përsëritur dhe ndonjëherë nuk kam zgjidhje tjetër përveç se ta printoj HTML-në direkt nga kodi PHP; pa ndarë logjikën nga prezantimi. Me këtë ndihmës, përveç se shkurtoj kodin, gjithashtu nuk e miksoj vizualisht HTML-në me PHP.

 PHP |  Kopjo Kodin |? 
01
<?php
02
class Ndihmesit_Lidhjet{
03
     //Variabel per te ruajtur adresen e faqes. Eshte e nevojshme
04
     //ne rastet kur rishkruhen url-te dhe mund ta fshini nese
05
     //nuk ju duhet.
06
     private $domaini = 'http://www.faqjajote.com/';
07
 
08
     //Funksioni qe shfaq lidhjen. $lidhja eshte adresa (href); $emri eshte teksti qe shfaqet;
09
     //$titulli eshte titulli (title); $shenjestra eshte target (_self ose _blank) ndersa
10
     //$opsionet jane atributet te tjera. $shenjestra eshte paracaktuar si "_self" nese nuk
11
     //vendoset vlere kur therritet funksioni, ndersa $opsione duhet te jete vektor.
12
     public function shfaqLidhjen($lidhja, $emri, $titulli, $shenjestra = '_self', $opsione = array()){
13
          //Nje liste me atributet e lejuara per opsionet. Gjithcka qe nuk eshte ne liste nuk do konsiderohet.
14
          $atributet_lejuara = array('id', 'class', 'style', 'rel', 'name', 'onclick');
15
          //Nese lidhja nuk eshte email, i shtojme perpara domainin.
16
          if(!strstr($lidhja, 'mailto:')){ $lidhja = $this->domaini . $lidhja; }
17
          //Nisim krijimin e html-se per lidhjen. Ketu kam krijuar tagun "href".
18
          $html = '<a href="' . $lidhja . '"';
19
          //Nese titulli nuk eshte bosh, krijojme tagun "title".
20
          if($titulli != ''){
21
               $html .= ' title="' . $titulli . '"';
22
          }
23
          //Nese shenjestra eshte "_self" ose "_blank", krijojme tagun "target".
24
          //Nese shenjestra eshte bosh, e leme bosh sepse kur nuk gjendet, vlera
25
          //default merret "_self".
26
          if($shenjestra == '_self' || $shenjestra == '_blank'){
27
               $html .= ' target="' . $shenjestra . '"';
28
          }
29
          //Kontrollojme nese vektori $opsione ka vlera brenda, qe do te thote se
30
          //ka opsione per ti shtuar lidhjes.
31
          if(count($opsione) > 0){
32
               //Bejme loop ne vektorin e opsioneve. Kur therritet funksioni, vektori duhet
33
               //te krijohet i tille qe celesat te jene atributet html, ndersa vlerat te jene
34
               //vlerat html.
35
               foreach($opsione as $celesi=>$vlera){
36
                    //Kontrollojme nese celesi (pra atributi) ndodhet ne listen e atributeve te lejuara.
37
                    if(in_array($celesi, $atributet_lejuara)){
38
                         //Shtojme atributin dhe vleren e re ne lidhje.
39
                         $html .= ' ' . $celesi . '="' . $vlera . '"';
40
                    }
41
               }
42
          }
43
          //Vendosim tekstin dhe mbyllim tagun <a>.
44
          $html .= '>' . $emri . '</a>';
45
          //Kthejme html-ne me nje lidhje te perfunduar.
46
          return $html;
47
     }
48
}
49
?>

Përdorimi i Ndihmësit

 PHP |  Kopjo Kodin |? 
1
<?php
2
require('ndihmesit/lidhjet.php');
3
$ndihmesit_lidhjet = new Ndihmesit_Lidhjet;
4
$opsionet = array('id'=>'lidhjaPare', 'class'=>'ngjyraBlu', 'onclick'=>'return false;');
5
echo $ndihmesit_lidhjet->shfaqLidhjen('linku.html', 'Kliko Ketu', 'Lidhje e gjeneruar me PHP', '_blank', $opsionet);
6
//Kthen: <a href="http://www.faqjajote.com/linku.html" title="Lidhje e gjeneruar me PHP" target="_blank" id="lidhjaPare" onclick="return false">Kliko Ketu</a>
7
?>

Duke thërritur një funksion dhe duke i vendosur atij parametrat e nevojshme, krijojmë një lidhje të vlefshme HTML. Klasa mund të modifikohet dhe zgjerohet sipas dëshirave, duke shtuar për shembull atribute të lejuara apo duke ofruar një mënyrë më të mirë për të shkruar brenda lidhjes kod Javascript.

Ndihmësi i Sigurisë

Ky ndihmës shërben për të kryer disa nga veprimet bazë të sigurisë në PHP. Këtu përfshihet pastrimi i teksteve hyrëse nga karakteret që mund të thyejnë query-t (SQL Injections), që mund të fusin kod arbitrar (XSS) dhe gjithashtu funksionalitet për kriptimin e fjalëve (kryesisht fjalëkalimeve) me sha1() dhe md5() duke përfshirë edhe kripëzën (salt).

 PHP |  Kopjo Kodin |? 
01
<?php
02
class Ndihmesit_Siguria{
03
     //Funksion per te pastruar tekstet nga karakteret qe mund te nxisin
04
     //gabime ne SQL (SQL Injections). $teksti eshte teksti qe duam te
05
     //pastrojme, ndersa $db vendoset per te treguar a ka nje lidhje me
06
     //databazen apo jo. Vlera baze e $db eshte 1, duke supozuar qe funksioni
07
     //do perdoret me shpesh ne lidhje me veprimet me databazat.
08
     public function pastro($teksti, $db = 1){
09
          //Nese $db eshte 0, atehere skemi lidhje me databazen dhe perdorim funksionin
10
          //addslashes(). Ne te kundert, perdorim nje funksion specifik per pastrimin e te
11
          //dhenave para se te futen ne databaze. Ne vend te mysql_real_escape() mund te jete
12
          //cfare do funksioni specifik per databaza ($mysqli->real_escape_string() psh).
13
          if($db == 0){
14
               $teksti = addslashes($teksti);
15
          } else{
16
               $teksti = mysql_real_escape_string($teksti);
17
          }
18
          //Kthejme tekstin e pastruar.
19
          return $teksti;
20
     }
21
 
22
     //Funksion per te pastruar tekstin nga karaktere HTML (apo Javascript) qe do te
23
     //sherbenin per sulme XX (Cross Site Scripting). $teksti eshte teskti qe duam te
24
     //pastrojme. $hiq_taget percakton nese duam ti kthejme taget html ne entitete apo
25
     //ti fshijme fare. Vlera baze eshte 0, qe nuk i fshin taget.
26
     public function pastroXSS($teksti, $hiq_taget = 0){
27
          //Nese $hiq_taget eshte 1, atehere i heqim teresisht taget html nga teksti me
28
          //funksionin strip_tags(). Ky funksion ka natyre pak destruktive, sepse taget
29
          //jo te plota mund te rezultojne ne fshirjen e me shume teksti. Funksioni
30
          //htmlentities(), qe i kthen ne entitete eshte ide me e mire ne pjesen me te madhe te rasteve.
31
          if($hiq_taget == 1){
32
               $teksti = strip_tags($teksti);
33
          } else{
34
               $teksti = htmlentities($teksti);
35
          }
36
          //Kthejme tekstin e pastruar.
37
          return $teksti;
38
     }
39
 
40
     //Funksion per kriptuar tekstet ne nje drejtim permes sha1 ose md5. $teksti eshte
41
     //teksti qe duam te kriptojme; $tipi eshte tipi i kriptimit (sha1 apo md5) dhe $kripeza (salt)
42
     //eshte nje shtese sigurie per ti bere tekstet te pamundur te &quot;perkthehen&quot; pa ditur kripezen.
43
     public function kripto($teksti, $tipi = 'sha1', $kripeza = NULL){
44
          //Nese $tipi nuk eshte as sha1, as md5 e bejme sha1.
45
          if($tipi != 'sha1' && $tipi != 'md5'){
46
               $tipi = 'sha1';
47
          }
48
          //Nese eshte vendosur nje kripez, ja shtojme ne fund tekstit.
49
          if($kripeza != NULL){
50
               $teksti = $teksti . $kripeza;
51
          }
52
          //Kjo eshte nje teknike interesante qe ndoshta jo te gjithe e kane rastisur. Flas per pjesen
53
          //$tipi($teksti) qe quhet variabel-funksion. Variabla $tipi mban ose sha1 ose md5 dhe vleren e saj
54
          //e perdorim per te therritur funksion perkates duke i shtuar kllapat. Ne fund, do te kthehet
55
          //sha1($teksti) ose md5($teksti).
56
          return $tipi($teksti);
57
     }
58
}
59
?>

Përdorimi i Ndihmësit

 PHP |  Kopjo Kodin |? 
1
<?php
2
require('ndihmesit/siguria.php');
3
$ndihmesit_siguria = new Ndihmesit_Siguria;
4
echo $ndihmesit_siguria->pastro('nje"tekst"prove', 0);
5
echo $ndihmesit_siguria->pastroXSS('<a href="faqja.html">kliko</a>');
6
echo $ndihmesit_siguria->kripto('fjalekalimi123', 'md5', 'kripeza12');
7
?>

Ndihmësi i sigurisë në bazë është fare i thjeshtë sepse nuk përfshin asgjë më shumë se sa funksione të gatshme të PHP-së. Megjithatë, mund t’i shtohen funksionalitete, sidomos për kriptimin, ku mund të përfshini teknika kriptimi 2-anëshe apo një algoritëm tuajin.

Ndihmësi i Formave

Ndihmësi i formave shërben për të krijuar forma HTML. Kam përfshirë disa nga elementët më komun si inpute dhe lista. Ashtu si tek ndihmësi i lidhjeve, edhe ai i formave ju shkurton kodin dhe e ndan vizualisht prezantimin nga logjika.

 PHP |  Kopjo Kodin |? 
01
<?php
02
class Ndihmesit_Format{
03
     //Funksion per te krijuar formen. $metoda eshte atributi "method" dhe merr vlerat
04
     //"get" ose "post". $veprimi eshte atributi "action", ndersa $shume_pjese percakton
05
     //nese forma do te perdoret per ngarkim skedaresh.
06
     public function nisFormen($metoda, $veprimi, $shume_pjese = 0){
07
          //Nisim formen duke vendosur metoden dhe veprimin.
08
          $html = '<form method="' . $metoda . '" action="' . $veprimi . '"';
09
          //Nese $shume_pjese eshte vendosur 1, atehere shtojme atributin dhe vleren
10
          //e caktuar per ta bere formen te gatshme per ngarkim skedaresh.
11
          if($shume_pjese == 1){
12
               $html .= ' enctype="multipart/form-data"';
13
          }
14
          //Shtojme tagun mbylles te definicionit te formes.
15
          $html .= '>';
16
          //Kthejme html-ne e formes.
17
          return $html;
18
     }
19
 
20
     //Funksion per te krijuar etiketa <label>. $etiketa eshte titulli i etiketes
21
     //ndersa $emri eshte shenjestra e etiketes (atributi for="").
22
     public function krijoEtikete($etiketa, $emri = NULL){
23
          //Nisim html-ne e etiketes.
24
          $html = '<label ';
25
          //Nese $emri eshte vendosur (pra nuk eshte NULL) shtojme atributin "for".
26
          if($emri != NULL){
27
               $html .= ' for="' . $emri . '"';
28
          }
29
          //Mbyllim etiketen duke vendosur titullin dhe duke mbyllur tagun </label>.
30
          $html .= '>' . $etiketa .  '</label>';
31
          //Kthejme html-ne e etiketes.
32
          return $html;
33
     }
34
 
35
     //Funksion per te krijuar inpute. $vlera eshte atributi "value"; $emri vendoset ne
36
     //atributet "id" dhe "name", ndersa $tipi percakton nese eshte "text", "password" apo "hidden".
37
     public function krijoInput($vlera, $emri, $tipi){
38
          //Krijojme nje vektor me tipet e lejuara.
39
          $tipet_lejuara = array('text', 'password', 'hidden');
40
          //Kontrollojme nese tipi i vendosur ndodhet ne vektorin e tipeve te lejuara. Nese nuk
41
          //ndodhet e bejme tipin "text".
42
          if(!in_array($tipi, $tipet_lejuara)){
43
               $tipi = 'text';
44
          }
45
          //Kthejme inputin me atributet perkatese.
46
          return '<input type="' . $tipi . '" name="' . $emri . '" id="' . $emri . '" value="' . $vlera . '" />';
47
     }
48
 
49
     //Funksion per te krijuar lista <select>. $emri eshte atributi "name" dhe "id", ndersa $vlerat eshte nje vektor
50
     //me vlerat dhe titujt e opsioneve <option>.
51
     public function krijoListe($emri, $vlerat){
52
          //Kontrollojme qe vektori te kete te pakten 1 element, perndryshe nuk kthejme asgje.
53
          if(count($vlerat) > 0){
54
               //Krijojme tagun <select> me $emri te vendosur si "name" dhe "id"
55
               $html = '<select name="' . $emri . '" id="' . $emri . '">';
56
               //Bejme loop ne vektorin $vlerat. Celesi eshte "value" ndersa vlera eshte titulli i opsionit.
57
               foreach($vlerat as $celesi=>$vlera){
58
                    $html .= '<option value="' . $celesi . '">' . $vlera . '</option>';
59
               }
60
               //Mbyllim tagun <select>.
61
               $html .= '</select>';
62
               //Kthejme html-ne e listes.
63
               return $html;
64
          }
65
     }
66
 
67
     //Funksion per te mbyllur formen. E vetmja gje qe ben eshte kthimi i "</form>".
68
     public function mbyllFormen(){
69
          return '</form>';
70
     }
71
}
72
?>

Përdorimi i Ndihmësit

 PHP |  Kopjo Kodin |? 
01
<?php
02
require('ndihmesit/format.php');
03
$ndihmesit_format = new Ndihmesit_Format;
04
echo $ndihmesit_format->nisFormen('post', 'veprimi.php');
05
//Kthen: <form method="post" action="veprimi.php">
06
 
07
echo $ndihmesit_format->krijoEtikete('Titulli i Faqes', 'faqja');
08
//Kthen: <label for="faqja">Titulli i Faqes</label>
09
echo $ndihmesit_format->krijoInput('Feniksi.com', 'faqja', 'text');
10
//Kthen: <input type="text" name="faqja" id="faqja" value="Feniksi.com" />
11
 
12
$vlerat = array('shume mire'=>'Shume Mire', 'mire'=>'Mire', 'keq'=>'Keq', 'skandal'=>'Skandal');
13
echo $ndihmesit_format->krijoEtikete('Cilesia e Faqes', 'cilesia');
14
//Kthen: <label for="cilesia">Cilesia e Faqes</label>
15
echo $ndihmesit_format->krijoListe('cilesia', $vlerat);
16
//Kthen:
17
//<select name="cilesia" id="cilesia">
18
//<option value="shume mire">Shume Mire</option>
19
//<option value="mire">Mire</option>
20
//<option value="keq">Keq</option>
21
//<option value="skandal">Skandal</option>
22
//</select>
23
 
24
echo $ndihmesit_format->mbyllFormen();
25
//Kthen: </form>
26
?>

Me anë të disa funksioneve dhe parametrave krijova një formë me një input, një listë dhe etiketat përkatëse. Ka goxha vend për tu zgjeruar, duke përfshire butona, checkbox-e, etj, por duhet t’ju shërbejë mirë si një strukturë bazë.

Përfundimi

Guida është e shkurtër për nga shpjegimi teorik, por duhet t’ju japë një ide në linja të përgjithshme se si ndihmësit funksionojnë. Shpresoj që të ketë qenë një lexim interesant dhe instruktues për të gjitha nivelet e koduesve.

Mësim të mbarë.

Fadion Dashi

Fadioni është prej shumë vitesh i apasionuar pas internetit dhe punon freelance si dizenjues dhe programues per web. Kur nuk është duke punuar, i pëlqen të shkruajë, të fotografojë, të admirojë koleskionin e tij të aparatëve fotografikë manualë dhe të kalojë kohë të bukur me miqtë.

2 Komente

  1. Banago says:

    Artikull fantastik! Faleminderit Joni! Më intereon shumë pjesa e formës – gjithmonë kam kërkuar diçka më automatike për gjenerimin e formave me PHP sepse t’i shkruash nga fillimi është diçka vertetë shumë e bezdisshme. Duhet shtuar edhe checkbox dhe radiobutton për të qenë sa më e plotë dhe gjithçka duket gati.

  2. Fadion Dashi says:

    Me vjen mire qe te hyn ne pune Baki.

    Klasa e formave nuk eshte fare e plotesuar, por do ishte shume e gjate per tu postuar ne kete guide per te perfshire te gjitha funksionalitetet. Krahas checkbox, butonave, radio, input file e ndonje element tjeter, funksionalitete te domosdoshme (te pakten per ato qe kodoj une) do ishin edhe vendosja e vlerave. Mund te ishte nje funksion vendosVleren() qe merr si parametra: vleren baze dhe nese duhet te shfaqet vlera e post/get. Shto edhe funksione per selektimin e listave (< select >), radio dhe checkbox e i ofron vetes shkurtime pa fund. Jane gjera te thjeshta te kodohen dhe mund te zgjerohen ne baze te kerkesave specifike.

Shkruaj një Koment