Presenter – cesty
- fenix
- Člen | 16
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
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.
- fenix
- Člen | 16
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
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
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