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

- BigCharlie
- Člen | 285
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
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
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 | 285
@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
@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 | 285
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.