View je prezentacija podataka odnosno ono što korisnik vidi u svom browseru.
Dakle, to je HTML dokument sa ubačenim PHP varijablama.
Phalcon korristi PHP Template Engine i VOLT Template Engine.
Ako koristi PHP kao template onda fajl mora imati .phtml extenziju.
U drugom slučaju to je .volt.
Dvije klase su odgovorne za view. To su Phalcon\Mvc\View i Phalcon\Mvc\View\Simple.
Hijerarhijsko renderiranje
Phalcon\Mvc\View podržava hijerarhijsko renderiranje view-a. To znači da će se sjediniti fajlovi:
MAIN: /views/index.phtml - zajednički za cijelu aplikaciju
CONTROLLER: /views/layouts/posts.phtml - zajednički za sve akcije u PostsControler-u
ACTION: app/views/posts/show.phtml - view samo za postsAction() akciju
Dakle url bi trebao izgledati http://.../phalcon/posts/show gdje je
phalcon - direktorij u koji je smješten app i public directorij
posts - se odnosi na PostsController
show - se odnosi na showAction
Na ovaj način se stvara hijerarhija view fajlova.
Da bi se hijerarhijski viši fajl uključio u sebe sadržaj hijerarhijski nižeg fajla
potrebno je napisati:
<?php echo $this->getContent() ?>
Primjer hijerarhijskog učitavanja view fajlova:
/.../a050viewhierarchy : pokreni primjer
/.../a050viewhierarchy/ispis : pokreni primjer
SOURCES:
/controllers/A050ViewHierarchyController.php -controller
/views/index.phtml -main layout
/views/layouts/a050viewhierarchy.phtml -controller layout
/views/a050viewhierarchy/ispis.phtml -action view
Templates
Templates-i su view fajlovi koji su zajednički svim kontrolerima. Budući da ih dijele svi kontroleri onda se stavljaju u /views/layouts/ direktorij.
Unutar controller klase najčešće ga stavljamo u initialize() metodu te ga pozivamo sa setTemplateAfter().
public function initialize()
{
$this->view->setTemplateAfter('menu');
}
Primjer učitavanja templatesa initialize() metodom:
/.../a051viewtemplates : pokreni primjer
/.../a051viewtemplates/ispis : pokreni primjer
/.../a051viewtemplates/setafter : pokreni primjer
/.../a051viewtemplates/setbefore : pokreni primjer
/.../a051viewtemplates/setlayout : pokreni primjer
SOURCES:
/controllers/A051ViewTemplatesController.php -controller
/views/index.phtml -main layout
/views/layouts/a051viewtemplates.phtml -controller layout
/views/layouts/template_menu.phtml -template
/views/a051viewtemplates/ispis.phtml -action view
Metode Phalcon\Mvc\View klase koje se koriste za templates:
1. setTemplateAfter('menu'); - controller layout tj /layouts/ctrl.phtml se učita nakon /layouts/menu.phtml
2. setTemplateBefore('menu'); - controller layout tj /layouts/ctrl.phtml se učita prije /layouts/menu.phtml
3. setLayout('menu'); - umjesto /layouts/ctrl.phtml ide /layouts/template.phtml
Kontroliranje Render levela
Kao što smo vidjeli u Phalconu postoji hijerarhija view fajlova. Prvo se automatski prikazuje main layout
(/views/index.phtml), koji zatim poziva controller layout (/views/layouts/crtl.phtml),
a koji opet poziva action view (/views/ctrl/action.phtml).
Također kao međufaze možemo ubaciti template pomoću setTemplateBefore() i setTemplateAfter().
Unutar kontroler-a ili pak bootstrap fajla možemo kontrolirati od kojeg nivoa će se početi izvršavati hijerarhija
view fajlova. To postižemo sa setRenderLevel() metodom.
public function initialize()
{
$this->view->setRenderLevel(View::LEVEL_ACTION_VIEW);
}
Definiranje od kojeg nivoa počinje izvršavanje hijerarhije view fajlova:
1. LEVEL_MAIN_LAYOUT -počinje od Main Layouta tj. index.phtml.
2. LEVEL_AFTER_TEMPLATE -počinje od After Template-a tj. od /layouts/templateAfter.phtml
3. LEVEL_LAYOUT -počinje od Controller Layouta tj. od /layouts/ctrl.phtml
4. LEVEL_BEFORE_TEMPLATE -počinje od Before Template-a tj. od /layouts/templateBefore.phtml
5. LEVEL_ACTION_VIEW -počinje od Action View-a tj. od /ctrl/action.phtml
6. LEVEL_NO_RENDER -ne šalje niti jedan view fajl iz hijerarhije
U ovom primjeru se automatski učitavaju main layout, after template, controller layout, before template te
na kraju action view. U URLu ćemo sa parametrima od 0 do 5 definirati koji render level ćemo upotrijebiti:
/.../a055renderlevel/ispis/0 : pokreni primjer - LEVEL_NO_RENDER
/.../a055renderlevel/ispis/1 : pokreni primjer - LEVEL_ACTION_VIEW
/.../a055renderlevel/ispis/2 : pokreni primjer - LEVEL_BEFORE_TEMPLATE
/.../a055renderlevel/ispis/3 : pokreni primjer - LEVEL_LAYOUT
/.../a055renderlevel/ispis/4 : pokreni primjer - LEVEL_AFTER_TEMPLATE
/.../a055renderlevel/ispis/5 : pokreni primjer - LEVEL_MAIN_LAYOUT
SOURCES:
/controllers/A055RenderLevelsController.php -controller
/views/index.phtml -main layout
/views/layouts/a055renderlevels.phtml -controller layout
/views/layouts/template_after.phtml -template after
/views/layouts/template_before.phtml -template before
/views/a051viewtemplates/ispis.phtml -action view
Isključivanje render levela
Za isključivanje render levela koristi se metoda
//isključivanje jednog levela
$this->view->disableLevel(View::LEVEL_MAIN_LAYOUT);
ili
//isključivanje više levela
$view->disableLevel(array(
View::LEVEL_LAYOUT => true,
View::LEVEL_MAIN_LAYOUT => true
));
U ovom primjeru se pomoću disableLevel() isključuju MAIN LAYOUT i CONTROLLER LAYOUT te ostaju samo TEMPLATE AFTER i TEMPLATE BEFORE. Primjer nema Action View.
/.../a056disablelevel: pokreni primjer - prikazuje sve
/.../a056disablelevel/dis : pokreni primjer - ne prikazuje main i controller layout
SOURCES:
/controllers/A056disableLevelsController.php -controller
/views/index.phtml -main layout
/views/layouts/a056disablelevels.phtml -controller layout
/views/layouts/template_after.phtml -template after
/views/layouts/template_before.phtml -template before
Picking Views
Osim automatskog učitavanja view fajlova može se pomoću metode pick() i uzimati pojedini view fajlovi. U tom slučaju se umjesto automatskog učitavanja Controller Layouta učitava view uzet sa pick(). Ostali layouti (template after, template before i action view) se učitavaju normalno.Primjer učitava fajl /views/layouts/template_menu.phtml .
/.../a058Pick: pokreni primjer
/.../a058Pick/arr: pokreni primjer
SOURCES:
/controllers/A058PickController.php -controller
/views/index.phtml -main layout
/views/layouts/a058pick.phtml -controller layout
/views/layouts/template_menu.phtml -nekakav menu
Blokiranje prikaza
Ukoliko ne želimo prikaz sadržaja (izlaz) u browser upotrijebit ćemo disable() metodu.Primjer pokazuje kako blokirati prikaz u browser .
/.../a059disableview: pokreni primjer -ne prikazuje se ništa, nema HTML coda
SOURCES:
/controllers/A058PickController.php -controller
Simple Rendering
Za simple rendering se umjesto Phalcon\Mvc\View koristi Phalcon\Mvc\View\Simple namespace. U njemu je izostavljeno hijerarhijsko učitavanje view fajlove te više sliči na CodeIgniter. Da bi sve radilo mora se prvo registrirati Simple View servis u bootstrap fajlu.
$di->set('view', function() {
$view = new Phalcon\Mvc\View\Simple();
$view->setViewsDir('../app/views/');
return $view;
}, true);
//Render 'views-dir/index.phtml'
echo $this->view->render('index');
//Render 'views-dir/posts/show.phtml'
echo $this->view->render('posts/show');
//Render 'views-dir/index.phtml' passing variables
echo $this->view->render('index', array('posts' => Posts::find()));
//Render 'views-dir/posts/show.phtml' passing variables
echo $this->view->render('posts/show', array('posts' => Posts::find()));
Primjer pokazuje na koji način aktivirati Simple View unutar controllera bez
definiranja servisa u bootstrap fajlu.
/.../a060simple: pokreni primjer
SOURCES:
/controllers/A060simpleController.php -controller
Partial Templates
Pomoću metode partial() mogu se ubacivati pojedini fragmenti HTML coda unutar View fajla.
<?php $this->partial('shared/ad_banner'); ?>
Primjer pokazuje na koji način se unutar view fajla može ubaciti neki drugi partial view fajl.
/.../a062partial: pokreni primjer
SOURCES:
/controllers/A062partialController.php -controller
/views/layouts/a062partial.phtml -controller layout
/views/partials/angularjs.phtml -partial template
Primjer pokazuje na koji način se unutar view fajla može ubaciti neki drugi partial view fajl.
Unutar fajla /views/partials/angularjs2.phtml definirati $ng koja će se proslijediti u partial fajl /views/partials/.
/.../a063partialvar: pokreni primjer
SOURCES:
/controllers/A063partialvarController.php -controller
/views/layouts/a063partialvar.phtml -controller layout koji šalje $ng
/views/partials/angularjs2.phtml -partial template koji prima $ng
Transfer varijabli iz controlera u view
Da bi se definirala jedna varijabla koju će primiti view koristi se setVar().
$this->view->setVar('var','Nekakav string koji je došao iz kontrolera!');
$this->view->setVars(
array(
'main'=>'String iz kontrolera za main layout.',
'var'=>'String iz kontrolera za controller layout'
)
);
Primjer pokazuje proslijeđivanje jedne varijable i niza varijabli u view. U actionu arr()
upotrijebljen je niz varijabli. Jednu varijablu niza koristi main layout dok drugu koristi controller layout.
/.../a065transfervar: pokreni primjer -jedna varijabla
/.../a065transfervar/arr: pokreni primjer -niz varijabli
SOURCES:
/controllers/A065transferVarController.php -controller šalje varijable
/views/layouts/a065transfervar.phtml -controller layout koji prima varijable
Naredni primjer pokazuje upotrebu foreach() funkcije ukoliko view uzima niz iz kontrolera.
Kako bi primjer bio složeniji za niz smo umjesto niza varijabli definirali niz objekata.
/.../a066transferniz: pokreni primjer -niz objekata
SOURCES:
/controllers/A066transferNizController.php -controller
/views/layouts/a066transferniz.phtml -controller layout
Caching View
U Phalconu postoji keširanje cijelog view-a ili samo pojedinog dijela. Keširanje može biti postavljeno u controlleru ili globalno u bootstrap fajlu. Metode za keširanje su smještene unutar Phalcon/Cache klase.Postoji nekoliko adaptera za cache: File, Memcached, APC, Mongo i XCache.
//Setup File Caching
$di->set('cache', function(){
$frontCache = new Phalcon\Cache\Frontend\Data(array(
'lifetime' => 1000
));
$cache = new Phalcon\Cache\Backend\File($frontCache, array(
'cacheDir' => '../app/cache/'
));
return $cache;
});
Keširanje web stranice pomoću fajla. Umjesto service injection upotrijebljena initialize() metoda. Cache traje 10 sekundi.
/.../a070cache: pokreni primjer -keširanje podataka iz niza $podaci
/.../a070cache/get: pokreni primjer -prikaz keširanih podataka
SOURCES:
/controllers/A070cacheController.php -controller
/views/layouts/a070cache.phtml -controller layout