BasePresenter – jeho dědění a registrace filtru

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
maarlin
Člen | 207
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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“.

Jan Tvrdík
Nette guru | 2595
+
0
-

Asi máš nějakou starší revizi Nette.

maarlin
Člen | 207
+
0
-

Honzo, mnohokrát díky… Tohle mě fakt nenapadlo :)
Upgradoval jsem nejnovější a už to funguje.
Měl jsem tam verzi 0.8, revision 200 released on 2009/01/23 15:17:05. Na té to tedy nefunguje automaticky.