Dostupná proměnná odkudkoliv

jedlicka
Člen | 70
+
0
-

Ahoj,

měl bych dotaz, zda je možné toto:

Potřeboval bych, aby ve všech presenterech a ve všech šablonách byla dostupná nějaká proměnná, podle které se rozhoduji (třeba nějaké pole). Podobně jako je třeba role, ke které mohu přistupovat odkudkoliv (v šabloně $role=$user->getRoles(), v presenteru $role = $this->user->getRoles()), tak stejně bych chtěl přistupovat k vlastní proměnné, která se při startu nainicializuje (kde?).

Pokud to lze, tak jak?

Díky moc.
Martin

her-ur
Člen | 20
+
+1
-

Ahoj, můžeš si v konfigu zaregistrovat vlastní TemplateFactory a nastavit to v ní:

latte.templateFactory:
    create: Custom\TemplateFactory

Ta vlastní TemplateFactory může dědit od Nette\Bridges\ApplicationLatte\TemplateFactory a v ní můžeš přetížit metodu createTemplate. Lepší by bylo použít kompozici. Tzn. že by ta tvoje vlastní třída dostala v konstrukturu Nette\Bridges\ApplicationLatte\TemplateFactory a tu využila, ale to nevím, jestli je možné udělat a pokud ano, tak by mě to samotného zajímalo :-)

chemix
Nette Core | 1310
+
+1
-

Ahoj,
ja tohle treba pro verzi resim v BasePresenteru. Předka vsech mych dalsich presenteru. Pripadne to lze resit i pres Traitu, kterou pridas ke vsem presenterum. Ukazka jak tam dat snadno promenou verzi, nebo imho lepsi reseni si injectnout nejakou pomocnou servisu, ktera ty data uz bude mit nejak nactene v sobe. Je to takove reseni, ktere uz neni moc doporucovane, ale me zatim funguje :-)

abstract class BasePresenter extends Presenter
{
	/** @var MyConfigurationService @inject */
	public $configuration;

	/* nebo */
	public $version = '1.0.0';


	protected function beforeRender()
	{
		parent::beforeRender();
		$this->template->version = $this->configuration->version;

		// nebo
		$this->template->version = $this->version;
	}
}
Ondřej Kubíček
Člen | 494
+
+1
-

samozřejmě, pokud máš nějakého společného předka pro presentery – BasePresenter, tak můžeš přetížit beforeRender metodu

protected function beforeRender()
{
	parent::beforeRender();
	$this->template->nazevPromenne = 'ahoj';
}

teď budeš mít tu proměnou nazevPromenne dostupnou všude

Martk
Člen | 661
+
+2
-

@her-ur myslím, že šlo, jen musíš vypnout autowiring

latte.templateFactory:
	autowiring: no

a už jen zaregistrovat vlastní službu a předat výchozí službu

templateFactory:
	class: Nette\Application\UI\ITemplateFactory
	create: TemplateFactory(@latte.templateFactory)

Editoval Martk (18. 9. 2018 10:04)