In deze post ga ik, zoals beloofd wat dieper in op het gebruik van views en templates. Allereerst behandelen we het simpel doorspelen van data van de controller naar de view, en vervolgens gaan we kijken naar het gebruiken van templates en site overkoepelende layouts.
We gaan weer verder waar we gebleven waren. Om te kijken of hij onze template (/application/default/views/scripts/index/index.phtml) wel rendert, gaan we daar wat content inzetten, en gaan we de indexAction leeg maken in onze indexcontroller. We maken de volgende 2 bestanden:
1: <?php
2: class IndexController extends Zend_Controller_Action
3: {
4: public function indexAction()
5: {
6: }
7: }
indexController.php
1: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"; "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd>
2: <html xmlns="http://www.w3.org/1999/xhtml">
3: <head>
4: <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
5: <title>Zend Framework opstarten</title>
6: </head>
7: <body>
8: <h1><?php echo ‘Dit is een kop.’ ?></h1>
9: </body>
10: </html>
index.phtml
Als we nu de pagina laten zien, krijgen we de pagina uit de index.phtml te zien, oftewel de view wordt gerenderd. We gebruiken er php code in om te laten zien dat dit mogelijk is. Interessanter is het natuurlijk om de content in de controller te genereren.
De index.phtml wordt ook wel het view script genoemd. Ondanks dat je opzich niet veel te maken hebt met de Zend_View class, is het denk ik wel belangrijk om van zijn bestaan af te weten. De view scripts worden namelijk uitgevoerd binnen de scope van deze class. Hierdoor moet naar de class gerefereerd worden door middel van $this. Bij een Controller wordt deze class automatisch geinstancieerd.
Je kan op een makkelijk manier variabele toe wijzen in de indexAction() aan de view. Hiervoor zijn verschillende syntaxen, namelijk:
1: $this->view->title = ‘De titel’;
2: $this->view->assign(‘title’, ‘De titel’);
welke je voorkeur heeft. Je kan ook arrays assignen aan een variabele. In de view scripts kun je deze vervolgens ophalen door middel van
1: $this->title;
Dus laten we nu de indexAction en het view script als volgt aanpassen (let op, dit zijn niet de hele files):
1: public function indexAction()
2: {
3: $this->view->title = "Dit is de nieuwe titel";
4: }
indexController.php
1: <body>
2: <h1><?php echo $this->escape($this->title); ?></h1>
3: </body>
index.phtml
Nu kunnen we zien dat als we de pagina laden, de nieuwe titel er is geplaatst. De functie escape plaatsen is een goede gewoonte om aan te leren, al hoef je het normaal alleen toe te passen op door gebruikers gegenereerde data. Dit zorgt er namelijk voor dat er geen vreemde en gevaarlijke data in je pagina’s terecht komt.
Wanneer je nu echter een keer een ander view script wilt laden? Hoe moet je dat doen. Het antwoord daarop is door de functie $this->render(’scriptnaam’) te gebruiken. Voor de volledigheid, de render functie accepteert 3 parameters, de eerste is de scriptnaam (+ evt de directory, gebruik geen .phtml, dit lijkt (vooralsnog) niet te werken), de tweede de plek de naam van het segment in het response object (negeer maar voor nu), en de derde de boolean of hij moet kijken in de subdirectory van de controller (index in dit geval), of niet, en omdat ik ook deze expliciet meegeeft, geef ik aan met true dat ik dat niet wil. De default is false. Voor meer informatie: http://framework.zend.com/manual/en/zend.controller.action.html#zend.controller.action.viewintegration.render
De indexController.php zouden we dus expliciet als volgt kunnen schrijven:
1: <?php
2: class IndexController extends Zend_Controller_Action
3: {
4: public function indexAction()
5: {
6: $this->view->title =‘Dit is de nieuwe titel’;
7: $this->render(‘index/index’,null,true);
8: }
9: }
Met view scripts is het ook mogelijk om een andere template engine te implementeren zoals Smarty, dit gaat echter het doel van deze handleiding voorbij, mede omdat ik daar niet de voorkeur voor heb. Er zijn echter legio bronnen te vinden waar ze dit wel beschrijven.
Helper functions
Door het gebruik van de Zend_View Class beschik je direct over een aantal helper functions die het leven makkelijker kunnen maken. En nog mooier, op een eenvoudige manier kun je zelf helper functies toevoegen. De standaard helperfunctions zijn om bijvoorbeeld een form te bouwen, maar daarvoor gaan wij straks iets anders gebruiken, namelijk Zend_Form. Wel handig is de helper url(), welke een nette url creëert (bijvoorbeeld door
$this->url(array('controller'=>'index', 'action'=>'add'))
). Meer hierover kun je vinden op
http://framework.zend.com/manual/en/zend.view.helpers.html
Hier kun je ook nog meer interessante helpers vinden, die we laten ook nog tegen zullen komen, zoals
$this->doctype('XHTML1_STRICT')
welke alvast de doctype voor je output. Als dat niet makkelijk is. Verder staat er ook hoe je een view helper kunt maken. Een manier om zelf een helper te maken is door een file met de naam van de functie te plaatsen in /application/default/views/helpers/. Onderstaande voorbeeld kun je dus aanroepen door middel van $this->baseUrl(). Let hierbij wel weer op de hoofdletters. Het bestand heet BaseUrl.php.
1: <?php
2: class Zend_View_Helper_BaseUrl
3: {
4: function baseUrl()
5: {
6: $fc = Zend_Controller_Front::getInstance();
7: return $fc->getBaseUrl();
8: }
9: }
Standaard moet een class beginnen met Zend_View_Helper_. Dit is aanpasbaar, maar daarvoor verwijs ik naar de documentatie.
Standaard Layout
Vaak heeft een site een vaste header en footer, dus zou het makkelijk zijn om deze niet in elk view script te moeten herhalen, en natuurlijk hoeft dat niet. Ik ben 2 manieren tegengekomen om dit gemakkelijker te maken, en ik zal beide aan je voorleggen, zodat je zelf kunt kiezen wat je het fijnste vindt.
Manier 1
Door middel van de php include functie kun je een andere file include en zo dus op elke pagina headers en footers include. Ik denk dat dit voor zich spreekt. Eventueel kun je nog gebruik maken van de _script view helper. in plaats van de include functie, kun je ook gebruik maken van de $this->render functie om specifieken templates te tonen.
Manier 2
Een mooiere manier om een basisstramien voor je site te gebruiken, is door gebruik te maken van de Zend_Layout class. Het doel van deze class is de mogelijkheid bieden om een site template te maken en daarin content te genereren.
Om gebruik te maken van Zend_Layout moeten we deze in de bootstrap initialiseren door middel van
Zend_Layout::startMvc();
Hierbij kun je een aantal argumenten meegeven, zoals de file die als template moet dienen. We gaan er even vanuit dat bij de site als geheel een layout hoort. Deze geven we daarom een plekje in de applicatiefolder. We maken daar een folder layouts waarin we het bestand layout.phtml aanmaken(dus /application/layouts/layout.phtml). Vervolgens geven we de file de volgende inhoud:
1: <?php echo $this->doctype(‘XHTML1_STRICT’); ?>
2: <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
3: <head>
4: <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
5: <title><?php echo $this->escape($this->title); ?></title>
6: </head>
7: <body>
8: <div id="content">
9: <?php echo $this->layout()->content; ?>
10: </div>
11: </body>
12: </html>
Hier herkennen we de doctype helper, en de normale manier van de title ophalen.
Nu moeten we het Zend Framework instueren om ook van deze layout gebruik te maken. Daarvoor passen we de bootstrap.php als volgt aan:
1: <?php
2:
3: /* Zet de error_reporting aan, en zet de tijzone op nederlandse tijd */
4: error_reporting(E_ALL|E_STRICT);
5: ini_set(‘display_errors’, 1);
6: date_default_timezone_set(‘Europe/Amsterdam’);
7:
8: /* Nu moeten we wel de library include */
9: set_include_path(‘../library’ . PATH_SEPARATOR . get_include_path());
10:
11: /* Zend laden en autoladen aanzetten */
12: require_once "Zend/Loader.php";
13: Zend_Loader::registerAutoload();
14:
15: /* Frontcontroller ‘ophalen’ */
16: $frontController = Zend_Controller_Front::getInstance();
17: /* errors weergeven */
18: $frontController->throwExceptions(true);
19: /* zorgen dat ZF weet waar de controllers zijn */
20: $frontController->setControllerDirectory(‘../application/default/controllers’, ‘default’);
21: /* Voeg de Layout controller toe om een sitetemplate te gebruiken */
22: $options = array(
23: ‘layout’ => ‘layout’,
24: ‘layoutPath’ => ‘../application/layouts’,
25: ‘contentKey’ => ‘content’,
26: );
27: Zend_Layout::startMvc($options);
28: /* Draaien */
29: $frontController->dispatch();
regels 22 tot en met 27 zijn hierin nieuw. Zoals je ziet geven we hier expliciet door welke filename (layout) hij moet hebben, waar deze zich bevindt, en welke variabele gebruikt moet worden om de views te laden. Dit is een beetje overbodig aangezien we voor layout en contentKey de default instellingen gebruiken, en we deze dus weg hadden kunnen laten, maar voor het begrip zijn ze geheid beter. Nu kun je je layouts namelijk ook ergens anders neer zetten, mocht je dat willen.
Het laatste wat we nu nog moeten doen is het view script aanpassen. Wanneer we nu naar de pagina gaan in een browser, zien we in de broncode dat nu alles er 2 keer komt te staan. Dit komt omdat we in het viewscript opnieuw de headers hebben geplaatst. Laten we index.phtml daarom vervangen door :
1: <p>Dit is een stukje content die we graag op het midden van de pagina hebben.</p>
Als we de pagina nu vernieuwen, zien we deze tekst staan, en de titel is verplaatst naar de titelbalk. Merk ook het automatisch geplaatste doctype op.
Nu hebben we op een mooie manier een overkoepelende layout gemaakt voor de website, die in alle controllers terug komt. Verder blijven de view scripts schoon van overbodige info, en kun je je hier uitleven wat betreft de inhoud.
Dat was het voor dit stukje. In volgende posts gaan we verder met Error handling, en natuurlijk gaan we langzaamaan op weg naar het gebruik van databases!

0 responses so far ↓
There are no comments yet...Kick things off by filling out the form below.
Leave a Comment