Jiný šablonovací systém

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

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

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.

Petr Daňa
Člen | 109
+
0
-

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?

kravčo
Člen | 721
+
0
-

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

Aha, teď jsem to v té dokumentaci přečetl pořádně a předtím jsem to chápal blbě. Vykreslitelná komponenta je cokoliv co dělí z Control, nevykreslitelná z Component, tak teď je to už jasný. No, po víkendu to v práci zkusím zpotvořit, jsem zvědavej, jestli se to zadaří :)

Petr Daňa
Člen | 109
+
0
-

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

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.