Ajax onSubmit[] handler – getValues vs. getHttpData
- alNath
- Člen | 17
Zdravim,
Mam formular a k nemu zaveseny onSubmit[] handler. Formular je ciastocne plneny
ajaxom (selectbox). Problem vsak nastava ked chcem jeho udaje spracovat.
Konkretne sa jedna o hodnotu rodina
.
Ak chcem spracovat data vytiahnute z $form->getValues()
, jej
hodnota je NULL
Ak ich vezmem z $form->getHttpData(), stratim informacie o type
date
.
Zdrojak:
$control->onSubmit[] = function (Form $form) {
dump($this->presenter->isAjax());
$aValues = $form->getValues();
dump($aValues);
$dValues = $form->getHttpData();
Debugger::dump($dValues);
exit();
};
Vysledok:
FALSE
Nette\Utils\ArrayHash #7eea
rodina => NULL
udalost => "xxx" (3)
kategoria => 0
date => Nette\Utils\DateTime #cfcc
date => "2017-01-24 00:00:00.000000" (26)
timezone_type => 3
timezone => "Europe/Prague" (13)
note => ""
array (7)
rodina => "25" (2)
udalost => "xxx" (3)
kategoria => "0"
date => "24.01.2017" (10)
note => ""
send => "Odoslať" (8)
_do => "dennikForm-submit" (17)
Dodavam ze pokial sa formular Ajaxovo nezmeni, $aValues
ma
spravne nastavenu hodnotu. Ako docielit aby to aj po zmene bolo naplnene
spravne?
- Martk
- Člen | 661
Hodil by se kód formuláře. Nevím o jaký druh inputu se jedná v případě „rodina“. Předpokládám tedy, že o select. NULL hodnota je tam, protože select kontroluje, zda se zvolená hodnota nachází v poli items. Když to načítáš ajaxově, tak ty hodnoty asi neprobublají k finálnímu odeslání, takže v items jsou položky, které se vyskytují na začátku formuláře (nově přidané tam nejsou).
Jak to vyřešit?
- Povolit vybraní položky mimo rozsah pomocí proměnné (špatné řešení a musíš data znova kontrolovat)
- Upravit ajaxové načítání
Editoval Martk (24. 1. 2017 23:15)
- alNath
- Člen | 17
Ide o 2 selectboxy, na zaklade zmeny prveho, ajaxovo menim data v
„rodina“
Obsluha zmeny je tiez standardna:
public function handleChange($value)
{
if($this->isAjax()) {
if ($value) {
$secondItems = $this->rodiny->fetchPairs($this->getUser()->getID(), $value);
if (count($secondItems)) {
$this['dennikForm']['rodina']
->setItems(array(NULL => "Zvoľte") + $secondItems, TRUE);
} else $this['dennikForm']['rodina']
->setItems(array(NULL => "Žiaden") + $secondItems, TRUE);
} else {
$this['dennikForm']['rodina']
->setItems(array(NULL => "Žiaden"), TRUE);
}
$this->redrawControl('secondSnippet');
}
}
V sablone je selectbox zaobaleny do snippsetu:
<tr>
<th>{label rodina /}</th>
<td>{snippet secondSnippet}{input rodina}{/snippet}</td>
</tr>
Ako workaround pouzivam nie uplne ciste riesenie:
private function getFormData(...parametre..)
{
if (!isset($values->rodina))
{
if (isset($form->getHttpData()['rodina'])) {
return intval($form->getHttpData()['rodina']);
} else return null;
} else return $values->rodina;
}
Martk napsal(a):
Hodil by se kód formuláře. Nevím o jaký druh inputu se jedná v případě „rodina“. Předpokládám tedy, že o select. NULL hodnota je tam, protože select kontroluje, zda se zvolená hodnota nachází v poli items. Když to načítáš ajaxově, tak ty hodnoty asi neprobublají k finálnímu odeslání, takže v items jsou položky, které se vyskytují na začátku formuláře (nově přidané tam nejsou).
Jak to vyřešit?
- Povolit vybraní položky mimo rozsah pomocí proměnné (špatné řešení a musíš data znova kontrolovat)
- Upravit ajaxové načítání