SetupModule – logika presenterů
- ondrusu
- Člen | 118
Zdravím Vás všechny. Chtěl bych se zeptat.
Potřeboval bych (pouze) logicky oddělit nějaké prezetery / templaty od
ostatních
mám složky:
app/presenters ...
app/SetupModule/presenters ...
Zde je Router
class RouterFactory {
/**
* @return Nette\Application\IRouter
*/
public static function createRouter() {
$router = new RouteList;
$router[] = new Route('<presenter>/<action>[/<id>]', 'Homepage:default');
$router[] = new Route('setup/<presenter>/<action>[/<id>]', 'Setup:Homepage:default');
return $router;
}
}
Problém je v tom, že Nette očekává 2 @layout.latte
a já
to chci nasměrovat jen na jeden.
Tady jsem se inspiroval.
Zkoušel jsem to přes include @layout.nette, ale hlásí to:
{layout '../../../presenters/templates/@layout.latte'}
Invalid link: Cannot load presenter 'Setup:Profil', class 'App\SetupModule\Presenters\ProfilPresenter' was not found.
Lze to nějak vyřešit??
Děkuji.
- Hurass
- Člen | 114
Ta chybová hláška, ti ale říká, že nemůže najít presenter.
Pro použití jednoho layoutu do BasePresenteru v modulu Setup přidej:
public function formatLayoutTemplateFiles()
{
$layouts = parent::formatLayoutTemplateFiles();
foreach ($layouts as &$layout) {
$layout = preg_replace("#\/modules\/.*\/presenters#", "/presenters", $layout);
}
return $layouts;
}
Editoval Hurass (14. 2. 2016 19:02)
- ondrusu
- Člen | 118
Pořád chyba:
Invalid link: Cannot load presenter 'Setup:Profil', class 'App\SetupModule\Presenters\ProfilPresenter' was not found.
tohle je v souboru @layout.latte
v SetupModule
v templatech
{layout '../../../presenters/templates/@layout.latte'}
namespace App\SetupModule\Presenters;
use Nette;
class BasePresenter extends Nette\Application\UI\Presenter {
public function beforeRender() {
// parent::beforeRender();
if ($this->getUser()->isLoggedIn()) {
$this->template->login_user = $this->user->identity->entity->email;
// Load Settings
}
}
public function formatLayoutTemplateFiles() {
$layouts = parent::formatLayoutTemplateFiles();
foreach ($layouts as &$layout) {
$layout = preg_replace("#\/modules\/.*\/presenters#", "/presenters", $layout);
}
return $layouts;
}
}
Tady je @layout.latte
v app/presenter/templates
<a href="<?php echo Latte\Runtime\Filters::escapeHtml($_control->link("Profil:user"), ENT_COMPAT) ?>
(tohle už je náhled z Nette vyjímky)
- David Matějka
- Moderator | 6445
tohle nesouvisi s layoutem. kdyz chces odkazovat na presenter, ktery je
v jinem modulu, musis pouzit absolutni odkazovani, jinak se odkaz vytvori
relativne k aktualnimu presenteru/modulu. Ty jsi v Setup:Xyz a vytvaris odkaz
Profil:user
, takze se to snazi vytvorit odkaz pro
Setup:Profil:user
. Pouzij :Profil:user
– ta
dvojtecka na zacatku rika, ze se ma pouzit absolutni odkaz
- ondrusu
- Člen | 118
aha, super, takhle to valí.
Ty absolutní cesty něčemu vadí, například z pohledu bezpečnosti?
Ted mám v setup modulu basepresenter který dědí z base presenteru
v app/presenter
lze v setup base presenteru nastavit načítání layout.latte abych nemusel
mít v setup templates layout v kterém includuji layout z
app/presenters/templates
do setup templatu modulu?
- ondrusu
- Člen | 118
Zkoušel jsem to tam přidat, ale když zavolám setup.users tak to načte
jen bílou stránku a ten @layout.latte
z
app/presenters/templates
to nenajde.
Obrázek adresářové struktury:
https://dl.dropboxusercontent.com/…tructure.jpg
- ondrusu
- Člen | 118
Do BasePresenter jsem dal tuhle funkci (jak jsi psal – jen jsem změnil
return $layouts
na $layout
)
Zkoušel jsem preg_replace s tím module i bez, ale vrací to stále stejnou
chybu – viz níže
public function formatLayoutTemplateFiles() {
$layouts = parent::formatLayoutTemplateFiles();
foreach ($layouts as &$layout) {
$layout = preg_replace("#\/module\/.*\/presenters#", "/presenters", $layout);
}
return $layout;
}
Invalid argument supplied for foreach()
nette\application\src\Application\UI\Presenter.php:480
$layouts vrací
array(4) {
[0] => string(129) "src\trunk\app\SetupModule\presenters/templates/Users/@layout.latte"
[1] => string(129) "src\trunk\app\SetupModule\presenters/templates/Users.@layout.latte"
[2] => string(123) "src\trunk\app\SetupModule\presenters/templates/@layout.latte"
[3] => string(112) "src\trunk\app\SetupModule/templates/@layout.latte"
}
Teďka v SetupModule není @layout.latte
Tohle vrací return $layout
src\trunk\app\SetupModule/templates/@layout.latte
- pata.kusik111
- Člen | 78
ondrusu napsal(a):
Do BasePresenter jsem dal tuhle funkci (jak jsi psal – jen jsem změnil
return $layouts
na$layout
)
Zkoušel jsem preg_replace s tím module i bez, ale vrací to stále stejnou chybu – viz nížepublic function formatLayoutTemplateFiles() { $layouts = parent::formatLayoutTemplateFiles(); foreach ($layouts as &$layout) { $layout = preg_replace("#\/module\/.*\/presenters#", "/presenters", $layout); } return $layout; }
Invalid argument supplied for foreach() nette\application\src\Application\UI\Presenter.php:480
$layouts vrací
array(4) { [0] => string(129) "src\trunk\app\SetupModule\presenters/templates/Users/@layout.latte" [1] => string(129) "src\trunk\app\SetupModule\presenters/templates/Users.@layout.latte" [2] => string(123) "src\trunk\app\SetupModule\presenters/templates/@layout.latte" [3] => string(112) "src\trunk\app\SetupModule/templates/@layout.latte" }
Teďka v SetupModule není @layout.latte
Tohle vrací
return $layout
src\trunk\app\SetupModule/templates/@layout.latte
To je proto, že jsi neměl měnit return $layouts
na
return $layout
. To return $layouts
, tj. v plurálu je
správně.
- ondrusu
- Člen | 118
Vrátil jsem tam zpět $layouts
ten vrací:
"/var/www/html/app/SetupModule/presenters/templates/Users/@layout.latte" string(70)
"/var/www/html/app/SetupModule/presenters/templates/Users.@layout.latte" string(64)
"/var/www/html/app/SetupModule/presenters/templates/@layout.latte" string(53)
"/var/www/html/app/SetupModule/templates/@layout.latte"
Nedá se to nastavit na přímo v $this->setLayout($layout);
v basepresenteru toho modelu layout když víme že layout se bude používat
vždy jen jeden
Editoval ondrusu (15. 2. 2016 9:33)
- David Matějka
- Moderator | 6445
vyprdni se na regulary a z formatLayoutTemplateFiles vrat pole s jednim layoutem s pevnou cestou..
public function formatLayoutTemplateFiles()
{
return [__DIR__ . '/cesta/k/@layout.latte'];
}