BasePresenter – jeho dědění a registrace filtru
- maarlin
- Člen | 207
Zdravím,
začínám s Nette a řeším asi primitivní problém.
V mnoha textech tady na webu i v tutoriálech je popsáno použití
CurlyBrackets filtru.
Konkrétně vytvořením vlastního presenteru (BasePresenter), který bude
děděn všemi ostatními presentery.
Můj BasePresenter vypadá takto:
<?php
abstract class BasePresenter extends NPresenter
{
public function templatePrepareFilters($template)
{
parent::templatePrepareFilters($template);
$template = $this->createTemplate();
$this->template->registerFilter(new CurlyBracketsFilter);
}
}
?>
Můj výchozí presenter – DefaultPresenter takto:
<?php
require_once ('BasePresenter.php');
class DefaultPresenter extends /*Nette\Application\*/BasePresenter
{
public function renderDefault()
{
$this->template->pageTitle = "Hlavní strana";
}
public function renderTable()
{
$this->template->pageTitle = "Tabulka XYZ";
}
}
?>
V první řadě asi není správné vkládat via require_once ten samotný
soubor s BasePresenterem – jak to dělat jinak, když se sám neloaduje?
Mám ho inicializovat v bootstrapu?
V druhé řadě i přes existenci řádky
<?php $this->template->registerFilter(new CurlyBracketsFilter); ?>
nefunguje filtrování HTML šablon – např. {$pageTitle} zůstane
v původní podobě.
- Etch
- Člen | 403
Nechtěl bych kecat ale CurlyBracketsFilter se snad v aktuální verzi nette registruje automaticky.
ohledně require_once nevím jak to dělají ostatní, ale já například ro u BasePresenteru používám sice by ho načetl RobotLoader, ale s tím je spojená jistá režie. Tedy pokud vím že nějakou třídu budu na 100% potřebovat načtu jí pomocí reqire_once. Jinak pokud se chceš ro vyhnout tak použij RobotLoader tedy v bootstrapu třeba :
$loader = new /*Nette\Loaders\*/RobotLoader();
$loader->addDirectory(APP_DIR);
$loader->addDirectory(LIBS_DIR);
$loader->register();
Editoval Etch (20. 8. 2009 23:52)
- redhead
- Člen | 1313
filter se registruje pomocí callbacku:
$template->registerFilter('Nette\Templates\CurlyBracketsFilter::invoke');
//EDIT: jako bych to nahoře nepsal…
spíš se mi ale zdá divné toto:
$template = $this->createTemplate();
nepřepisuje to tu $template co dostáváš jako pamaramter?
Editoval redhead (20. 8. 2009 23:58)
- Etch
- Člen | 403
Pokud překrýváš metodu templatePrepareFilters tak v ní registruj filtry takto :
public function templatePrepareFilters($template){
$template->registerFilter(new CurlyBracketsFilter); // Správně
/*$this->template->registerFilter(new CurlyBracketsFilter);*/ // Špatně
}
Filter CurlyBrackets se registuje automaticky viz. API
//EDIT: také bych se vyvaroval v templatePrepareFilters
volání parent::templatePrepareFilters($template)
může pak
totiž nastat situace kdy někdo kdo nebude vědět, že se filter CurlyBrackets
registruje automaticky ho zaregistruje dvakrát tedy třeba takto:
public function templatePrepareFilters($template){
parent::templatePrepareFilters($template);
$template->registerFilter(new CurlyBracketsFilter);
$template->registerFilter('TemplateFilters::netteLinks');
}
$this->template->registerFilter(new CurlyBracketsFilter);
se dá použít například pokud by si filter chtěl registrovat ve
startup()
Editoval Etch (21. 8. 2009 0:58)
- maarlin
- Člen | 207
Etch napsal(a):
Nechtěl bych kecat ale CurlyBracketsFilter se snad v aktuální verzi nette registruje automaticky.
Znamená to tedy, že pokud nebudu vůbec řešit BasePresenter a nechám si
svůj výchozí (DefaultPresenter), který bude dědit NPresenter, pak by se
v phtml šablonách měly automaticky překládat patřičné
„ozávorkované“ výrazy na PHP kód?
Protože popravdě se mi tak neděje… :(
/app/presenters/DefaultPresenter.php
<?php
class DefaultPresenter extends /*Nette\Application\*/NPresenter
{
public function renderDefault()
{
$this->template->pageTitle = "Hlavní strana";
}
}
?>
/app/templates/@layout.phtml
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>{$pageTitle}</title>
V prohlížeči zůstane zobrazeno {$pageTitle}, místo „Hlavní strana“.