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 | 661
+
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í