Přidaní registrace makra přes neon

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

Ahoj, nevíte zda jde nějak zaregistrovat makro přes config.neon, mám vlastní třídu na makro, která dědí z extends \Nette\Latte\Macros\MacroSet pak mám
v configu továrnu

	factories:
		myMacro:
			factory: Zool\Macro\MyMacro::install(%compiler%)
			parameters: [compiler]

Díky

zool
Člen | 144
+
0
-

Super děkuji, tak jsem to upravil na

latte:
	macros:
		- Zool\Macro\MyMacro::install

A pořád mi to píše neznáme makro

Filip Procházka
Moderator | 4668
+
0
-

Protože určitě nepoužíváš vývojovou verzi. Vždyť jsem přece psal, že je to na vývojovou verzi ;)

Ve stable se to musí zatím dělat takto krkolomně.

services:
	nette.latte:
		setup:
			- 'Zool\Macro\MyMacro::install(?->compiler)'(@self)
zool
Člen | 144
+
0
-

Máš pravdu nepoužívám. Když to dám do apostrofů, tak to bere jako php kód že? Ale proč je tam na konci to self? Jo a ještě jeden dotaz ta pomlčka funguje jako metoda že ve třídě (v jaké třídě? Compiler?)? A když se tam neuvede tak je to constrokt? Nebo jak by se to dalo pochopit??
Děkuji

Editoval zool (10. 12. 2012 18:33)

enumag
Člen | 2118
+
0
-

Jestli to dobře chápu tak to @self je odkaz na nette.latte, což by měl být objekt Nette\Latte\Engine. Ten zápis pak dá ten parametr @self místo otazníku takže se zavolá tohle:

Zool\Macro\MyMacro::install($latteEngine->compiler);
zool
Člen | 144
+
0
-

Super díky, ale nemělo by tam být spíše getCompler ?? Bo proměnná compiler je typu private a tak se k ni nedostane… No zkusím to a uvidím…

jiri.pudil
Nette Blogger | 1032
+
0
-

a tak se k ni nedostane…

Ale dostane, bo Nette\Object

Editoval jiri.pudil (10. 12. 2012 19:40)

enumag
Člen | 2118
+
0
-

Je fakt, že getCompiler() asi bude zanedbatelně rychlejší. :-D

Filip Procházka
Moderator | 4668
+
0
-

Rozebereme si

services:
    nette.latte:
        setup:
            - 'Zool\Macro\MyMacro::install(?->compiler)'(@self)
  • Uvozovky jsou tam proto, aby to bral v celku a nerozděloval podle kontrolních znaků.
  • Závorky vytváří instanci NeonEntity, která dostane jako $value to co je před závorkami a do $attributes dostane naparsované co je v závorkách (klidně i složité struktury)
  • Otazník v NeonEntity::$value znamená, že se má obsah zpracovávat jako PHP kód.
  • Každý jeden otazník znamená parametr, který se má místo něj doplnit.
  • @self je refence na sebe sama.

Takže místo otazníku se doplní služba. Výsledný kód bude vypadat takto

// $service je lokální proměnná, ve které je instance právě vytvářené služby.
Zool\Macro\MyMacro::install($service->compiler);

Můžete si to zkusit i nechat naparsovat online.

barbucha
Člen | 11
+
0
-

Ahoj, pokouším se podle výše popsaného postupu zaregistrovat makra z Nextras\Forms

Do configu jsem tedy napsal

services:
	nette.latte:
		setup:
			- 'Nextras\Forms\Latte\Macros::install(?->compiler)'(@self)

no a stale mi to generuje chybu

Nette\DI\ServiceCreationException

It is not allowed to use service and factory with the same name ‚nette.latte‘

Prosim, kde delam chybu?
Dik.

Editoval barbucha (30. 1. 2013 12:03)

enumag
Člen | 2118
+
0
-

Nemělo by místo services být factories? Myslím, že HosipLan tam má chybku.

barbucha
Člen | 11
+
0
-

Ano, pokud se to da do sekce factories, funguje. Dik