Formulář jako komponenta s interfacem a parametry

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

Dobrý den,

prosim vás, jak zápíšu do configu následující následující komponentu?

class MyForm extends Control
{
	private $id;

	public function construct($id)
	{
		$this->id = $id;
	}

	public function render()
	{
		...
	}

	public function createComponentMyForm()
	{
		$form = new UI/Form();
		...
		return $form;
	}

}

interface IMyFormFactory
{
	/** @return MyForm */
	public function create($id);
}

Nevím jak to zapsat do configu abych mohl komponentu injectnout. Poradíte někdo?

David Matějka
Moderator | 6445
+
+1
-
-
	implement: IMyFormFactory
	parameters: [id] #tady definujes parametry v tovarnicce
	arguments: [%id%] #a tady kam se maji predat konstruktoru

pozn 1) kdyz registraci provadis v compiler extension, neni nutne uvadet parameters, ty se zjisti automaticky
pozn 2) v dev verzi (budouci 2.3) nebude nutne ani uvadet arguments, sparuji se dle nazvu

Editoval matej21 (14. 10. 2014 23:16)

JDC
Člen | 19
+
-1
-

Tu interface si zaregistruj v konfigu jako službu a tu si pak injectni do presenteru. Pak stačí jen vytvořit metodu createComponentMyForm a v ní volat metodu create tvé továrničky. Nezapomeň na return u createComponent metody. Funkce musí vracet komponentu.. Pro představu nejednoduššeji:

/** @var IMyFormFactory @inject */
public $myFormFactory;

protected function createComponentMyForm() {
	return $this->myFormFactory->create();
}

Jinak v NEONu službu registruješ pod services

services:
	- IMyFormFactory

EDIT: Teď jsem si všiml že tvá metoda create má parametr $id a taktéž i konstruktor tvé komponenty. V tomto případě si raději naimplementuj továrničku ručně jako třídu. Ale vhodnější by bylo udělat tvé komponentě metodu setId() a tou pak ID donastavit při vytváření komponenty v presenteru nebo při volání akce.

EDIT2: Pozdě, už mě někdo předběhl a s oněco lepším řešením :D Ale i tak bych to ID nenastavoval skrz config a raději si ho tam dával až v presenteru.

Editoval JDC (14. 10. 2014 23:17)

Michal Vyšinský
Člen | 608
+
0
-

EDIT2: Pozdě, už mě někdo předběhl a s oněco lepším řešením :D Ale i tak bych to ID nenastavoval skrz config a raději si ho tam dával až v presenteru.

On také nenastavuje hodnotu $id v konfigu ale předá ji při volání metody create v presenteru.