[Formular ako komponeta] nastavenie setDefaults az na konci formulara

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

Zdravim, nevedeli by ste mi poradit? Mam formular ako komponentu v ktorej definujem len telo formulara, odosielacie tlacitko, setDefaults a onSuccess. Prvky formulara naplnam az v tovarnicke presenteru.
Problem je v tom ze komponenta si sama zisti defaultne hodnoty a kedze prvky formulara pridavam az v tovarnicke tak v komponente nema comu nastavit tieto hodnoty. Ako by som vedel prvky formulara pridat skor ako nastavim setDefaults()?

Komponenta

class FilterFormControl extends UI\Control {

    private function getDefaults() {
        return $this->ziskajDedaults();
    }

    protected function createComponentForm() {
        $form = new Form;

        $form->addSubmit('ok', 'Ok');
        $form->setDefaults($this->getDefaults());
        $form->onSuccess[] = callback($this, 'filterSubmitted');
        return $form;
    }

}

Presenter

protected function createComponentFilter($name) {
    $control = new \FilterFormControl($this, $name);
    $form = $control['form'];

    $form->addText('prvok', 'Popis');

    return $control;
}
Jirda
Člen | 103
+
0
-

duskohu napsal(a):

Zdravim, nevedeli by ste mi poradit? Mam formular ako komponentu v ktorej definujem len telo formulara, odosielacie tlacitko, setDefaults a onSuccess. Prvky formulara naplnam az v tovarnicke presenteru.
Problem je v tom ze komponenta si sama zisti defaultne hodnoty a kedze prvky formulara pridavam az v tovarnicke tak v komponente nema comu nastavit tieto hodnoty. Ako by som vedel prvky formulara pridat skor ako nastavim setDefaults()?

Komponenta

class FilterFormControl extends UI\Control {

    private function getDefaults() {
        return $this->ziskajDedaults();
    }

    protected function createComponentForm() {
        $form = new Form;

        $form->addSubmit('ok', 'Ok');
        $form->setDefaults($this->getDefaults());
        $form->onSuccess[] = callback($this, 'filterSubmitted');
        return $form;
    }

}

Presenter

protected function createComponentFilter($name) {
    $control = new \FilterFormControl($this, $name);
    $form = $control['form'];

    $form->addText('prvok', 'Popis');

    return $control;
}

Proc si to nerozfazujes tak, ze az kdyz nadefinujes ty prvky formulare, tak pak das pokyn k tomu, aby se nastavili default hodnoty. Takova metoda by pak mohla umoznit treba definovat ty default hodnoty z venku nebo v pripade null argumentu, automaticky z toho tveho getDefaults. Nebo snad vzdy nastane pro ten form situace, ze mu potrebujes nastavit nejaky default hodnoty?

duskohu
Člen | 778
+
0
-

Nejaky priklad by sa nenasiel?

David Zadražil
Člen | 62
+
0
-

Po tomhle řádku:

$form->addText('prvok', 'Popis');

Zkus dát:

$this['form']->setDefaults(defaultníHodnotyTady);
duskohu
Člen | 778
+
0
-

lenze ja si defaults zistujem v komponente a teda ich tam musim aj nastavit

Nox
Člen | 378
+
0
-
<?php
// presenter
$form->setDefaults(/*...*/);
?>

nefunguje?

duskohu
Člen | 778
+
0
-

to funguje, len neviem ako to urobit aby som mal v komponente:

$form->addSubmit('ok', 'Ok');
$form->setDefaults($this->getDefaults());
$form->onSuccess[] = callback($this, 'filterSubmitted');

a v presenteri len pridal ostatne formularove prvky
Uvazoval som:
v komponente:

public function finishForm() {
    $this['form']->setDefaults($this->getData());
    $this['form']->addSubmit('filter', 'Filter');
}

a potom v presenteru

protected function createComponentFilter($name) {
    $control = new \FilterFormControl($this, $name);
    $form = $control['form'];

    $form->addText('prvok', 'Popis');
    $control->finishForm(); // pridam na koniec formulara co potrebujem
    return $control;
}

ale chcelo by cistejsi sposob.

Nox
Člen | 378
+
0
-

A co kdyby presenter předal té komponentě do konstruktoru či setterem (tady asi vhodnější setter), ty defaultní hodnoty a ten by si je uložil do property a pak je použil … ?

Mj. to přidávání prvků do formuláře komponenty mi přijde stejně nečisté, imho by definice formuláře neměla být roztříštěná všude možné po presenterech…

duskohu
Člen | 778
+
0
-

Nox napsal(a):

A co kdyby presenter předal té komponentě do konstruktoru či setterem (tady asi vhodnější setter), ty defaultní hodnoty a ten by si je uložil do property a pak je použil … ?

Mj. to přidávání prvků do formuláře komponenty mi přijde stejně nečisté, imho by definice formuláře neměla být roztříštěná všude možné po presenterech…

Lenze komponenta si defaultne hodnoty zistuje sama, nepredava jej ich presenter (tato funkcionalita pripada komponente), to by som si vytiahol defaultne hodnoty od komponenty v presenteru a potom ich zase komponente predal? Definicia formulara je rozsiritelna preto lebo nepozna dopredu ake bude mat prvky je to filter a tie definuje presenter take ake potrebuje.

Jirda
Člen | 103
+
0
-

duskohu napsal(a):

Nox napsal(a):

A co kdyby presenter předal té komponentě do konstruktoru či setterem (tady asi vhodnější setter), ty defaultní hodnoty a ten by si je uložil do property a pak je použil … ?

Mj. to přidávání prvků do formuláře komponenty mi přijde stejně nečisté, imho by definice formuláře neměla být roztříštěná všude možné po presenterech…

Lenze komponenta si defaultne hodnoty zistuje sama, nepredava jej ich presenter (tato funkcionalita pripada komponente), to by som si vytiahol defaultne hodnoty od komponenty v presenteru a potom ich zase komponente predal? Definicia formulara je rozsiritelna preto lebo nepozna dopredu ake bude mat prvky je to filter a tie definuje presenter take ake potrebuje.

Paklize komponenta nemuze predem znat definici formulare, tak jak by pak mela znat predem defaultni hodnoty pro ten neznamy formular?

Jak jsem psal s tou metodou, myslel jsem to same, co nekteri vyse. Ze proste za definici zavolas setDefault. Jeste me napadlo, zda by to neslo zavolat treba tak, ze by to bylo volane z renderu, ktery bude vyvolan v te komponente, ale tady si nejsem jisty zivotnim cyklem, takze je to spis jen rada ke zkousce.

Kazdopadne si myslim, co vetsina ostatnich, ze to neni zrovna hezky navrh.