Implementace modulu sortable

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
admin@easyweb4u.cz
Backer | 143
+
0
-

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
+
0
-

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 | 143
+
0
-

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 …)

Mysteria
Člen | 797
+
0
-

{plink sortable!}

admin@easyweb4u.cz
Backer | 143
+
0
-

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
+
0
-

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>

CZechBoY
Člen | 3608
+
0
-

tak pokud to mas v komponente a signal je taky v komponente tak pouzij makro link. noescape nepouzivej jentak bezhlave…

admin@easyweb4u.cz
Backer | 143
+
0
-

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
+
0
-

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
+
0
-

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.