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í