Een inleiding tot Views & Templating in CodeIgniter

Views zijn een belangrijk ingrediënt in elke MVC-applicatie en CodeIgniter-applicaties zijn niet anders. Vandaag gaan we leren wat een weergave is, en ontdekken hoe ze kunnen worden gebruikt om een ​​sjablonerende oplossing te maken voor uw CodeIgniter-projecten.

Het eerste deel van deze tutorial zal complete beginners opleiden tot CodeIgniter over wat een weergave is, en hoe ze in een typische applicatie moeten worden gebruikt. In de tweede helft worden de motivaties voor het vinden van een template-oplossing besproken en wordt de lezer door de nodige stappen geleid voor het maken van een eenvoudige, maar effectieve template-bibliotheek.. 

Als u meer wilt doen met CodeIgniter, bekijk dan het bereik van CodeIgniter-plug-ins en codescripts op Envato Market.

CodeIgniter-plug-ins en codescripts op Envato Market

Wat is een weergave?

Weergaven zijn speciale bestanden die in CodeIgniter worden gebruikt om de markup op te slaan die door de applicatie wordt uitgevoerd, meestal bestaande uit HTML en eenvoudige PHP-tags.

"Een weergave is gewoon een webpagina of een paginafragment, zoals een koptekst, voettekst, zijbalk, enzovoort. In feite kunnen weergaven flexibel worden ingesloten in andere weergaven (binnen andere weergaven, enz.) Als u dit nodig hebt type hiërarchie. "

Weergaven worden geladen vanuit de controlemechanismemethoden, waarbij de inhoud in de weergave vervolgens in de browser wordt weergegeven.


Hoe een weergave te laden

Om een ​​weergave in CodeIgniter te laden (en weer te geven), gebruiken we de ingebouwde Loader-bibliotheek.

$ this-> load-> view ('hello_world', $ data, true / false);

Deze enkele coderegel vertelt CodeIgniter waarnaar moet worden gezocht hello_world.php in de application / x bekeken map en geeft de inhoud van het bestand weer in de browser.

Notitie Met die CodeIgniter kun je het achtervoegsel .php uitsluiten, wat een paar toetsaanslagen bespaart bij het typen van de bestandsnaam van de weergave die je wilt laden.

De tweede parameter, $ data, is facultatief en neemt een associatieve array of object. Deze array / object wordt gebruikt om gegevens door te geven aan het weergavebestand, zodat het kan worden gebruikt of waarnaar wordt verwezen in de weergave.

De laatste facultatief parameter bepaalt of de inhoud van de weergave wordt weergegeven in het browservenster of wordt geretourneerd als een tekenreeks. Deze parameter is standaard ingesteld op false en geeft de inhoud in de browser weer. We zullen later in de tutorial zien hoe deze parameter kan worden gebruikt bij het maken van een template-oplossing.


Een weergave maken en weergeven

Maak een nieuw bestand met de naam om onze eerste weergave in te stellen hello_world.php in application / x bekeken en schrijf de volgende eenvoudige HTML in:

   Hallo Wereld!   

Hallo Wereld!

Om deze weergave in de browser weer te geven, moet deze binnen een Controller-methode worden geladen, met behulp van de bovengenoemde methode.

Dus laten we een nieuw Controller-bestand maken met de naam hello_world.php in application / controllers en plaats de volgende code in. Vanuit deze controller laden we de zojuist gemaakte weergave.

load> view ( 'hello_world'); 

Je browser naar richten http://your-ci-install.com/index.php/ zal nu resulteren in de HTML in application / views / hello_world.php wordt uitgevoerd in de browser. Je hebt met succes een weergave geladen!

Meerdere weergaven laden

Het splitsen van een weergave in verschillende bestanden maakt uw website gemakkelijker te onderhouden en vermindert de waarschijnlijkheid van dubbele code.

Een enkele weergave weergeven is allemaal goed en wel, maar u wilt de uitvoer mogelijk opsplitsen in verschillende, afzonderlijke bestanden, zoals koptekst, inhoud en voettekst keer bekeken.

Het laden van verschillende views wordt bereikt door alleen de $ This-> load-> weergave () methode meerdere keren. CodeIgniter koppelt vervolgens de inhoud van de views samen voordat deze in de browser wordt weergegeven.

