Signál checkbox a radioList

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

Ahoj,

Jde nějak přidat signál na Checkbox a radioList? V templatu si foreachem vypíši do tabulky lidi, a chci mít u nich u každého jeden checkbox a radiolist s ANO/NE stím, že po výběru se proces vložení dat do db provede okamžitě. Odkazem n:href předám parametr za signálem, ale jak je tu checkboxu?

Hádám, že to bude nějaký ajax… Nevěděli byste alespoň náznak jak to udělat funkční?

díky

MartyIX
Člen | 217
+
0
-

Takhle by to bylo pro jeden checkbox. Je potreba toho dost doplnit, ale toto je zaklad.

public function handleCheckboxChange() {

   $value = $this->presenter->getParameter('checkboxvalue');
   // Database ...
   // ...
   // Response ...
   $this->presenter->payload->success = true; // value was changed successfully
   $this->presenter->sendPayload();
}

Sablona:

$.getJSON({link checkboxChange), { checkboxvalue: $('#checkbox').val() }, function (data) {

   alert(data.success ? "Zmeneno" : "Chyba!");
});
sppilka
Člen | 37
+
0
-

Jasně, takže to první je funkce v komponentě.php a ten getJSON je v hlavičce předpokládám, a co by se mělo doplnit do šablony přímo do toho <td></td>?

Otázka kde se předává to id?

V tom zakomentovaném DAtabase to bude vložení do db, a to response to je odezva z toho vložení do db jestli se to vložilo? Čili něco jako

/...
$ok = $this->table->insert(array(
		'dochazka' => $value
	))

if($ok){

   $this->presenter->payload->success = true; // value was changed successfully
   $this->presenter->sendPayload();

}

Ten ajax je pro mě aztím španělská vesnice

MartyIX
Člen | 217
+
0
-

sppilka napsal(a):

Jasně, takže to první je funkce v komponentě.php a ten getJSON je v hlavičce předpokládám, a co by se mělo doplnit do šablony přímo do toho <td></td>?

Jj, prvni patri do komponenty a to druhe je ukazka odeslani hodnoty jednoho checkboxu pres AJAX.

Z toho uvodniho prispevku jsem pochopil, ze v okamziku, kdy uzivatel klikne na checkbox, tak se ma udelat ten AJAXovy pozadavek. Pak si muzes v sablone udelat:

<td>
	<input type="checkbox" name="chck-{$id_uzivatele}" data-checkboxid="{$id_uzivatele}" value="1" /> Ano<br />
	<input type="checkbox" name="chck-{$id_uzivatele}" data-checkboxid="{$id_uzivatele}" value="0" /> Ne
</td>

Otázka kde se předává to id?

S IDckama bys to mohl udelat nejak takto.

$(document).ready(function() {

	$('#myTable input:checkbox').click(function() {

		var user_id = $(this).data('checkboxid');
		var params = {
			checkboxvalue: $('#checkbox').val(),
			user_id: user_id
		};
		$.getJSON({link checkboxChange), params, function (data) {

		   alert(data.success ? "Zmeneno" : "Chyba!");
		});

	});
});

V tom zakomentovaném DAtabase to bude vložení do db, a to response to je odezva z toho vložení do db jestli se to vložilo? Čili něco jako

/...
$ok = $this->table->insert(array(
		'dochazka' => $value
	))

if($ok){

   $this->presenter->payload->success = true; // value was changed successfully
   $this->presenter->sendPayload();

Tohle je spatne, sendPayload musis zavolat vzdy, to zajisti, ze Nette vrati odpoved v JSONu.

Spravne tedy:

$ok = $this->table->insert(array('dochazka' => $value)); // tohle bych asi umistil do modelu
$this->presenter->payload->success = $ok;
$this->presenter->sendPayload();

>

}
\--

Ten ajax je pro mě aztím španělská vesnice

sppilka
Člen | 37
+
0
-

Takže nějak by to celé vypadalo takto:
Komponenta:

public function handleCheckboxChange() {

   $value = $this->presenter->getParameter('checkboxvalue'); //ziskame hodnutu checkboxu 1/0
   $id_user = $this->presenter->getParameter('id_user'); //idcko z id_user - budeto fungovat?

   $ok = $this->table->where('id = ?', $id_user)->update(array('dochazka' => $value)); //update mohlo by byt v modelu, postaci zatim takto
   $this->presenter->payload->success = $ok; //pokud ok vrati true vse je success
   $this->presenter->sendPayload(); //tohle odesle presenteru obsah? nebo jak to funguje?

}

Pote v sablone v hlavicce ten tvuj kod

$(document).ready(function() {

        $('#myTable input:checkbox').click(function() {

                var user_id = $(this).data('checkboxid');
                var params = {
                        checkboxvalue: $('#checkbox').val(),
                        user_id: user_id
                };
                $.getJSON({link checkboxChange), params, function (data) {  // tady odesleme i id do params

                   alert(data.success ? "Zmeneno" : "Chyba!");
                });

        });
});

a v šabloně ve foreach($attendance as $a)…

<td>
        <input type="checkbox" name="chck-{$a->id}" data-checkboxid="{$a->id}" value="1" /> Ano<br />
        <input type="checkbox" name="chck-{$a->id}" data-checkboxid="{$a->id}" value="0" /> Ne
</td>

Mohlo by to takhle fungovat?

Editoval sppilka (31. 8. 2012 12:49)

sppilka
Člen | 37
+
0
-

Tak mě napadá jak by to bylo s jedním checkboxem? checked = 1 unchecked = 0 ?

MartyIX
Člen | 217
+
0
-

sendPayload by mel fungovat a ten zbytek si prece dokazes oddebugovat, ne? Treba v Chrome to jde fakt jednoduse. CTRL+SHIFT+J, podivas se do karty Network, co ti ten ajax request vraci (muzes pouzit echo, pokud si nejses jisty, co se tam deje) a jak se zavolal (jak vypada URL a parametry).

sppilka
Člen | 37
+
0
-

Super díky moc asi se zaměřím více na ajax a query…