Snippet & setDefaultValues

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

Koukám na životní cyklus presenteru a tohle mi nedává smysl. Dělám něco špatně?

public function actionEditovat($id)
{
	$dealer = $this->dealerModel->dealer($id);

    $obec = $this->por_obecRepository->getById($dealer->obec_id, TRUE);
    $this['dealerForm']['obec_id']->setItems(array($obec->id => $obec->nazev));
    $this['dealerForm']['psc']->setValue($obec->psc);
    $this['dealerForm']->setDefaults($dealer->toArray());
}

public function handlePsc($value)
{
	$citties = $this->por_obecRepository->fetchPairs('id', 'nazev', array("psc = '$value'"), TRUE);

	if($citties)
    {
        asort($citties);
        $this['dealerForm']['obec_id']->setItems($citties);
    }
    else
    {
        $this['dealerForm']['obec_id']->setItems(array());
    }

    $this->redrawControl('obec');
}

public function createComponentDealerForm()
{
	...
	$form->addText('psc', 'PSČ')
    	->addRule(Form::FILLED);
    $form->addSelect('obec_id', 'Město', array())
	...
}

Pak tam mám nějaký JS na volání Handleru. Při vytváření uživatele mi to funguje dobře. Píšu do políčka psc a když je tam 5 číslic, JS zavolá handler a selectbox se naplní a formulář se uloží.

Problém mi nastane ve chvíli, kdy chci použít ten formulář pro editaci. Takže si ho nastavím v actionMetodě podle toho, co je v DB. Ale může stát, že budu chtít změnit město, takže ten handler použiji také. Vše proběhne ok do doby, než chci uložit formulář. Formulář se ukáže s chybou:

Please select a valid option.

Resp. tenhle řádek přepisuju ten AJAX někde ve validaci si myslím. Přitom podle toho životního cyklu, by měl být handler až později.

$this['dealerForm']['obec_id']->setItems(array($obec->id => $obec->nazev));

Pravděpodobně se pro validaci bere nastavení z actionMetody a ne aktuální options nastavené pomocí handleru. Jak to vyřešit? Díky za tipy.

Editoval kzk_cz (3. 2. 2015 14:22)

David Matějka
Moderator | 6445
+
+1
-

Spise me prekvapuje, ze ti funguje to vytvareni (nedavas nahodou do selectu pri vytvareni vsechny mesta a to psc to jen umozni filtrovat?)

V nette se behem jednoho pozadavku zpracovava pouze jeden signal – a jak handle tak form je zpracovani signalu, proto se ti handle nezavola.

IMHO na zavisle select boxy (nebo i jine zavisle inputy) je nejlepsi tohle reseni.

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

Ne nedávám. Při načtení formuláře, tam dávám jen aktuální město podle ID. Ten select má tedy na začátku jen jednu option. To nastavím v actionEditovat($id).

Pak se pustí signál:

$.nette.ajax({
	type: 'GET',
    url: {link psc!},
    data:
    {
    	'{!$presenter->getParameterId('value')}': $('.ajax-psc').val()
    }
});

Ten mi dobře nastaví v tom formuláři nové položky podle PSČ. Já vyberu nové město a kliknu uložit. A tam je ten problém. Validace se kontroluje s tím, co je zadáno v setItems() v actionEditovat() a ne podle aktuálních options v selectu v HTML. Ještě by to asi šlo obejít použitím onSubmit[], ale není moc hezké.

Díky za odkaz, ráno jsem si ho dával do záložek, že to pak prozkoukám, ale nepřišlo mi přesně to, co jsem se snažil hledat.

Editoval kzk_cz (3. 2. 2015 15:30)

David Matějka
Moderator | 6445
+
0
-

Mel jsem na mysli u vytvareni uzivatele (kde rikas, ze ti to funguje) – jestli tam nahodou do formulare pri nacteni nedas vsechny mesta? To by vysvetlovalo, proc to funguje.

Validace se kontroluje s tím, co je zadáno v setItems() v actionEditovat() a ne podle aktuálních options v selectu v HTML.

ano, to je bezpecnostni feature, aby ti nikdo nemohl nic podstrcit

nepřišlo mi přesně to, co jsem se snažil hledat.

imho jo, s par upravama :)

Pavel Kravčík
Člen | 1195
+
0
-
public function renderVytvorit()
{
    $this->template->setFile(__DIR__.'/../templates/PsaDealer/dealerForm.latte');
    $this->template->vytvor = TRUE;
}

public function renderEditovat()
{
	$this->template->setFile(__DIR__.'/../templates/PsaDealer/dealerForm.latte');
}

Navíc tam mám jen tu actionEditovat(), kde by se měly naplnit data k editaci. Takže to bude tím, že vlastně jsem to já, kdo se snaží podstrkávat data. :)

Jasně zkusím, mrknout na ten signál. Ale o těch úpravách… když jsem to ráno přelétl, tak mi přišlo, že se dostanu stejné situace. Jen to nebudu definovat v action() ale v createComponent() a na ten AJAX se to stejně vybodne. :D Ale vyzkouším.

Editoval kzk_cz (3. 2. 2015 16:02)

David Matějka
Moderator | 6445
+
0
-

To onChange zareaguje na kazdou zmenu hodnoty – tedy i pri zpracovani, kdyz se bude z http nacitat PSC – zavola se callback a zmeni to items v selectboxu s mestama.
Takze je nutne, aby ty inputy byly uvedeny ve zpravnem poradi – nejdrive ten, na kterem je to zavisle a az pak ten zavisly.

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

@matej21: PANE VY JSTE BŮH. Vypadá funkčně v testovacím presenteru. Na tohle bych v životě sám nepřišel. Díky! :)