Společný @layout pro více modulů

Kamil Valenta
Člen | 752
+
0
-

Ahoj,
potřeboval bych mít pro více modulů společnou šablonu @layout.latte

Intuitivně jsem si v abstraktním BasePresenteru přepsal metodu

public function formatLayoutTemplateFiles()

tak, aby mi krom nativních cest vracela i cestu moji. Výsledné pole je v pořádku,
má cesta je na prvním indexu.

Problém je, že se ta metoda nezavolá. Když do ní dám dump(‚called‘); exit;
tak se nic nestane.

Zkusil jsem tu metodu přepsat v konečném neabstraktním presenteru, který z BasePresenter dědí, ale ani tak se metoda formatLayoutTemplateFiles() nezavolala.

Když jsem hledal v diskuzích, všude se odkazují jen na přepsání této metody.

OK. Zkusil jsem si dát dump a exit přímo do Nette\Application\UI\Presenter → formatLayoutTemplateFiles().
Ani teď se nic nevypsalo a nestoplo :(

ali
Člen | 342
+
0
-

A dedi tvuj base presenter z UI\Presenter?

David Matějka
Moderator | 6445
+
0
-

mas v konkretni sablone pouzity {block content}?

Kamil Valenta
Člen | 752
+
0
-

ali: ano, dědí – i v IDE se proklikám durch všemi poděděnými

David Matějka: ano

CZechBoY
Člen | 3608
+
0
-

Já si myslim že tu metodu někde dědíš a nevoláš rodičovskou (proč taky). Zkus si fulltextem najít a projít všechny výskyty.

Kamil Valenta
Člen | 752
+
0
-

Kdyby to tak bylo, tak by se vykonal dump a exit obsažený v té poděděné.

OK. Vyhledal jsem všechny výskyty mimo vendor, našel jsem 1, zakomentoval. Zůstává poslední výskyt v Nette\App\UI\Presenter, nechávám tam dump a exit.

Vyvolám požadavek na presenter, vykreslí se jeho šablona, která má obsah v {block content}.

Na žádný @layout.latte se nesáhlo, dump a exit neproběhl…

Editoval kamil_v (7. 2. 2018 13:44)

CZechBoY
Člen | 3608
+
0
-

A určitě to ukládáš na server, na kterým to testuješ? Tohle je nějaký divný…

Kamil Valenta
Člen | 752
+
0
-

Jo, i to jsem kontroloval, ten App\UI\Presenter si otevřu přímo na FTP a dump s exitem tam vidím.

No to mi povídej, že je to divný, zasekl jsem se na tom už na několik hodin…

CZechBoY
Člen | 3608
+
0
-

Nemáš třeba nastavenej layout v šabloně?
Měly by to být makra {layout} nebo {extends}

Kamil Valenta
Člen | 752
+
0
-

OMG, ano. Makro {extends} tam mám. A máš pravdu, když ho zakomentuju, tak se to zavolá.

Kamil Valenta
Člen | 752
+
0
-

Jenže nevím, jak se obejít bez makra {extends}.

Jde mi o to, že mám řekněme takovou strukturu presenterů:

  • BasePresenter extend \Nette\App\UI\Presenter
  • Some1Presenter extend BasePresenter
  • Some2Presenter extend BasePresenter
  • SomeSpecific1Presenter extend Some1Presenter
  • SomeSpecific2Presenter extend Some2Presenter

A velice podobně jsem chtěl mít i šablony:

  • presenters/templates/Some1/default.latte – obsahující náplň do {block content}
  • presenters/templates/SomeSpecific1/default.latte – obsahující {extends ‚../Some1/default.latte‘} a doplňující nějaké bloky, nebo nedoplňující nic…

Celé to pak mělo být zapuštěno do patřičné @layout.latte, která by se řídila z $this->setLayout();

Editoval kamil_v (7. 2. 2018 14:17)

Šaman
Člen | 2632
+
+1
-

Každá koncová šablona musí vědět, kam patří. Ale to extendováni může být několikanásobné.
Takže můžeš mít {extends someSpecificLayout}, který sám {extends @layout.latte}.

Anebo to nastavit v render metodě (->setLayout()), pak můžeš vybírat i podle nějaké složitější logiky.

Editoval Šaman (8. 2. 2018 13:03)