SetupModule – logika presenterů

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

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

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

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

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

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?

Hurass
Člen | 114
+
0
-

Ano, viz můj příspěvěk.

ondrusu
Člen | 118
+
0
-

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

Hurass
Člen | 114
+
0
-

Stačí upravit regulár podle své struktury

public function formatLayoutTemplateFiles()
{
    $layouts = parent::formatLayoutTemplateFiles();

    foreach ($layouts as &$layout) {
        $layout = preg_replace("#.*\/presenters#", "/presenters", $layout);
    }

    return $layouts;
}
ondrusu
Člen | 118
+
-1
-

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

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íž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

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

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

vyprdni se na regulary a z formatLayoutTemplateFiles vrat pole s jednim layoutem s pevnou cestou..

	public function formatLayoutTemplateFiles()
	{
		return [__DIR__ . '/cesta/k/@layout.latte'];
	}
ondrusu
Člen | 118
+
0
-

funguje, díky za váš čas. Nastavil jsem to takto:

return [__DIR__ . '/../../presenters/templates/@layout.latte'];

Ještě jednou moc díky za pomoc.