Vylepšení LatteMacros (s příkladem a možným řešením)

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

Ahoj,

už několik dní se snažím o vytvoření vlastních link a plink maker, protože potřebuju svou určitou funkcionalitu. Naneštěstí neustále narážím na nějaké překážky.

Mým hlavním cílem je zachovat co největší kompatibilitu všech Nette feature s co možná nejmenšími zásahy do původních Nette zdrojových kódů.

Naneštěstí se mi zatím tohodle nepodařilo dosáhnout.

Ukážu můj problém:

Takto mám svoje makro v html:

{nplink "Admin:Default:default", array('id' => '1', 'part' => '2')}

A php:

class MyMacros extends Nette\Object
{

	public static function registerMacros()
	{
		LatteMacros::$defaultMacros["nplink"] = "<?php echo %:escape%(%MyMacros::macroNplink%) ?>";
	}

	public static function macroNplink ($content, $modifiers)
	{
		... moje zpracovani ...
		//všimněte si (parent:: | $this->), vysvětleno níže
		return (parent:: | $this->)formatModifiers('$presenter->link(' . (parent:: | $this->)formatLink($mycontent) .')', $modifiers);
	}
}

Hlavním problémem je volání pomocných metod (format*) LatteMacros, které formátuji link. Jak jsem hledal zde na fóru, tak všechny příklady, co jsem našel na vlastní makra jsou postavené na statických metodách. Já zkoušel postupně tyto řešení:

1, Vytvořit si vlastní třídu MyMacros děděnou z LatteMacros. Poté si v BasePresenteru registrovat LatteFilter, kterému se nastaví handler metodou setHandler na moji MyMacros.
Problém: formatLink je private a tím pádem nedosažitelná z potomka.

2, Vytvořit si vlastní třídu MyMacros, která by si vytvářela instanci LatteMacros, z které by se použily pomocné metody.
Problém: Opět formatLink je nedosažitelný.

3, Vytvořit si vlastní třídu MyMacros a okopírovat si do ní potřebné metody LatteMacros.
Problém: Naneštěstí to celkem kaskádovitě tahá další metody a musel bych okopírovat celkem velkou část LatteMacros. Tomu se chci vyhnout, abych nemusel při každém upgradu kontrolovat změny a přenášet je do mé třídy.

(zkoušel jsem toho více, ale tohle jsou hlavní 3)

Jak vidíte, tak hlavní problém je na přístupovém modifikátoru metody formatLink, která brání veškerým snahám. Snažím se vyhnout vložení vlastního kódu do LatteMacros ze stejného důvodu, jako je popsán v bodě 3.

Řešení Jako možné řešení bych viděl změnu přístupových modifikátoru na public nebo alespoň na protected u všech pomocných formátovacích funkcí. Tím by šel použít postup v bodě 1 a myslím, že by to neovlivnilo žádnou funkčnost FW a jen by to pomohlo (pokud ovšem není za private nějaký vyšší smysl, která nevidím).

Každopádně by to chtělo vymyslet nějaký pěkný systém na přidávání maker a zpřístupnit někde pomocné metody.

Co myslíte?

Aurielle
Člen | 1281
+
0
-

Jak se liší nplink a plink?

Filip Procházka
Moderator | 4668
+
0
-

Vylepšení podpory pro vlastní makra je v plánu https://doc.nette.org/…ibuting/code kdy se ho dočkáme je ale ve hvězdách :)

Zvolil bych asi cestu nejmenšího zla

protected function createTemplate()
{
	$template = parent::createTemplate();
	$template->nplink = new MySuperClassForLinks($this); // yes! můžeš jí přidat i aktuální presenter

	return $template;
}

samozřejmě to slepě věří tomu, že ti proměnnou žádný script nepřepíše.

{$nplink->link("Admin:Default:default", array('id' => '1', 'part' => '2'))}

Odkazy se obecně ohýbají v nette velice nepříjemně, už se těším až se s tím budu prát já :)

Dj_Oggy
Člen | 67
+
0
-

2 gmvasek: Tak, ze zadana ukazka je ciste ukazka, vysledny format mam trochu jiny a hlavne delam tam urcite operace nad databazi.

2 HosipLan: To, ze se to ma menit sem slysel, ale spis mi jde o nejaky rychly nightly fix, jestli by nesel udelat treba jen tim prepsanim accessu z private na public|protected.

Ale jinak zajimavy priklad a pripadna alternativa. To se vklada do presenteru?

Filip Procházka
Moderator | 4668
+
0
-

tuto metodu má presenter i control

Dj_Oggy
Člen | 67
+
0
-

Uvidime, zkusim to s tim nahrazenim tech modifikatoru a uvidime, jestlit o bude fungovat. Kdyztak by to mohl DG aplikovat na nightly, pokud by to uznal za vhodne.