Presenter již nepoužívá appDir

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

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

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

Díky moc, urcite si to upravim… :)

loov
Člen | 49
+
0
-

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

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

To bude jen nějaký bug, nic by se měnit nemělo. Kde přesně máš umístěný presenter?

loov
Člen | 49
+
0
-

David Grudl napsal(a):

To bude jen nějaký bug, nic by se měnit nemělo. Kde přesně máš umístěný presenter?

Presenter SapPresenter je fyzicky uložený v app/presenters/Sap/SapPresenter.php. Snad jsem odpověděl správně na tvou otázku.

Jur4
Člen | 51
+
0
-

Myslím, že máš jen špatně umístěný presenter. Zkus to takhle a nebudeš muset měnit standartní chování.

/app/presenters/SapPresenter.php
/app/templates/Sap/homepage.latte

Editoval Jur4 (8. 5. 2011 17:11)

loov
Člen | 49
+
0
-

Jur4 napsal(a):

Myslím, že máš jen špatně umístěný presenter. Zkus to takhle a nebudeš muset měnit standartní chování.

/app/presenters/SapPresenter.php
/app/templates/Sap/homepage.latte

Jj takhle to funguje. Díky

Patrik Votoček
Člen | 2221
+
0
-

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",
	);
}
Martin
Člen | 171
+
0
-

Smazáno – neaktuální.

Editoval Martin (8. 5. 2011 21:39)

Patrik Votoček
Člen | 2221
+
0
-

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

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

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

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

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

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

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

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

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

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)

22
Člen | 1478
+
0
-

+1 Tharos, btw je to i v examples → modul usage
edit: jo, to tam máš taky :-)

Editoval 22 (8. 5. 2011 23:42)

Patrik Votoček
Člen | 2221
+
0
-

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ě“ :-)

Jur4
Člen | 51
+
0
-

Tak, tak. Já tuhle struktůru používám od doby co jsem poprvé použil moduly :) a pravděpodobně jsem jí taky odkoukal z examples (už si nevzpomínám). Každopádně mi přijde logické, mít presentery i šablony modulu v jedné složce.

JakubJarabica
Gold Partner | 184
+
0
-

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

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

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

Martin
Člen | 171
+
0
-

Jasně, došlo mi to vlastně přesně ve chvíli, kdy jsi odpověděl. Dvakrát dirname způsobí jen přechod o dva adresáře výš a co je nad tím, se kopíruje. Dobrou noc, asi se musím radši vyspat. Takhle to dopadá, když se snažím Nette studovat po nocích místo spánku …