Maak een nieuw bestand met de naam header.php in application / x bekeken en knip en plak de eerste paar regels van ons origineel hello_world.php bestand in.

   Hallo Wereld!  

Maak op dezelfde manier een ander bestand met de naam footer.php in application / x bekeken en verplaats de laatste twee regels van hello_world.php in.

 

Dit verlaat de hello_world.php bekijk bestand dat alleen onze pagina-inhoud bevat.

Hallo Wereld!

Om de pagina opnieuw weer te geven, moeten we alle drie de weergaven laden (header.php, hello_world.php, footer.php), in volgorde, binnen onze controller.

Re-geopend application / controllers / hello_world.php en voeg de nieuwe toe $ This-> load-> weergave () oproepen boven en onder de bestaande.

load> view ( 'header'); $ This-> load-> weergave ( 'hello_world'); $ This-> load-> weergave ( 'footer'); 

Omdat de kop- en voettekstweergaven nu gescheiden zijn van de Hallo Wereld weergave betekent dit dat ze kunnen worden gebruikt in combinatie met andere weergaven op de website. Dit betekent dat de code in de kop- en voetteksten niet moet worden gekopieerd naar andere weergaven in het project waarvoor deze code vereist is.

Uiteraard is dit een enorm voordeel, aangezien elke wijziging in de HTML of inhoud in de views, bijvoorbeeld het toevoegen van een nieuw stylesheet aan de header, kan worden aangebracht op slechts één bestand en niet op elk bestand!


Gegevens uit de controller gebruiken in de weergave

Nu zullen we kijken naar het doorgeven van gegevens van de controllers, zodat ze kunnen worden gebruikt of uitgevoerd in de weergave.

Om dit te bereiken, zullen we een associatieve array doorgeven, $ data als de tweede parameter in de $ This-> load-> weergave () telefoontje.

De waarden van deze array zal toegankelijk zijn in de geladen weergave als variabelen, genoemd naar hun respectieve sleutels.

$ data = array ('title' => 'Hello World!', 'content' => 'Dit is de inhoud', 'posts' => array ('Post 1', 'Post 2', 'Post 3') ); $ this-> load-> view ('hello_world', $ data);

De bovenstaande code geeft de variabele $ title de waarde 'Hallo wereld!' binnen in de Hallo Wereld uitzicht.

Variabelen gebruiken in weergaven

Nadat we onze gegevens hebben doorgegeven aan de weergavebestanden, kunnen de variabelen op de gebruikelijke manier worden gebruikt.

Meestal gebruikt het weergavebestand de doorgegeven gegevens om:

  • Geef de waarde van een variabele weer
  • Loop door arrays of objecteigenschappen
  • Gebruik voorwaardelijke instructies om markeringen weer te geven of te verbergen

Ik zal snel voorbeelden bespreken van hoe elk te doen.

Gebruik de eenvoudige en vertrouwde echo-instructie om de inhoud van een variabele weer te geven:

 

Het doorlopen van een array of object is een veelvoorkomende taak in viewbestanden en kan worden bereikt met een foreach-lus:

Eenvoudige voorwaardelijke instructies kunnen in weergavebestanden worden gebruikt om de uitvoer enigszins te wijzigen, afhankelijk van de gegevens die worden doorgegeven.

Over het algemeen wilt u het gebruik van voorwaardelijke verklaringen in weergaven tot een minimum beperken, aangezien overmatig gebruik kan leiden tot gecompliceerde weergavebestanden met 'bedrijfslogica'. Het splitsen van de weergave in verschillende bestanden en beslissen welke in de controller moet worden getoond, heeft veel meer de voorkeur.

 

Log alstublieft in

In het bovenstaande voorbeeld wordt een bericht 'Welkom' weergegeven of een verzoek voor de gebruiker om in te loggen, afhankelijk van de waarde van $ logged_in (waar onwaar).


Templating in CodeIgniter

We hebben gezien hoe het splitsen van weergaven in afzonderlijke, kleinere bestanden kan helpen om het aantal bestanden in uw CodeIgniter-projecten te ordenen en te verminderen, maar nu moeten er meerdere weergavebezoeken in load worden gemaakt, elk exemplaar krijgt een pagina te zien.

