Převod proměnné z JS do presenteru
- riski
- Člen | 53
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.
- Ot@s
- Backer | 476
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
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
- Ot@s
- Backer | 476
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
Přesně to sortable už se tu jednou řešilo. https://forum.nette.org/…ble-s-ajaxem
Editoval Ani (25. 10. 2011 12:10)
- Tomáš Votruba
- Moderator | 1114
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)