změna hodnoty textinputu při selectbox onchange funguje pouze u jednoho z nich

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

Ahoj, moc vás prosím o pomoc, nevím, kde je chyba

mám ve formu tyto inputy: (plus ještě další)

<?php
        foreach ($virtuals as $vid)
        {
            $form->addContainer($vid);
            $form[$vid]->addSelect('slaType','Typ SLA:',$sla)
                ->setHtmlId($vid)
                ->setValue($def[$vid]['id']);
            $form[$vid]['slaType']->getControlPrototype()->class = "sla_type";
            $form[$vid]->addDatePicker('start','Od:',10)
                ->setHtmlId('sla_start_'.$vid)
                ->setValue($def[$vid]['zacatek']);
            $form[$vid]->addText('time','Trvání')
                ->setHtmlId('sla_time_'.$vid)
                ->setValue($def[$vid]['monthcount'])
                ->addRule(Form::FILLED, "Prosím vyplňte počet měsíců")
                ->addRule(Form::RANGE, 'Počet měsíců je omezen od %d do %d', array(1, 120))
                ->getControlPrototype()->style = "width: 60px"
                ;
        }
?>

při změně hodnoty selectboxu potřebuji změnit data v obou textových polích (datum a trvání)

Javascript:

<script>
    $('.sla_type').change(function () {
        var el = this;
        loadBox('#sla_time_'+el.id,$(el).val(),'sla_monthcount',el.id);
        loadBox('#sla_start_'+el.id,$(el).val(),'sla_datestart',el.id);
    });

    // Načítání dat po selectboxu
    function loadBox(destination,index,form,id)
    {
        $.get("?do=loadData&presenter=Realizations", {"index": index, "form": form, "id": id}, function(data) {
            $(destination).val(data);
        })
    }
</script>

Funkce loadData() je definována v presenteru Realizations a projde v pohodě, v konzoli FireBugu se zobrazí výstupy

GET http://127.0.0.1/ss/?do=loadData&presenter=Realizations&index=1&form=sla_monthcount&id=3

200 OK
		450ms
jquery.min.js (řádek 130)
Odezva

12

GET http://127.0.0.1/ss/?do=loadData&presenter=Realizations&index=1&form=sla_datestart&id=3

200 OK
		391ms
jquery.min.js (řádek 130)
Odezva
8.7. 2010

Textové pole změní svou hodnotu na 12, což je správně, ale v poli datum zůstane původní hodnota, přičemž skript nezařve žádnou chybu.

V JS funkci loadBox() se mi při vložení

<script>
alert(data);
</script>

zobrazí postupně dvě okna, kde jedno je prázdné a druhé obsahuje číslo 12.
Proč funkce nevidí výsledek, který mu vrací PHP funkce handleLoadData()?

Pro jistotu sem dám i PHP funkci (slouží pro více možností, proto ty ify)
⇒ jen zdůrazním, že podle FireBugu mi vrací správnou hodnotu, jen mi ji JS neuloží do pole DatePicker
(zkoušel jsem natvrdo nastavit v JS onChange metodě naplnění nějakým výrazem a pole se naplnilo v pohodě)

<?php
    public function handleLoadData($index,$form,$id = false)
    {
        if ($form == 'addWork')
            $array = dibi::query("SELECT id, priceperunit FROM deliveries WHERE iswork = 't'")->fetchPairs();
        elseif ($form == 'addMaterial')
            $array = dibi::query("SELECT id, priceperunit FROM deliveries WHERE iswork = 'f'")->fetchPairs();
        elseif ($form == 'sla_datestart')
        {
            $realization = dibi::query("SELECT idrealization FROM virtualdevices WHERE id = $id")->fetchSingle();
            $array = dibi::query("SELECT idsupporttype"
                .",".Base::concat(array(
                    'extract(day FROM datestart)',
                    '.',
                    'extract(month FROM datestart)',
                    '.',' ',
                    'extract(year FROM datestart)',
                    ))
                    ." AS zacatek"
                ." FROM realizationsla WHERE idrealization = $realization")->fetchPairs();
        }
        elseif ($form == 'sla_monthcount')
        {
            $realization = dibi::query("SELECT idrealization FROM virtualdevices WHERE id = $id")->fetchSingle();
            $array = dibi::query("SELECT idsupporttype, monthcount FROM realizationsla WHERE idrealization = $realization")->fetchPairs();
        }
        else
            throw new ApplicationException("Vadná hodnota '$form' jako parametr fce handleLoadData()");

        if ($index == "")
            echo "";
        else
            echo $array[$index];

        $this->terminate();
    }
?>
worsik
Člen | 40
+
0
-

Právě jsem pomocí Firebugu zjistil, že při druhém průchodu, nebo spíše při průchodu fce

loadBox('#sla_start_'+el.id,$(el).val(),'sla_datestart',el.id);

se program vůbec nedostane k provedení řádku

$(destination).val(data);

(použil jsem breakpoint a program jej přeskočil)

worsik
Člen | 40
+
0
-

Tak mám novinku, zjistil jsem, že projdou pouze čiselná data a text ne…

Nechápu proč.
Je to omezení JS?

<script>
function loadBox(destination,index,form,id)
{
    var data;
    $.get("?do=loadData&presenter=Realizations", {"index": index, "form": form, "id": id}, function(data) {
        alert(data);
        $(destination).val(data);
        $(destination).text(data);
    })
}
</script>

Mám teď jeden SelectBox a tři TextInputy. Buď vyberu hodnotu ze Selectu a JS mi naplní Texty nebo si je vypíšu sám. Při automatickém vyplnění to ale vyplní jen hodnoty, které jsou čísla.

Proč?
Firebug konzole mi zobrazí správné výstupy všech tří hodnot, takže PHP funguje dobře…

P.S.: Ten alert je tam kvůli zjištění, jestli mi ty data projdou (zobrazí se jen při číslech)

worsik
Člen | 40
+
0
-

SLÁVA

Znovu jsem se vrhnul na vyhledávání témat a konečně jsem narazil na řešení:

hiny napsal(a):

pjoter napsal(a):

Tak me uz to jede bylo to tim ze sem mel globalne nastaveno data-type na JSON

staci zakomentovat radek v jquery.nette.js

Díky za info.

viz téma

Stačí tedy zakomentovat řádek v souboru jquery.nette.js

<script>
jQuery.ajaxSetup({
	success: jQuery.nette.success,
//	dataType: "json"
});
</script>