Laten we aannemen dat u afzonderlijke kop- en voettekstweergaven hebt, die worden gebruikt om een ​​sjabloon te vormen. Elke instantie in het project waar u een pagina wilt laden en weergeven met behulp van deze sjabloon, moet drie weergavebelastingen oproepen. Dit kan niet alleen uw regelaars rommelig maken, maar het resulteert ook in veel herhaalde code - precies datgene waarvan we ons wilden ontdoen door de bestanden op te splitsen.

Als u nu extra markeringen aan deze sjabloon wilt toevoegen, bijvoorbeeld een zijbalkmenu. Het kan gaan in de koptekstweergave, maar het is meer geschikt om in een aparte weergave te zijn. Door deze nieuwe weergave aan de bestaande sjabloon toe te voegen, doorloopt u elk exemplaar van de weergave en voegt u er een andere toe. Dit kan snel rommelig worden.

We hebben een manier nodig om weergavebestanden te kunnen bevatten die individuele pagina-inhoud weergeven, binnen een sjabloon, zonder herhaling van code, en een manier om eenvoudig en efficiënt wijzigingen in de sjabloon aan te brengen..

De volgende stappen zullen u helpen bij het maken van een eenvoudige CodeIgniter-bibliotheek die aan deze behoeften voldoet, evenals:

  • Het afdwingen van een voorspelbare en onderhoudbare directorystructuur voor uw weergaven
  • Hiermee wordt toegestaan ​​dat meerdere afzonderlijke sjablonen worden gebruikt
  • Het laden van een paginaweergave beperken tot slechts één regel code

Zodra de bibliotheek is geschreven en in onze CodeIgniter-gereedschapsriem, kunnen we een sjabloonpagina weergeven zoals:

$ this-> template-> load ('template_name', 'body_view');

Veel leuker!

Onze templating-oplossing gebruikt beeldbestanden die de volledige markup van een sjabloon bevatten, waarbij een tijdelijke aanduiding voor een ander weergavebestand (met de pagina-inhoud) wordt ingesloten in.

De tijdelijke aanduiding is eigenlijk gewoon een variabele met de naam $ lichaam. Bij het laden van een template-weergave met onze bibliotheek, wordt de inhoud van het juiste body view-bestand hieraan toegewezen $ lichaam, de weergave insluiten binnen de sjabloon.


Stap 1: De map instellen

We willen een verstandig en voorspelbaar directory-systeem afdwingen zodat onze weergavebestanden kunnen worden ondergebracht, zodat onze standpunten zijn:

  • Eenvoudig te vinden
  • Eenvoudig te bepalen tot welk gedeelte van de applicatie zij behoren
  • Makkelijk te onderhouden

Ons directorysysteem stelt de bibliotheek ook in staat om slim vast te stellen waar te zoeken naar beeldbestanden, waardoor de hoeveelheid code die nodig is om een ​​sjabloonbeeld te laden, wordt verminderd.

Maak een nieuwe map binnen de application / x bekeken map en noem deze templates. Deze map bevat de verschillende sjabloonweergaven.


Stap 2: De bibliotheek maken

Bibliotheken in CodeIgniter zijn slechts PHP-klassen en worden in controllers geladen zoals weergaven zijn.

$ This-> load-> library ( 'class_name');

Aangepaste bibliotheken die u gebruikt in uw CodeIgniter-projecten worden opgeslagen in de application / bibliotheken map. Begin met het schrijven van onze sjabloonbibliotheek en maak een nieuw bestand aan in deze map met de naam template.php, en plaats de volgende code in:

ci = & get_instance (); 

De bovenstaande code definieert een nieuwe klasse of bibliotheek met de naam Sjabloon en de __construct () methode binnen.

Met deze methode wordt het superobject CodeIgniter toegewezen aan de $ ci class variable, waardoor alle bronnen van CodeIgniter kunnen worden gebruikt door te vervangen $ this met $ This-> ci in de gebruikelijke methode oproepen.

Wanneer de bibliotheek is geladen in het kader van CodeIgniter, wordt het __construct () methode wordt automatisch gebeld.

De belastingsmethode schrijven

Nu zullen we de methode schrijven om een ​​sjabloonweergave daadwerkelijk te laden. We willen maximaal drie parameters doorgeven aan deze functie:

  • De sjabloonnaam
  • De naam van de lichaamsweergave (optioneel)
  • De gegevens die moeten worden doorgegeven aan de views (optioneel)

Het resultaat van deze methode die wordt aangeroepen, is dat de sjabloonweergave in de browser wordt weergegeven, met de body view erin ingebed, als er een wordt geleverd.

