Převod proměnné z JS do presenteru

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

Zdravím, nevím jestli se to týká přímo nette ale v nette pracuji tak bych ocenil i konkrétní příklad pro nette. Nevím jak se předá proměnná z view do presenteru. Příklad : mám nějakou jquery funkci a při vyvolání její event funkce chci udělat změnu v DB. Jinými slovy potřebuji předat proměnnou z toho eventu do presenteru a pak už jen updatnout tabulku v mysql. To s tím updatem DB zvládnu jedná se mi o to předání proměnné. Pokud někdo ví ocenil bych radu.

ViPEr*CZ*
Člen | 817
+
0
-

Jestli se nepletu, tak na to je ideální Ajax… mrkněte na stránkách jQuery jak se pracuje s Ajaxem a pak už si jen pomocí ajaxu zavoláte nějakou www adresu s parametrem a ten si potom již zachytíte v příslušném presenteru v metodě actionJménoVašíAkce($parametr);

Ot@s
Backer | 476
+
0
-

To je hodně obecný dotaz (neuvádíš, jestli se má jednat o ajax, či ne atd…). Ve většině jednoduchých případů si vystačíš se signály.

Fragment šablony presenteru

<a n:href="zpracuj!, param1=>123, param2=>789">Timto vyvolam tu akci</a>

Metoda v presenteru:

public function handlezpracuj($param1, $param2) {
	// zpracovani signalu, resp. parametru $param1, $param2
}

Pokud chceš pomocí JS vracet informace mimo dosah PHP skriptu, použij v JQuery post nebo get.

<button id="savedata">Uloz rozliseni obrazovky</button>
<script>
$(document).ready(function () {
	$('#savedata').click(function(){
		$.post({link UlozRozliseni!}, { h: screen.height, w: screen.width } );
	});
});
</script>

Metoda v presenteru:

public function handleUlozRozliseni($w, $h) {
	// zpracovani signalu, resp. parametru $w, $h
}

Pokud to celé chceš „oajaxovat“, tak je třeba v šablonách vymezit snippety, do layoutu webu JS pomůcku pro ajax v Nette, v kódu presenteru podle pořeby invalidovat ony snippety. No a pokud si zajišťuješ volání serveru vlastním způsobem, tak nezapomeň vyplnit do success callbacku (v JS) $.nette.success(data), tj. např.

<script>
$(document).ready(function () {
	$('#savedata').click(function(){
		$.post({link UlozRozliseni!}, { h: screen.height, w: screen.width },
		   function(data) {
		     	$.nette.success(data);
		   }
	);
	});
});
</script>
riski
Člen | 53
+
0
-

Děkuji za rady pravděpodobně si už poradím. Nicméně uvedu konkrétní příklad co chci udělat:

  • mám výrobky které ukládám do DB a poté je na webu z DB vypisuji seřazené podle sloupce ŘAZENÍ
  • v adminovi na webu si chci udělat přes jQuery pomocí fce .sortable() změnu tohoto výpisu prvků

To znamená že když myší přesunu prvek ve výpisu, má se updatovat DB (sloupec řazení). Jestli se to provede přes ajax nebo né to je mi celkem jedno. A zatím jsem uvízl u předání parametru do presenteru abych mohl použít příkaz na DB. Samozřejmě že bych rád co možná nejjednodušší řešení. Předem díky

ViPEr*CZ*
Člen | 817
+
0
-

No to bude nejlépe přes to Ajax řešení co napsal Ot@s. A ty handle (signály) budou asi lepší než ty action metody (díky za doplnění).

Ot@s
Backer | 476
+
0
-

Nástřel – ukazková struktura dat (v presenteru):

$this->template->data = array(
	array('id'=>15,'name'=>'Lopata'),
	array('id'=>25,'name'=>'Krumpac'),
	array('id'=>89,'name'=>'Kladivo'),
	array('id'=>99,'name'=>'Rumpal')
);
// v praxi spise $this->template->data = $this->getModel('catalog')->getProducts();

Sablona presenteru (nesmí chybět příslušné JS knihovny)

{snippet list4sort, ul}
	<li n:foreach="$data as $row" data-id="{$row['id']}">{$row['name']}</li>
{/snippet}

<script>
$(document).ready(function () {
	$( "#snippet--list4sort").sortable({
		update: function(event, ui) {
			var newordering = [];
			$( "#snippet--list4sort li").each(function(){
				newordering.push( { id: $(this).data('id') } );
			});

			$.post({link SetOrdering!}, { ordering: newordering },
				function(data) {
					$.nette.success(data);
				}
			);
		}
	});
});
</script>

Zachyceni (a zpracování) signálu v presenteru

public function handleSetOrdering($ordering) {
	if ($this->isAjax()) $this->invalidateControl('list4sort');
	// ... zde zpracuj nové pořadí v array $ordering
	// foreach ($ordering as $newordering=>$product) {
	// 	$this->getModel('contact')->updateProductOrdering( $product['id'], $newordering );
	// }
}

Editoval Ot@s (25. 10. 2011 12:14)

Ani
Člen | 226
+
0
-

Přesně to sortable už se tu jednou řešilo. https://forum.nette.org/…ble-s-ajaxem

Editoval Ani (25. 10. 2011 12:10)

riski
Člen | 53
+
0
-

mockrát děkuji

Tomáš Votruba
Moderator | 1114
+
0
-

Jestli hledáte hodnoty pro select závislé na jiném selectu, zde je funkční řešení (sám jsem ho nejdříve zprovoznil :))

Editoval Schmutzka (29. 12. 2011 16:21)