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

Zdravím,

mám spíš teoretickou otázku na best practise. Vytvořím si továrničku na základní formulář. Ten chci pak rozšířit o pár políček na dalších deseti místech a pokaždé jiných. Chtěl jsem zachovat princip 1 definice a 1 latte pro každou továrničku. Abych pokud změním zíkladní formulář – změní se mi všude. Vyhnout se DRY.

class baseForm extends UI\Control
{
	protected function createBody()
    {
        $form = new UI\Form;
        $form->addText('book', 'Název knížky');

        return $form;
    }

    public function createComponentBaseForm()
    {
        $form = $this->createBody();
        $form->addSubmit('send', 'Odeslat');
        $form->onSuccess[] = $this->processForm;

        return $form;
    }
}

/** Chci na jiném místě použít formulář a ještě si k němu přidat něco */

class testForm extends baseForm
{
    protected function createBody()
    {
        $form = parent::createBody();
        $form->addText('test', 'Další políčko');

        return $form;
    }

    public function createComponentTestForm()
    {
        $form = $this->createBody();
        $form->addSubmit('send', 'Odeslat');
        $form->onSuccess[] = $this->processForm;

        return $form;
    }
}

class basicForm extends UI\Control
{
	/** Stejná struktura jako baseForm */
}

Podobně složím i latte přes bloky. Což je samo o sobě skvělé pro můj případ.

Ale kdybych teoreticky chtěl složit formulářů více? Tady můžu snadno používat všechny protected vlastnosti předka (ajax, signály). Ale kdyby nastala situace, že chci dědit dvě věci a nějakým způsobem si je spojit?

class basicForm extends UI\Control
{
	/** Pokud byly traity */
	use baseForm, basicForm;
}

V současnosti to považuju za blbost a neřešitelný „problém“ a myslím, že musím změnit myšlení. Dědit si form ale nespojovat jich tolik a radši to řešit závislostmi nebo postupnými kroky. Ale myslím, že čím víc informací tím lepší návrh.

Díky

Filip Klimeš
Nette Blogger | 156
+
0
-

Možná bys mohl zkusit kompozici

Pavel Kravčík
Člen | 1196
+
0
-

@FilipKlimeš: Ano to používám na určité bloky baseForm. Například volitelné bloky jako korespondenční adresa. Jde mi o kompozici na úrovni továrniček.

Protože třeba ten baseForm bude mít handler na výpis dat z Ares. To do containeru nenarvu.

Editoval kzk_cz (23. 1. 2015 9:11)

Filip Procházka
Moderator | 4668
+
0
-

Mně se to nelíbí. A to tvoje přetížené createBody už vůbec ne.

Handle na ARES můžeš dát klidně do té komponenty a nemusíš to dávat do formuláře, na co taky? :)

Pavel Kravčík
Člen | 1196
+
0
-

Ono to ani pořádně nefunguje. V podstatě hledám nějaké „rozšířené containery“. Já si sice můžu jednoduše připravit část formuláře, kterou použiji potom 10×. Ale pokud na tu část budu mít navázány nějaké speciální akce (dependent select box přes ajax), tak bych ho stejně musel 10× dát do každého presenteru. A pokud ho budu chtít změnit, tak ho musím hledat na deseti místech.