Onder de __construct () methode, plaats de volgende code:

functie laden ($ tpl_view, $ body_view = null, $ data = null) if (! is_null ($ body_view)) if (file_exists (APPPATH.'views /'.$ tpl_view. '/'. $ body_view))  $ body_view_path = $ tpl_view. '/'. $ body_view;  else if (file_exists (APPPATH.'views /'.$ tpl_view. '/'. $ body_view. '. php')) $ body_view_path = $ tpl_view. '/'. $ body_view. '. php';  else if (file_exists (APPPATH.'views /'.$ body_view)) $ body_view_path = $ body_view;  else if (file_exists (APPPATH.'views /'.$ body_view. '. php')) $ body_view_path = $ body_view. '. php';  else show_error ('Kan het gevraagde bestand niet laden:'. $ tpl_name. '/'. $ view_name. '. php');  $ body = $ this-> ci-> load-> view ($ body_view_path, $ data, TRUE); if (is_null ($ data)) $ data = array ('body' => $ body);  else if (is_array ($ data)) $ data ['body'] = $ body;  else if (is_object ($ data)) $ data-> body = $ body;  $ this-> ci-> load-> view ('templates /'.$ tpl_view, $ data); 

De bovenstaande code begint met het controleren of de $ body_view parameter is aan de methode geleverd. Deze variabele bevat de naam van de weergave die moet worden gebruikt als het hoofdgedeelte in de sjabloonweergave.

 if (! is_null ($ body_view))

Als de parameter wordt opgegeven, wordt een reeks controles van bestandscontrole uitgevoerd om het weergavebestand in ons directorysysteem te proberen te vinden.

if (file_exists (APPPATH.'views /'.$ tpl_view. '/'. $ body_view)) $ body_view_path = $ tpl_view. '/'. $ body_view;  else if (file_exists (APPPATH.'views /'.$ tpl_view. '/'. $ body_view. '. php')) $ body_view_path = $ tpl_view. '/'. $ body_view. '. php'; 

De code probeert eerst het weergavebestand in een map te lokaliseren met dezelfde naam als de sjabloon in de application / x bekeken map.

Dit is handig als delen van uw project drastisch verschillen van andere en verschillende sjablonen gebruiken. In deze omstandigheden is het logisch deze weergavebestanden samen te groeperen.

Veel websites hebben bijvoorbeeld een andere sjabloon voor afzonderlijke gedeelten, zoals blogs. In ons systeem kunnen de blogweergavebestanden in de map worden geplaatst application / views / blog map, die ze scheidt van de hoofdsite-weergaven.

Als het weergavebestand zich niet in deze map bevindt, .php wordt toegevoegd aan het einde van de bestandsnaam en de controle wordt opnieuw uitgevoerd. Dit is eenvoudig .php kan worden uitgesloten zoals de autochtone $ This-> load-> weergave () telefoontje.

Als het bestand nog steeds niet kan worden gevonden, worden verdere controles op de locatie uitgevoerd.

else if (file_exists (APPPATH.'views /'.$ body_view)) $ body_view_path = $ body_view;  else if (file_exists (APPPATH.'views /'.$ body_view. '. php')) $ body_view_path = $ body_view. '. php';  else show_error ('Kan het gevraagde bestand niet laden:'. $ tpl_name. '/'. $ view_name. '. php'); 

Deze keer controleert de code of het weergavebestand zich in de map bevindt application / x bekeken map, en nogmaals, als het niet kan worden gevonden, voegt het toe .php en controleert nogmaals.

Als het bestand zich op een van deze plaatsen bevindt, wordt het pad toegewezen aan $ body_view_path, anders wordt een foutmelding gegenereerd met behulp van de show_error () functie ingebouwd in CodeIgniter, en het script is beëindigd.

Als het body view-bestand met succes is gevonden, wordt de inhoud toegewezen aan de $ lichaam veranderlijk.

 $ body = $ this-> ci-> load-> view ($ body_view_path, $ data, TRUE);

We passeren de $ data parameter (null indien niet meegeleverd) voor de load-aanroep bekijken en stel de derde parameter in op waar om de uitvoer van het aanzicht als een tekenreeks terug te geven.

We voegen dit nu toe $ lichaam variabele naar de lijst met gegevens in $ data zodat het kan worden ingesloten in de sjabloonweergave wanneer het wordt geladen.

