Formulář – továrna na prvky formuláře

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

Ahoj,

zajímá mě, jak řešíte následující situaci: V aplikaci řada formulářů, každý jako komponenta. V několika formulářích používám naprosto totožný prvek, něco takovéhoto:

$form->addCheckboxList('options', 'Varianty', $this->someFacade->getOptions());

Každý formulář, který obsahuje tenhle list, je tedy závislý na someFacade. Pokud mám takových prvků víc, roste analogicky počet závislostí (zatím jsem se dostal na cca šest).

Co by se mi líbilo – mít společného formulářového předka (už ho stejně mám) a v něm nějakou „továrničku“, která by prvek vytvořila a dodala mu potřebné závislosti. A v konkrétním formuláři už bych jen použil

$form->addMyOptions('options', 'Varianty');

Jedním řešením je mít nějakou „fasádu, plnící formuláře“, do které bych koncentroval všechny ty getSomeData. Z nějakého důvodu se mi to moc nepozdává.

Jdu na to zcela blbě? Jak to řešíte vy?

David Kregl
Člen | 52
+
-8
-

Ahoj,
napadá mě si do globální proměnné uložit result z $this->someFacade->getOptions().

A ten pak použít.

Jan Mikeš
Člen | 771
+
0
-

Pokud stejny prvek vyuzivas opravdu casto na ruznych mistech, muzes vyuzit napr tento koncept:

// FormFactory.php
$this->myInputService->addOptions($form, "options", "Varianty");

// MyInputService.php
private $someFacade; // Pres konstruktor

public function addOptions(Forms\Form $form, $name, $label)
{
	$form->addCheckboxList($name, $label, $this->someFacade->getOptions());
}

Dalsi napad… mozna trosku zretelnejsi na prvni pohled pro nekoho, kdo nevi jak aplikace funguje:

// FormFactory.php
$form["options"] = $this->myInputService->getOptionsCheckboxList("varianty");

// MyInputService.php
public function getOptionsChecboxList($label)
{
	return new Controls\CheckboxList($label, $this->someFacade->getOptions());
}

A posledni z rady mych napadu https://api.nette.org/…ect.php.html#… ale do toho bych se osobne nepoustel, vyse zminena reseni jsou imho cistejsi

Editoval Lexi (6. 8. 2015 20:46)

BigCharlie
Člen | 284
+
0
-

@DavidKregl: brr, to vypadá hodně odpudivě. Závislost na globální proměnné by ti fakt nevadila?

@Lexi: Aha, šel jsi o krok dál – služba, plná továrniček na opakující se prvky formuláře. To by mohla být cesta. Kouknu na to.

Používá někdo elegantnější přístup?

Jan Mikeš
Člen | 771
+
0
-

@BigCharlie presne tak, zalezi kolik tech prvku budes mit, take jestli budes mit vsechny prvky sjednocene v jedne tride (1 formularovy prvek == 1 metoda) protoze pri vyssim poctu prvku ti ta trida muze celkem slusne narust, pro nejake opravdu slozite prvky klidne samostatnou tovarnicku, ve ktere by probihala i logika vypoctu atd, prakticky vse co je s timto formularovym prvkem spojeno (prevest sem nejakou zodpovednost z fasady).

Nebo pak jak jsem psal, pres extensionMethod si vytvaret vlastni formularove prvky (ale jak jsem zminil, toto reseni mi pro tuto situaci uplne nesedi).

BigCharlie
Člen | 284
+
0
-

Těch opakujících se prvků, které mají nějakou závislost, mám cca 5. Jsou to typicky nějaké selecty na uživatele apod.

Takže by to mohla být cesta.

F.Vesely
Člen | 369
+
-1
-

V tomhle mam rad Doctrine, hodim si tam EntityManager, z nej vytahnu Repository a mam 1 zavislost a ne 50, na kteryma volam findPairs.

Oli
Člen | 1215
+
+1
-

To je to stejné jako context u NDBT. A nemyslím si, že to je zrovna nejčistší. Vzniká ti tím skrytá závislost na databázi (respektive entitách). Neříkám ale, že se to někdy nemůže hodit :-)