In acest articol vom discuta despre o librarie care rezolva o problema de care m-am lovit la un moment dat in utilizarea framework-ului CodeIgniter. Asa cum bine stiti, atunci cand construim un site cu ajutorul libajului PHP (sau orice alt libaj dinamic) evitam pe cat posibil folosirea de cod redundant.
Asta inseamna ca nu vom copia codul care defineste structura intregii pagini in toate fisierele noastre. In schimb vom face template-uri cu structurile repetitive, cum ar fi header-ul, sidebar-ul si footer-ul paginii si le vom chema in toate paginile, in locurile unde avem nevoie de ele. Codul pentru o astfel de structura va arata astfel:
<!DOCTYPE html> <html> <head> <title>Pagina fara libraria template</title> <head> <body> <div id="header"> <?php echo $header ?> </div> <div id="nav"> <?php echo $navBar ?> </div> <div id="wrapper"> <div id="content"> <!-- Continut Pagina --> </div> <div id="aside"> <?php echo $sideBar ?> </div> </div> <div id="footer"> <?php echo $footer ?> </div> </body> </html>
Acest tip de cod este destul de bun si foarte raspandit, dar pe mine nu ma multumeste. Cred ca se poate face mai mult pentru a reduce cantitatea de cod redundant. Eu cred ca in loc sa chemam template-uri pentru header, footer si sidebar in toate paginile, ar trebui sa privim din perspectiva cealalta. Adica sa avem un template numit layout.php (de exemplu), in care sa avem o singura zona in care sa chemam sectiunea de continut.
Din pacate CodeIgniter nu permite in mod nativ asa ceva. Aici intervine o librarie foarte utila pe care care am gasit-o la un moment dat. Se numeste in mod sugestiv "Template" si face exact ceea ce imi doream eu. Adica ne permite sa facem un singur fisier cu layout-ul site-ului, unde sa rezervam o zona in care stim ca va fi continutul si sa il apelam cu minimum de cod.
Libraria Template poate fi gasita aici, iar pagina de download este aceasta. Dupa ce descarcam fisierul .zip putem incepe implementarea librariei. Dezarhivam fisierul .zip si obtinem un folder numit "Template".
Pentru ca avem o configuratie standard la CodeIgniter, cea mai simpla metoda de a integra libraria este sa copiem continutul folder-ului Template peste continutul folder-ului application din aplicatia noastra. Daca stiti ca ati facut modificari in structura framework-ului, mutati fisierele unul cate unul, ca sa fiti siguri ca nu exista conflicte.
Dupa ce am copiat fisierele la locul lor, primul lucru pe care trebuie sa-l facem este sa modificam fisierul template.php din folderul config. Modificarile trebuie sa arate astfel:
/* |----------------------------------------------------------------- | Default Template Configuration (adjust this or create your own) |----------------------------------------------------------------- */ $template['default']['template'] = 'layout.php'; $template['default']['regions'] = array( 'header', 'title', 'content', 'sidebar', 'footer', );
Astfel, definim faptul ca template-ul nostru va fi fisierul layout.php din folder-ul views si zonele in care vom putea scrie continut dinamic in acesta. Eu am definit toate zonele principale dintr-un site, pentru a nu fi nevoie sa modific mai tarziu. In acest exemplu voi folosi doar o parte din regiunile definite acolo.
Urmatorul pas este sa includem libraria Template in aplicatie, pentru ca aceasta sa nu trebuiasca initializata de fiecare data cand o apelam. Pentru aceasta, editam fisierul autoload.php din folder-ul config. Astfel, in fisierul autoload.php trebuie sa avem urmatoarele:
$autoload['libraries'] = array('database', 'session', 'template');
Acum trebuie sa construim un Controller care sa se foloseasca de capabilitatile librariei Template. Il vom numi main.php si codul va arata astfel:
<?php class Main extends Controller { function Main() { parent::Controller(); } function index() { $this->template->write('title', 'Pagina template'); $this->template->write_view('content', 'index'); $this->template->render(); } } ?>
Sa explicam codul de mai sus. Folosim doua functii din libraria Template. Prima este functia write(), cu ajutorul careia vom scrie textul ‘Pagina Template’, in regiunea title. Vom vedea imediat si cum va fi folosit in view. A doua functie pe care o folsim este write_view(). Aceasta este de fapt functia care face libraria Template atat de utila. Ia continutul unui view si-l scrie in regiunea specificata ca parametru. Ultima instructiune, render(), face ca template-ul sa fie executat. Fara ea, nu vom vedea nimic la ecran.
Dupa cum vedeti in codul de mai sus, al doi-lea parametru al functiei write_view() este un view, al carui continut sa fie scris in regiunea trimisa ca prim parametru. Pentru simplitate, vom folosi un view cu foarte putin cod, doar cat sa avem un rezultat vizual. Il vom numi index.php si codul va arata astfel:
<h1>Acesta este continut dinamic</h1>
Acum sa vedem cum va arata codul pentru template-ul efectiv. Acesta este reprezentat de View-ul layout.php si codul acestuia va arata astfel:
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title><?php echo $title ?></title> </head> <body> <div id="wrapper"> <div id="header"> <!-- Continut Header --> </div> <div id="nav"> <!-- Elemente de meniu --> </div> <div id="content"> <div id="section"> <?php echo $content ?> </div> <div id="aside"> <!-- Continut sidebar --> </div> </div> </div> <div id="footer"> <!-- Continut footer --> </div> </div> </html>
In acest moment, daca scriem in browser url-ul: http://localhost/codeigniter/index.php/main, vom vedea ca in zona in care facem output la variabila $content, avem continutul pe care l-am scris in fisierul index.php.
Dupa cum puteti vedea, acum avem un singur template, cu una sau mai multe zone dinamice, pe care putem sa le populam cu ajutorul controller-ului. Mie mi se pare ca aceasta este o solutie mai eleganta decat ce ofera CodeIgniter, si este ceea ce folosesc la proiectele mele scrise cu ajutorul acestui framework.