Jiný šablonovací systém
- Petr Daňa
- Člen | 109
Zdar, lze nějak rozumně nahradit Nette šablony jinými? Prohledával jsem fórum i stránky, nikde k tomuto tématu nic není. Nevím, jak dalece je systém presenterů propojený s šablonováním, takže ani jestli to lze jednoduše (no, spíš ne příliš složitě :) ) nahradit. Konkrétně mám na mysli Teng. Veškeré data pro šablonu se předávají ve stromovém poli.
- David Grudl
- Nette Core | 8218
Například tak, že přepíši metodu createTemplate()
v Presenteru a nechám ji vygenerovat jiný objekt. Tento objekt však musí
implementovat interface Nette\Templates\ITemplate
mající metody
render() (a nejlépe i setFile, getFile). Takže stačí vytvořit wrapper nad
jiným šablonovacím systémem.
- kravčo
- Člen | 721
Petr Daňa napsal(a):
Díky za radu. Koukal jsem do zdrojáků a dokumentace, jak je to provázaný a teď nevím, vykreslitelné komponenty můžou mít taky svoje šablony? Protože ten createTemplate() je v Control, takže vlastně jen pro presentery?
Control – čoby vykresliteľný komponent – má metódu createTemplate a prezenter ju od nej dedí. Teda to chce rovnakým spôsobom prepísať metódu createTemplate v triedach odvodených od nich, povedzme:
class MyTemplateWrapper extends Object implements ITemplate
{
// getFile(), setFile($file), ...
public function render()
{
// ...
}
}
abstract class BasePresenter extends Presenter
{
protected function createTemplate()
{
$template = new MyTemplateWrapper;
// presenter setup
return $template;
}
}
abstract class BaseControl extends Control
{
protected function createTemplate()
{
$template = new MyTemplateWrapper;
// control setup
return $template;
}
}
A svoje konkrétne prezentery a controly dediť od týchto „upravených“ rodičov.
Editoval kravco (23. 1. 2009 16:40)
- Petr Daňa
- Člen | 109
To bude hlavně na Davida:
Začal jsem na tom dělat a zjistil jsem, že buď je potřeba ještě
překrýt ve vlastním Presenteru metodu renderTemplate
, nebo
v ní změnit podmínku
if ($template instanceof Template && !$template->getFile())
na kontrolu rozhrani, tj. ITemplate. Jenže to by se ještě muselo změnit
to samotné rozhraní ITemplate, a sice přidat do něj metody
setFile
(případně getFile
) a
addTemplate
– ovšem tato metoda už je spíš specifická pro
konkrétní šablonovací systém, tak nevím.
- David Grudl
- Nette Core | 8218
Přesně tak, addTemplate je hodně specifická a getFile() a setFile() zase dělají z ITemplate ryze souborovou záležitost. A protože zatím nikdo s požadavkem na jiný templatovač nepřišel, neřešil jsem to. Asi už je na čase ;)
Přidal jsem tedy interface IFileTemplate.