Nette 2.1 dev ako ziskat Nette\Latte\Engine?

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

Caute mam nejaky BaseForm a v nom si registrujem:

public function templatePrepareFilters($template)
{
	/** @var Nette\Latte\Engine $latte */
	$latte = $this->getPresenter()->getContext()->createService('nette.latte');
	\Kdyby\BootstrapFormRenderer\Latte\FormMacros::install($latte->getCompiler());
	$template->registerFilter($latte);
}

Samozrejme getContext() je FUJ :-), takze som uvazoval ako to riesit, tak som sa rozhodol ze si Engine injectnem z DIC ked uz mame to DIC :-)

* INJECT Engine
* @param Engine $engine
*/
public function injectEngine(Engine $engine)
{
	$this->engine = $engine;
}

ale co na mna ladenka zahucala: No service of type Nette\Latte\Engine found tak som sa pozrel do DIC tak tam Engine je nette.latte::Nette\Latte\Engine

samozrejme som sa pozrel aj tu a hele co som nasiel, tak je getContext() deprecated alebo nie?

Šaman
Člen | 2640
+
0
-

Form nemá šablonu, ale renderer. Šablonu můžeš vytvářet v tom rendereru (pokud ho píšeš), ale lepší řešení je místo BaseFormu se šablonou používat komponentu, která ten formulář obaluje.

BaseForm používej jen na věci týkající se samotných formulářů (třeba registrace nějakých nových inputů), i když i toto se dá řešit jinak.

Filip Procházka
Moderator | 4668
+
0
-

Na tu metodu vůbec nepotřebuješ sahat, makra jdou registrovat v configu a BootstrapFormRenderer je i správně v configu registruje, takže tu metodu smaž. Musí to fungovat samo.

Formulář nemá šablony, raději si ho obal do komponenty

duskohu
Člen | 778
+
0
-

BaseForm pouzivam preto, lebo skoro vsetky moje formulare nesluzia len ako formulare, ale maju aj dalsiu funkcionalitu, napr. dalsie tlacitka, alebo zobrazovacie prvky, a skoro kazdy formular vyzera inak, takze ho nakoniec renderujem manualne, preto pouzivam baseForm. Napr:
mam BaseFormControl zaregistrujem co treba a pomocou nejakej service najdem vhodnu sablonu. Nasledne potom si podedim nejaky formControl a vnom mam form a o ostatne sa nestaram, uz len vsablone urcim vzhlad formulara, a dalsich prvkov.

Filip Procházka
Moderator | 4668
+
0
-

A ten článek co jsem odkazoval jsi čelt?

duskohu
Člen | 778
+
0
-

Spravu som stihol skor odoslat, tak si to idem pozriet, dakujem.

duskohu
Člen | 778
+
0
-

Oki skusil som to podla tohoto kde som si urobil tovarnicku.

protected function createComponentForm(){
	$form = new Form;
	$form->setRenderer(new BootstrapRenderer());
	.....
	return $form;
}

v bootstrap.php som zaregistroval:

Kdyby\BootstrapFormRenderer\DI\RendererExtension::register($configurator);

napriek tomu mi ladenka nadava:

Unknown macro {pair} in ....

to macro pouzivam pri manualnom zobrazovani prvku. Tak co robim zle, ked teda nemusim registrovat Latte\FormMacros?

Šaman
Člen | 2640
+
0
-

{pair} není žádné latte makro, použij

{form fooBarForm}
  {label fooInput /} {input fooInput} <br>
  {label barInput}popis{/label} {input barInput}
{/form}

Editoval Šaman (26. 11. 2013 18:56)

Šaman
Člen | 2640
+
0
-

enumag napsal(a):

@Šaman: https://github.com/…rmMacros.php#L66

Sorry, nedošlo mi, že se bavíme celou dobu o Kdyby rendereru.

@duskohu: Tak s tímhle ti neporadím, BootstrapFormRenderer nepoužívám (i když ho mám v plánu vyzkoušet), zatím ti mohu jen ukázat, jak bych to dělal v čistém Nette.
Formulář v komponentě vytvářené generovanou továrničkou, kterou injectujeme do Presenteru pomocí property injection. (To injectování by bylo možná lepší řešit inject metodou, nebo traitou, ale tohle je nejkratší možný zápis.)

Editoval Šaman (26. 11. 2013 19:35)

Filip Procházka
Moderator | 4668
+
0
-

Musí to fungovat :)

  • nainstaluješ přes composer
  • zaregistruješ extension
Kdyby\BootstrapFormRenderer\DI\RendererExtension::register($configurator);
  • zaregistruješ renderer
$form->setRenderer(new BootstrapRenderer());
  • smažeš cache
  • profit
Jan Suchánek
Člen | 404
+
0
-

Filip Procházka: Tohle bude je a bude podporovaná cesta registrace extension?

extensions:
	bootstrapFormRenderer: Kdyby\BootstrapFormRenderer\DI\RendererExtension

Je lepší registrovat v bootstrapu nebo v neonu?

enumag
Člen | 2118
+
0
-

@jenicek: Je to samozřejmě lepší v neonu, to ale funguje až v Nette 2.1. (Nebo pokud se do 2.0 přidá jedno extension postaru tak další už jdou takhle.)

Editoval enumag (26. 11. 2013 23:27)

duskohu
Člen | 778
+
0
-

@Šaman presne takto to robim, ale mam este BaseFormControl ktory dedi od Control, nie je to BaseFrorm, ucelom je nastavyt sablonu pre Control, a samozrejme pre toto:

$template->_form = $template->form = $this['form']

@Filip Procházka asi som velmi nepochopil instalaciu, postupoval som tak ze som zaregistroval do bootstrap:

Kdyby\BootstrapFormRenderer\DI\RendererExtension::register($configurator);

a formularu som dal render:

$form->setRenderer(new BootstrapRenderer);

ale ked som v control vytvaral formular tak macra mi nesli az ked som zaregistroval toto

public function templatePrepareFilters($template)
{
    /** @var Nette\Latte\Engine $latte */
    $latte = $this->getPresenter()->getContext()->createService('nette.latte');
    \Kdyby\BootstrapFormRenderer\Latte\FormMacros::install($latte->getCompiler());
    $template->registerFilter($latte);
}

nikde som sa nedocital ze treba v neone zaregistrovat extension:

bootstrapFormRenderer: Kdyby\BootstrapFormRenderer\DI\RendererExtension

teraz uz mam zaregistrivane len extension ostatne som vynechal a ide perfektne :-)