Zpracování akce po kliknutí na checkbox pomocí AJAXu

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

Zdravím,
můžete mi prosím poradit? Už jakou dobu řeším problém ohledně checkboxů. Povedlo se mi zprovoznit, aby se po kliknutí na checkbox zavolala handle metoda, ale zároveň se provede i redirect stránky. Potřeboval bych to udělat ajaxově, aby se provedl handle bez přesměrování.

$fcont = $form->addContainer('watches');
foreach ($this->revision as $key => $value)
{
	$fcont->addCheckbox($value->getId(), 'Hlídat')
    ->controlPrototype->onChange('window.open("'.$this->link("changeWatchStatus!", array("check" => $value->getId())).'","_self")');
    if($value->isWatch())
    {
    	$fcont->components[$value->getId()]->setValue(1);
    }
}

Jedná se o checkboxy, který hlídají stav, tedy potřebuji po kliknutí provést změnu stavu. V šabloně to vykresluju takto:

<div n:foreach="$checkBoxForm['watches']->getComponents() as $checkbox">
	<div class="col-md-1">{$checkbox->control}</div>
</div>

Nemáte někdo nápad, jak to udělat pomocí AJAXu?

Editoval maros (12. 3. 2016 21:31)

Machy8
Člen | 59
+
0
-

Nestačilo by akorát přidat return false po kliknutí? Je tomu tak třeba v tomto návodu. Ajax se dá provést například takhle (budeš si muset do hlavičky přidat tento soubor):

window.urlPrikazu = {link odesli!};

a pak jen

$("#checkbox").click(function(){
	var mujCheckbox = $(this).val();
	$.ajax({
		url: urlPrikazu,
		data: {hodnota: mujCheckbox}
	});
	return false;
})

Editoval Machy8 (12. 3. 2016 22:16)

maros
Člen | 16
+
0
-

Vyhodí se chyba, že není známo macro hodnota, tuším že jsem ho měl něčím nahradit, ale nenapadá mě čím, prosím o radu. Když smažu řádek data, tak se mi to takto nedaří zprovoznit, vůbec se mi metoda handlechangeWatchStatus($data) provede.

Editoval maros (12. 3. 2016 23:00)

Machy8
Člen | 59
+
0
-

A co to hází za chybu? Jak vypadá ten javascript, který to volá (pokud tam je i něco jiného než jsem psal)?

Editoval Machy8 (12. 3. 2016 22:59)

Machy8
Člen | 59
+
0
-

Pokud ten javascript je ve formátu <script> //nějaký kód </script> namísto nalinkování, tak je lepší tam dát <script n:syntax="off"> //nějaký kód </script> to vypne Latté syntaxy pro onen skript a nebude to hlásit chyby ohledně maker.

Editoval Machy8 (12. 3. 2016 23:06)

maros
Člen | 16
+
0
-

Nene, jediné co mi to volá handle, tak je

$fcont->addCheckbox($value->getId(), 'Hlídat')
    ->controlPrototype->onChange('window.open("'.$this->link("changeWatchStatus!", array("check" => $value->getId())).'","_self")');

Nepoužívám doposud žádný javascript. Neloguje mi to žádnou chybu.

maros
Člen | 16
+
0
-

Vypnul jsem latte syntaxi ve scriptu.
Jen taková otázka pro jistotu, řádek, který mi určuje akci onChange při tvorbě checkboxu, mám smazat nebo ne? Když ho smažu, neprovede se nic, když ho tam nechám, změna se provede, ale přesměruje se stránka.
Nemůže být problém, že se mi generují dynamicky checkboxy, kde každý má jiný ID a v JS ve funkci používám identifikátor #checkbox?
Signál, který se volá, vypadá následovně:

public function handlechangeWatchStatus($data)
    {
        $q_revision = $this->em->getRepository('Items');
        $temp_revision = $q_revision->find($data);
        $temp = ($temp_revision->isWatch() ? false : true);
        $temp_revision->setWatch($temp);
        $this->em->persist($temp_revision);
        $this->em->flush();
    }

Editoval maros (12. 3. 2016 23:17)

premek_k
Člen | 172
+
0
-

Ta metoda by měla mít název

	public function handleChangeWatchStatus($data)
premek_k
Člen | 172
+
+2
-

Takhle je funkční to, co bylo uvedeno výše – pro jeden checkbox:

V latte:

	{* Nejake jQuery - jen pro uplnost preneseno sem z @layout.latte) *}
	<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>

	<input type="checkbox" id="myCheckbox">Test

	<script type="text/javascript">
		$("#myCheckbox").click(function(){
			var isChecked = $(this).is(':checked');
	    	var ajaxLink = {link odesliAjaxem!};
			$.ajax({
				url:  ajaxLink,
				data: { state: isChecked }
			});
		})
	</script>

a v controleru

	public function handleOdesliAjaxem($state)
	{
		var_dump($state);
	}
maros
Člen | 16
+
0
-

Díky moc, už mi to funguje :)