Presenter již nepoužívá appDir
- loov
- Člen | 49
Čau nettysti,
ještě na verzi nette do 3.4.2011 mi aplikačka pěkně fungovala.
S následujícímy verzemi nette, se mi při spuštění oběví Fatal
Error NBadRequestException #404
Page not found. Missing template
‚…\NetBeansProjects\sap\app\presenters\templates\Sap\homePage.latte‘ `
Tato šablona je samozřejmě uložená v adresáři \app\templates\Sap\.
Myslím si že to souvisí s touto změnou
2011–05–04 (5961c86): Nette\Application\UI\Presenter does not use %appDir% and searches for the templates relative to its location. (possible BC break?)
Je pravda, že v presenteru registruji komponentu
$this->addComponent($form,'editFormZadaniMaturitniPrace');
která je ajaxově načítána proto ji zde registruji k jejímu presenteru.
Mohl by mě někdo poradit co v této situaci dělat?
- Patrik Votoček
- Člen | 2221
Nyní je to tak že šablony k presenterům musejí být ve stejné složce jako presentery samotné. Pokud chceš/vyžaduješ jiné chování uprav si metodu formatTemplatesFiles ve svém BasePresenteru.
- loov
- Člen | 49
Tak už mě to zas hezky běhá jako předtím. Upravil jsem fci formatLayoutTemplateFiles, protože se hledala také u presenteru. Nepříjde mi správné vkládat adresář templates do adresáře presenters. Proto jsem rád, že mám zase pěkně všechno jenom v adresáři templates. Ještě jednou díky za radu.
- nanuqcz
- Člen | 822
Patrik Votoček napsal(a):
Nyní je to tak že šablony k presenterům musejí být ve stejné složce jako presentery samotné.
Je k tomu někde tady na fóru diskuze? Tohle je podle mě dost razantní změna, tak by mě zajímalo, co k tomu Davida vedlo… Díky
Editoval xxxObiWan (7. 5. 2011 18:49)
- David Grudl
- Nette Core | 8228
To bude jen nějaký bug, nic by se měnit nemělo. Kde přesně máš umístěný presenter?
- Patrik Votoček
- Člen | 2221
jj ona inkriminovaná metoda je totiž celkem neohebná:
/**
* Formats view template file names.
* @return array
*/
public function formatTemplateFiles()
{
$name = $this->getName();
$presenter = substr($name, strrpos(':' . $name, ':'));
$dir = dirname(dirname($this->getReflection()->getFileName())); // tohle je problematicky radek
return array(
"$dir/templates/$presenter/$this->view.latte",
"$dir/templates/$presenter.$this->view.latte",
"$dir/templates/$presenter/$this->view.phtml",
"$dir/templates/$presenter.$this->view.phtml",
);
}
- Patrik Votoček
- Člen | 2221
Martin napsal(a):
Dle mého ona inkriminovaná metoda v nejnovější dev verzi Nette (je tam bez toho problematického řádku a je volaná s parametry
$this->presenter
a$this->view
) umožňuje i tuto adresářovou strukturu:
a
Patrik Votoček: Prohledal jsem všechny verze Nette, které mám na disku (určitě jich tam mám méně než ostatní tady, ale stáhl jsem si pro jistotu vše, co je zde k dispozici v sekci download), a ten problematický řádek jsem nenašel. Bylo to někdy v distribuci, nebo jen na gitHubu?
Nevím jestli tomu rozumím ale: https://github.com/…resenter.php#L493 a https://api.nette.org/…ter.php.html#493 dokonce jsem na ni odkazoval v mém prvním postu v tomto vláknu.
Problém je v tom co způsobilo odstranění APP_DIR
závislosti. Nyní se totiž generují cesty takto:
/app/presenters/FooModule/BarPresenter.php // FooModule\BarPresenter::renderDefault()
------------------------------------------
/app/presenters/templates/Bar/default.latte
/app/presenters/templates/Bar.default.latte
nebo
/app/presenters/BarPresenter.php // BarPresenter::renderDefault()
------------------------------------------
/app/templates/Bar/default.latte
/app/templates/Bar.default.latte
- Martin
- Člen | 171
OK, souhlas. Ale předpokládám, že k všeobecnému použití jsou verze zde. Možná se mi to tahá z bůhvíjaké cache, ale ať kliknu v sekci https://nette.org/cs/packages kamkoli, všude se mi stáhne verze s mnou uvedeným kódem. I proto možná tady všichni udiveně přijali Tvoji poznámku o stejném adresáři (ano, v tom kódu to tak platí). Ale divil se i David.
Edit: „Problém je v tom …“ ano, chápu, ale který kód formatTemplateFiles tedy platí? Ten v distribuci , nebo ten v dokumentaci?
Editoval Martin (8. 5. 2011 21:28)
- Patrik Votoček
- Člen | 2221
Tady: https://nette.org/cs/packages#…
Asi ti uniká že se tu nebavíme o tom že to nefunguje ve Stable / Alpha verzi. (Které jsou staršího data). Ale o DEV verzi.
A hlavně nejde o to co je k všeobecnému použití určeno a co ne. Ale o to že v HEAD masteru se tento BUG stále vyskytue (tj. nebyl opraven). A to je fakt. Tohle je jednoduše diskuse o tom že bug existuje (resp. jeho odhalení).
- Martin
- Člen | 171
Máš pravdu, teď tam je. Ale stahoval jsem cca před třemi dny, a nebyl tam (byla tam dev verze z 28. 4. 2011, mám ji na disku, je v ní toto datum uvedeno). Možná před čtyřmi dny, ale určitě nejvýše před týdnem. Tak pardon, v prvním postu totiž bylo, že to nefunguje už měsíc. Je možné, že se tam na čas objevila verze se starším řešením (a s appDir), zrovna když jsem si ji stahoval a během posledních pár dnů opět s řešením bez appDir.
Editoval Martin (8. 5. 2011 21:46)
- Patrik Votoček
- Člen | 2221
V prvním postu je to napsáno špatně (blbě se to z toho chápe) :)
Ad DEV link (push do masteru neznamená automaticky build – aktualizovaný balík na download page).
Navíc loov si mohl Nette klidně stáhnout z gitu. Zkrátka stable / alpha a vubec zdoj „baliku“ není vůbec podstatný. (pokud se problému v tomto vláknu týká)
Takže abych to ve výsledku shrnul tak nejdřív rozeberu onu „chybnou“ implementaci:
$presenter = substr($name, strrpos(':' . $name, ':'));
Získáni názvu presenteru bez modulu:
Foo:Bar:Baz -> Baz
Foo:Bar -> Bar
Foo -> Foo
$dir = dirname(dirname($this->getReflection()->getFileName()));
$this->getReflection()->getFileName()
získává cestu
aktuálního presenteru
(/app/presenters/FooModule/BarPresenter.php
). První dirname se
dostane složku ve které je onen presenter
(/app/presenters/FooModule
) a další se dostane ještě
o úroveň výše (/app/presenters
).
V případě presenteru v /app/presenters/BarPresenter.php
to bude
tedy (/app
).
- Martin
- Člen | 171
OK. Dík za vysvětlení. Příště až se budu o něco pokoušet, budu moudřejší a budu vědět, kde hledat opravdu aktuální verzi. Fakt jsem myslel, že chyby a diskuse o vývojových verzích jsou jinde, asi si budu muset znovu pročíst pokyny.
Edit: tady bylo pár řádků pitomostí, nechal jsem se ovlivnit
… ten konec už byl správně:
Asi není problém implementace, ale ujednotit si, jak se to vlastně
má chovat. Aby to bylo nezávislé a přitom zpětně
kompatibilní?
Editoval Martin (9. 5. 2011 2:09)
- Jur4
- Člen | 51
Četl jsem to dvakrát a pořád nechápu co se tady ještě řeší za problém. Pokud mám adresářouvou struktůru správně, tak všechno funguje tak jak má (včera jsem updatoval Nette na aktuální (dev) verzi naprosto bez problémů).
Když mám něco z tohodle tak to funguje ok:
/app/presenters/WhateverPresenter.php
/app/templates/Whatever/default.latte
/app/templates/Whatever.default.latte
s modulama:
/app/FrontModule/presenters/WhateverPresenter.php
/app/FrontModule/templates/Whatever/default.latte
/app/FrontModule/templates/Whatever.default.latte
Editoval Jur4 (8. 5. 2011 23:23)
- David Grudl
- Nette Core | 8228
Tak vůbec nechápu co vo go :-) Prostě v „dev“ verzi se šablona bere z
../templates/
relativně vůči umístění třídy presenteru. Nic
víc, žádný bug nikde není.
- Patrik Votoček
- Člen | 2221
Problém je v tom že neznám nikoho kdo by používal (slyším o tom dneska poprvé!):
/app/FrontModule/presenters/WhateverPresenter.php
spíš lidé používají:
/app/presenters/FrontModule/WhateverPresenter.php
Vydíte ten rozdíl?
Edit: ještě znám lidi co používají
/app/FrontModule/WhateverPresenter.php
Ale o první variantě slyším fakt poprvé
Edit2: Problém je v tom že původní (stará) implementaci byla s touto strukturou funkční.
- Tharos
- Člen | 1030
Patrik: Vidíš, já používám odjakživa první variantu (přijde mi jednoznačně nejpřehlednější) a okoukal jsem ji, světe div se, přímo z examples v distribuci :). I z tohoto důvodu mám pocit, že právě tuto adresářovou strukturu používá většina lidí.
Editoval Tharos (8. 5. 2011 23:42)
- Patrik Votoček
- Člen | 2221
Já to chápu. (Sám používám něco úplně jiného protože řeším „přetěžování“ modulárních šablon) ale vím že lidé používají to co jsem napsal. A jelikož jsem examples viděl celkem dávno (už to pár let bude :-D) tak mě to nenapadlo.
Alespoň teď vím že jim mám říkat „Používáte to špatně“ :-)
- JakubJarabica
- Gold Partner | 184
Patrik Votoček napsal(a):
Problém je v tom že neznám nikoho kdo by používal (slyším o tom dneska poprvé!):
/app/FrontModule/presenters/WhateverPresenter.php
spíš lidé používají:
/app/presenters/FrontModule/WhateverPresenter.php
Vydíte ten rozdíl?
Edit: ještě znám lidi co používají
/app/FrontModule/WhateverPresenter.php
Ale o první variantě slyším fakt poprvé
Edit2: Problém je v tom že původní (stará) implementaci byla s touto strukturou funkční.
Prvu variantu som sa nejakym sposobom kedysi davno naucil pouzivat a pouzivam ju vsade doteraz :-)
- Patrik Votoček
- Člen | 2221
Dobrý kluci stačí. Je vidět že používáte to co používat máte. Nemusíte to sem všichni psát. Pochopil jsem to hned potom co to sem napsali první dva lidi. Jen jsem chtěl poukázat na to že ne všichni jsou na tom stejně (třeba já :-D )
- Martin
- Člen | 171
Edit: Zase všechno špatně , už sem snad radši psát nebudu. Nemažu to jen proto, aby post pode mnou měl na co odpovídat:
Hele, teď mne umlčte, pokud se budu ptát na pitomosti a zdržovat od rozumné diskuse – pokud by se časem plánovalo třeba cosi jako:
\FrontModule\…
\AdminModule\SubmoduleEditing\…
\AdminModule\SubmoduleSupervision\… ,
tak měl vlastně Patrik pravdu. Jen teď přemýšlím, jestli by to mělo nějaký jiný význam než teoretický. V současné době mi přijde už i tak trochu „přenamespacováno“, když se jednotlivé prostory používají spíše pro logické členění, než kvůli jmenným konfliktům.
Editoval Martin (9. 5. 2011 3:10)
- Patrik Votoček
- Člen | 2221
Frontend:Foo
\FrontModule\presenters\FooPresenter.php
\FrontModule\templates\...
Admin:Editing:Foo
\AdminModule\EditingModule\presenters\FooPresenter.php
\AdminModule\EditingModule\templates\...
Admin:Supervision:Foo
\AdminModule\SupervisionModule\presenters\FooPresenter.php
\AdminModule\SupervisionModule\templates\...
Je funkční už teď