Presenter – cesty

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

Zdravim,
narazil jsem na maly problem:
Jak zmenit adresar, ze ktereho se nacitaji presentery.
Na foru jsem nasel nastaveni pres config.ini: variable.presentersDir = „cesta“.
Bohuzel to nefunguje. Hledal jsem ve zdrojacich a nasel jsem, ze cesta k presenterum se tvori automaticky z ‚appDir‘.
To mi ale nevyhovuje, chtel bych tu cestu zmenit. Navic bych ji chtel zmenit tak, aby PresenterLoader hledal ve vice cestach. Duvod je jednoduchy, mam aplikaci a jeji velka cast se opakuje v jejich jednotlivych instanci. Meni se jen jedna cast, tudiz bych chtel napr AdminModule nacitat z uplne jineho adresare nez FrontModule. Existuje nejake reseni, aniz bych si musel napsat vlastni presenter loader? Navic i kdybych si ho napsal, tak co jsem se dival, musel bych zasahnout do tridy Application, nebot ta vraci presenter loader natvrdo s nadefinovanou cestou ‚appDir‘.

Dale bych mel dotaz ohledne nacitani config. Na foru jsem nasel reseni prepsanim loaderu pro config, ale tohle by dle me melo umet nete samo. Chci nacist ruzne konfiguracni soubory, ale bohuzel aktivni zustane jen ten posledni. Idealni by bylo mit moznost volad Environment::loadConfig(‚config.ini‘, ‚config2.ini‘); nebo klidne dalsimi metadami ->loadConfig(‚config2.ini‘, true) // ->loadConfig($file, $append).

verze nette: 0.9.3

Majkl578
Moderator | 1364
+
0
-

Napsat si vlastní PresenterLoader, resp. podědit současný a přepsat si metodu PresenterLoader::formatPresenterFile(). Jako službu Nette-Application-IPresenterLoader si nastavíš svůj.

David Grudl
Nette Core | 8227
+
0
-

Není jednodušší pro načítání presenterů prostě použít RobotLoader?

Majkl578
Moderator | 1364
+
0
-

David Grudl napsal(a):

Není jednodušší pro načítání presenterů prostě použít RobotLoader?

Rozhodně.

fenix
Člen | 16
+
0
-

David Grudl napsal(a):

Není jednodušší pro načítání presenterů prostě použít RobotLoader?

To by bylo urcite super, ale bohuzel nevim jak. Logicky by RobotLoader mel znat vsechny tridy (popripade je najit). Bohuzel nacitani presenteru se RobotLoaderem zrejme neridi.

Nette\Application\Application radek 130: <?php $this->getPresenterLoader()->getPresenterClass($presenter); ?>
Jeste nejsem v Nette tolik zbehly a zatim jsem se blize neseznamoval ze ServiceLocator, ale predpokladam, ze uvedeny radek mi zavola: <?php Application::createPresenterLoader()->getPresenterClass($presenter); ?>.
V createPresenterLoader() se nachazi: <?php return new PresenterLoader(Environment::getVariable(‚appDir‘)); ?>
Pri zbeznem prozkoumani PresenterLoader se hledaji presentery v APP_DIR (neboli v adresari, ktery je predan PresenterLoader).

Abych upresnil, co vlastne potrebuji, podivejte se na adresarovou strukturu.

/core
/core/AdminModule
/core/bootstrap.php
/core/config.ini
/core/presenters
/core/presenters/BasePresenter.php

/libs
/libs/Nette

/virtual_host1
/virtual_host1/app
/virtual_host1/document_root
/virtual_host1/app/config.ini
/virtual_host1/app/FrontModule
/virtual_host1/document_root/index.php

/virtual_host2
/virtual_host2/app
/virtual_host2/document_root
/virtual_host2/app/config.ini
/virtual_host2/app/FrontModule
/virtual_host2/document_root/index.php

RobotLoader samozrejme prochazi jak /app, tak /core (mam nastavene). Pokud by teda presentery nacital RobotLoader, nemelo by presunuti adresare /app/AdminModule do adresare /core/AdminModule nicemu vadit a nemela by se mi pak zobrazit hlaska: BadRequestException #404, Cannot load presenter 'Admin:Default', class 'Admin_DefaultPresenter' was not found in '/document_root/../app/AdminModule/presenters/DefaultPresenter.php' :-).

Cesta tudiz vede pres zmenu loaderu, jak napsal Majkl578.
Toto jsem zatim nedelal a na reseni jeste nenarazil…ani jsem ho nehledal. Ale predpokladam, ze predefinovani services bude nasledujicim zpusobem:

<?php $application->defaultServices[‚Nette\Application\IPresenterLoader‘] = array(‚MojeTrida‘, ‚createPresenterLoader‘); ?> s tim ze MojeTrida::createPresenterLoader bude vracet muj Presenterloader

Ale asi to pujde udelat nejak elegantneji, zkusim pohledat ohledne services a jejich zmen. Asi to pujde nejak podobne jako s RobotLoaderem v config.ini. Urcite by bodl nejaky tutorialek a priklady pouziti a hlavne jake vsechny services v nette existuji a jak je predefinovat. Pokud neco takoveho je, dekuji za odkaz.

fenix
Člen | 16
+
0
-

Tak mam k tomu asi dalsi dotaz.
Po hledani o services jsem narazil na Davidovo upozorneni, ze v config.ini musi byt radek s:
service.Nette-Loaders-RobotLoader.factory = Nette\Configurator::createRobotLoader.
Ten jsem tam puvodne nemel. Mel jsem pouze

service.Nette-Loaders-RobotLoader.option.directory[] = "%appDir%"
service.Nette-Loaders-RobotLoader.option.directory[] = "%libsDir%"
service.Nette-Loaders-RobotLoader.option.directory[] = "%coreDir%"
service.Nette-Loaders-RobotLoader.run = TRUE

Chovani se zkutecne zmenilo, vypada to, ze uz nacetl z core/AdminModule/DefaultPresenter, ovsem ted to hlasi, ze nemuze najit sablonu: Page not found. Missing template '…/AdminModule/templates/Default/default.phtml'., ktera tam samozrejme je. Zkusil jsem ji prevest i na obvykly tvar Presenter/action.phtml namisto Presenter.action.phtml, ovsem vysledek stejny :-(. Bohuzel, tam je zkutecne …/AminModule/... takze nevidim v jakem adresari vlastne hleda, ale predpokladam ze ne v core

fenix
Člen | 16
+
0
-

Zdravim,
debugnul jsem si cesty, ktere se hledaji pro sablonu:

/app/AdminModule/templates/Default/default.phtml

/app/AdminModule/templates/Default.default.phtml

/app/AdminModule/templates/@global.default.phtml

Admin module je ale umisten v /core/AdminModule/....

Je potreba nastavit neco jineho, aby se cesty hledaly spravne?
Dekuji za odpoved

Panda
Člen | 569
+
0
-

Při použití vlastního rozmístění šablon musíš překrýt v BasePresenteru (nebo jiném předkovi presenterů) metody Presenter::formatTemplateFiles a formatLayoutTemplateFiles.