Použití konfigurace v Latte

Melebius
Člen | 16
+
+1
-

Zdravím, potřeboval bych poradit, jak dostat do Latte konfigurační parametr, konkrétně kořenovou cestu k aplikaci na webserveru. Parametr je z hlediska aplikace globální, ale liší se mezi instancemi (produkce/dev).

Stávající kód s parametrem v rámci Latte:

{block head}
{var $RootPath = '/klient/projekt/htdocs'}{* varianta dev *}
<link rel="stylesheet" href="{$RootPath}/css/vendor/tablesorter.css">
<script type="text/javascript" src="{$RootPath}/js/vendor/jquery.js"></script>
<script type="text/javascript" src="{$RootPath}/js/vendor/jquery.tablesorter.js"></script>

Ideální by mi přišlo, kdyby se dala hodnota nastavit v config.local.neon a v Latte vyčíst, pokud možno bez toho, abych ji musel ručně přenášet v každém presenteru, kterého se to týká. Na rozdíl od @ZdenekKaras (https://forum.nette.org/…otu-promenne) jsem bohužel nenašel návod, jak načíst hodnotu z Neonu do Latte – DuckDuckGo i Google mi cpou samé PHP. 😄

netteman
Člen | 122
+
+1
-

Nejde použít $basePath?

https://doc.nette.org/…n/presenters#…

Melebius
Člen | 16
+
+1
-

@netteman Díky, to je ono! Na tuhle kapitolku už jsem do dokumentace dlouho nekoukal…

m.brecher
Generous Backer | 735
+
+1
-

Ahoj,

zrovna včera jsem řešil podobný problém – hledal jsem nejjednodušší způsob, jak předat absolutní souborovou cestu do adresáře aplikace ve kterém je např. Bootstrap.php – obvykle to je /app.

Na rozdíl od proměnné $basePath, kterou nette automaticky injektuje do každé latte šablony, připraví nette tuto souborovou cestu do parametru %appDir%, který je k dispozici v konfiguračních souborech.

Přímé předání do nějaké služby/presenteru v konfiguračním souboru zajišťuje sekce decorator. Zkusil jsem nejprve předat %appDir% do šablony přímo:

config/common.neon:

decorator:
	Nette\Bridges\ApplicationLatte\DefaultTemplate:
		setup:
			- add('appDir', %appDir%)

Mělo by to fungovat, ale nefunguje (neznám vnitřní detaily jak šablona interně funguje).

Tak jsem zkusil jít na to přes presenter. Parametr %appDir% jsem v sekci decorator předal do BasePresenteru.

config/common.neon:

decorator:
	App\Presenters\BasePresenter:
		setup:
			- $appDir = %appDir%

V BasePresenteru jsem si definoval public property appDir a injektoval ji do šablony klasickým způsobem:

abstract class BasePresenter extends Presenter
{
    public string $appDir;

    public function beforeRender()
    {
        parent::beforeRender();
        $this->template->appDir = $this->appDir;
	    .......
    }
}

Tohle funguje. Proměnnou $appDir potom v šablonách používám na inkludování podšablon, těch které jsou v jiném modulu a vymýšlet cestu relativně by bylo nepohodlné.