if (is_null ($ data)) $ data = array ('body' => $ body);  else if (is_array ($ data)) $ data ['body'] = $ body;  else if (is_object ($ data)) $ data-> body = $ body; 

Als $ data werd niet aan de laden() telefoontje, $ data is toegewezen aan een array met $ lichaam onder de toets lichaam. Als de parameter is opgegeven, $ lichaam wordt aan de lijst toegevoegd door deze toe te wijzen aan een arraysleutel of aan een objecteigenschap, beide ook benoemd lichaam.

De $ lichaam variabele kan nu worden gebruikt in sjabloonweergavebestanden als een tijdelijke aanduiding voor ingesloten weergaven.

De laatste regel van onze methode laadt het sjabloonweergavebestand van de application / views / templates map en geeft de $ data variabele in de tweede parameter.

 $ this-> ci-> load-> view ('templates /'.$ tpl_name, $ data);

En dat is het! De bibliotheek kan nu worden gebruikt.


De bibliotheek gebruiken

Als u onze bibliotheek wilt gaan gebruiken, maken we een sjabloonweergave met de naam default.php in application / views / templates, en plaats de volgende HTML / PHP in de map:

   <?php echo $title; ?>   

Standaard sjabloon

In deze sjabloon verwijzen we naar twee variabelen, $ title en $ lichaam.

Bedenk dat in onze sjabloonbestanden, $ lichaam dient als een tijdelijke aanduiding voor een ingesloten weergave.

We zullen nu een andere visie maken om ingebed te worden in deze sjabloon. Maak een nieuw bestand met de naam content.php in application / views / en plaats deze eenvoudige HTML erin:

Hallo Wereld!

We zijn nu klaar om de sjabloonpaginaweergave vanuit een controller te laden.

Binnen elke controlemechanismemethode plaatst u de volgende code om de inhoud bekijken, binnen de standaard sjabloon.

$ data = array ('title' => 'Titel komt hier',); $ This-> load-> library ( 'template'); $ this-> template-> load ('default', 'content', $ data);

Notitie: de bibliotheek moet worden geladen voordat je de laden methode. Om uzelf te besparen bij het laden van de bibliotheek telkens wanneer een sjabloonweergave moet worden weergegeven,
autoload de klasse door deze toe te voegen aan de reeks bibliotheken in application / config / autoload.php.

Als u in plaats van een weergavebestand een tekenreeks wilt insluiten in de sjabloon, wijst u de tekenreeks eenvoudigweg toe aan de $ data array met behulp van de toets lichaam, en ga voorbij nul als de tweede parameter in de laadaanroep.

$ data = array ('title' => 'Title goes here', 'body' => 'De string die hier moet worden ingesloten!'); $ this-> template-> load ('default', null, $ data);

Snelle tip

Ik heb ontdekt dat het groeperen van bestanden in mappen door de controller, en zelfs de methode, waar ze toe behoren, echt helpt mijn weergaven georganiseerd te houden en gemakkelijk vindbaar te maken.

Als u uw weergaven op deze manier organiseert, resulteert dit in de directorystructuur die het URL-schema van controller / methode.

Stel dat uw project een controller heeft met de naam leden, bevattende methode lijst.

Een geschikte locatie voor de lijst weergavebestand zou binnen zijn application / views / leden, of application / views / leden / list, als deze methode meerdere weergaven laadt.

Deze weergave kan dan worden ingesloten in een sjabloon met behulp van onze bibliotheek met de volgende code:

$ this-> template-> load ('template_name', 'members / list');

Conclusie

De templating-oplossing die in deze tutorial wordt besproken, is slechts een van de vele manieren om templating te bereiken in CodeIgniter.

U moet nu hopelijk weten welke opvattingen er zijn en hoe u deze effectief en efficiënt kunt gebruiken in uw CodeIgniter-projecten.

De template-oplossing die in deze tutorial wordt besproken, is slechts een van de vele verschillende manieren om templating in CodeIgniter te bereiken. Er zijn een aantal verschillende benaderingen en ik moedig u aan, lezer, om de andere methoden te onderzoeken en te bepalen welke het beste bij uw projecten past.

Als je opmerkingen of vragen hebt over de tutorial of enig inzicht in verschillende sjabloonoplossingen, laat hieronder een reactie achter! Bedankt voor het lezen.