Implementace modulu sortable
- admin@easyweb4u.cz
- Backer | 143
Potřeboval bych rozchodit změnu pořadí li položek přetažením položky v nette (sortable). Pokud to testuji mimo nette, funguje to perfektně. Tady jsou kódy:
<script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.4/jquery-ui.min.js"></script>
<script>
$(document).ready(function () {
$("#list_of_tasks").sortable({
update: function (event, ui) {
$.post("ajax_sort.php", { type: "orderPages", pages: $('#list_of_tasks').sortable('serialize') });
}
});
});
</script>
<ul id="list_of_tasks" class="ui-sortable">
<?php
$result = mysqli_query($db_connect, "select * from erp_checklist order by priorita");
while ($row = mysqli_fetch_array($result)) {
echo '<li id="page_'.$row['priorita'].'"> <div class="datablock"> '.$row['item'].' </div></li>';
}
?>
</ul>
ajax_sort.php
if( $_POST['pages'] ) {
parse_str($_POST['pages'], $itemOrder);
foreach ($itemOrder['page'] as $key => $value) {
$result = mysqli_query( $db_connect, "UPDATE language SET ord = $key WHERE id = $value " );
}
}
Přetahování položek v nette mi funguje, jen se neodesílá ten ajaxový požadavek. Zkusil jsem to poslat přímo na ajax_sort.php (v rootu) a nic. Nejsem schopen poslat požadavek do presenteru. Poradí někdo?
- CZechBoY
- Člen | 3608
ten ajax_sort.php mas ve www slozce?
Jinak url vygeneruj pres Nette/Latte
$(„#list_of_tasks“).sortable({
update: function (event, ui) {
$.post({plink Muj:akce}, { type: „orderPages“, pages: $(‚#list_of_tasks‘).sortable(‚serialize‘) });
}
});
});
odkaz na Muj
Presenter a akci akce
.
- admin@easyweb4u.cz
- Backer | 143
Ano, ajax_sort.php mam ve slozce www. Nicméně, zkusil jsem ten {link Language:default}, a zkousim nejakou reakci na AJAX, a nic (AJAX mi normalne funguje na formularich). Vytvoril jsem handler
public function handleSortable() {
if ($this->isAjax()) {
$this->flashMessage('Succes');
$this->redrawControl('flashesAdmin');
}
}
Jak na nej odkazat?
PS: jsem zacinajici nette lama …)
- admin@easyweb4u.cz
- Backer | 143
No je to trošku složitější (uvnitř jquery) a taky nejdou v latte zanořený makra.
vypadá to (v kódu už je správná url) na: „{$control->link(‚sortable!‘)|noescape}“
ale ten handler se se stejně nepohne…
- admin@easyweb4u.cz
- Backer | 143
Tak jsem na to přišel (fujtajfl …)
<script>
$(document).ready(function () {
$(„#list_of_tasks“).sortable({
update: function (event, ui) {
serial = $(‚#list_of_tasks‘).sortable(‚serialize‘);
$.nette.ajax({
url: „{$control->link(‚sortable!‘)|noescape}“,
type: „post“,
data: serial,
error: function(){
alert(„theres an error with AJAX“);
}
});
}
});
});
</script>
- admin@easyweb4u.cz
- Backer | 143
Signál je v jquery kódu, který je umístěný v latte. A ten handler mám v presenteru. Nevím jak jinak to uspořádat. Pokud nepoužiju noescape, url v kódu má escapovaná lomítka. To řešení výše nepřenáší hodnotu, jenom proběhne ajax. Funkční řešení přenášející hodnotu $pages zde:
<script>
$(document).ready(function () {
$(„#list_of_tasks“).sortable({
update: function (event, ui) {
$.nette.ajax({
url: „{$control->link(‚sortable!‘)|noescape}“,
type: „post“,
data: {‚pages‘: $(‚#list_of_tasks‘).sortable(‚serialize‘)},
error: function(){
alert(„theres an error with AJAX“);
}
});
}
});
});
</script>
- Šaman
- Člen | 2659
Já si to předávám přes data-
atribut, protože JS mám
v samostatném souboru.
Pokud máš ale JS v latte, mělo by stačit jen to makro {link }
.
Pokud máš ale handler v presenteru, použij {plink }
.
Čemu říkáš „nepřenáší hodnotu“? Při volání handleru, nebo ten handler má hodnotu vracet?
- admin@easyweb4u.cz
- Backer | 143
Jquery posílá serializované pole do handleru ($pages), který pak ukládá hodnoty do databáze. Když dám plink, tak do handleru nic nepřijde. Ale to výše uvedené řešení (url: „{$control->link(‚sortable!‘)|noescape}“) funguje.