Ajax onSubmit[] handler – getValues vs. getHttpData

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

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 | 652
+
0
-

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?

  1. Povolit vybraní položky mimo rozsah pomocí proměnné (špatné řešení a musíš data znova kontrolovat)
  2. Upravit ajaxové načítání

Editoval Martk (24. 1. 2017 23:15)

alNath
Člen | 17
+
0
-

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?

  1. Povolit vybraní položky mimo rozsah pomocí proměnné (špatné řešení a musíš data znova kontrolovat)
  2. Upravit ajaxové načítání