Implementace modulu sortable

- admin@easyweb4u.cz
 - Backer | 153
 
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 MujPresenter a akci akce.

- admin@easyweb4u.cz
 - Backer | 153
 
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 | 153
 
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 | 153
 
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 | 153
 
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 | 2668
 
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 | 153
 
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.