Často je zapotřebí umožnit uživatelům intuitivním rychlým způsobem měnit pořadí obrázků, produktů, resp. jakýchkoliv datových položek. Řešením je třídění přetažením myší. Nejjednodušší způsob, jak vizuální třídění zajistit, je využít jQuery UI a data zasílat jQuery metodou post().
Z následující ukázky je patrné, že při přetažení boxu dojde k update a následně je volána funkce post(). Nezbytná je serializace, jejímž výstupem je pole pages zpracované (po předání skriptu ajax-sort.php) funkcí parse_str(). Posledním krokem je zpracování předaných dat, nejlépe cyklem foreach a uložením do databáze.
ajax-sort.php
1 2 3 4 5 6 |
if( $_POST['pages'] ) { parse_str($_POST['pages'], $itemOrder); foreach ($itemOrder['page'] as $key => $value) { $dtz = mysqli_query( $conn, "UPDATE erp_checklist SET priorita = $key WHERE id = $value " ); } } |
index.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
<html> <head> <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script> <link rel="stylesheet" href="https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.4/themes/smoothness/jquery-ui.css"> <script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.4/jquery-ui.min.js"></script> <style> .datablock { padding: 15px; border: 1px solid green; } ul { list-style-type: none; } </style> <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> </head> <body> <ul id="list_of_tasks" class="ui-sortable"> <li id="page_1"> <div class="datablock"> Datablock 1 </div></li> <li id="page_2"> <div class="datablock"> Datablock 2 </div></li> </ul> </body> </html> |
Při použití výše uvedeného postupu je nutné dávat pozor na selektor: $(„#list_of_tasks) … id=“list_of_tasks“.
Identifikátory můžete vložit do <li> např. takto: page_<?php echo $id ?>.
Avšak pozor! Pokud chcete měnit pořadí vyšších desítek, stovek nebo tisíců záznamů, doporučuji skripty trochu vylepšit a sice tak,
aby se neprováděly stovky nebo dokonce tisíce volání databáze, ale pouze jedno zavolání, i když bude trochu složitější.
Databázi byste jinak velmi snadno přetížili, což by výrazně zpomalilo načítání stránek.
ajax-sort.php (verze 2)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
<?php if( $_POST['pages'] ) { parse_str($_POST['pages'], $itemOrder); // Řádky v tabulce produkty vybíráme pomocí IN() // CASE použijeme pro nastavení nové hodnoty poradi /* UPDATE produkty SET poradi = CASE id WHEN 20 THEN 1 WHEN 30 THEN 2 WHEN 5 THEN 3 END CASE WHERE id IN (20, 30, 5) */ $nove_poradi = $itemOrder['page']; $query = "UPDATE produkty SET poradi = (CASE id "; foreach($nove_poradi as $key => $value) { $query .= " WHEN {$value} THEN {$key}"; } $query .= " END CASE) WHERE id IN (" . implode(",", $nove_poradi) . ")"; echo $query; } |
Abychom mohli sledovat co skript dělá, je dobré přidat pár řádků i do volajícího skriptu:
index.php (verze 2)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
<html> <head> <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script> <link rel="stylesheet" href="https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.4/themes/smoothness/jquery-ui.css"> <script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.4/jquery-ui.min.js"></script> <style> .datablock { padding: 15px; border: 1px solid green; } ul { list-style-type: none; } </style> <script> $(document).ready(function(){ $("#list_of_tasks").sortable({ update: function(event, ui) { $.post("ajax_sort.php", { type: "orderPages", pages: $('#list_of_tasks').sortable('serialize') }, function(response) { console.log("Response: "+response); }); } }); }); </script> </head> <body> <ul id="list_of_tasks" class="ui-sortable"> <li id="page_1"> <div class="datablock"> Datablock 1 </div></li> <li id="page_2"> <div class="datablock"> Datablock 2 </div></li> </ul> </body> </html> |
V prohlížeči si přes F12 zapnete konzoli a můžete sledovat, co skript provádí. Zde se bude pouze sestavovat dotaz na databázi,
ovšem v závislosti na množství tříděných položek bude velmi dlouhý. Je to však (jak už jsem naznačil výše) mnohem a mnohem lepší, než provádět tisíce krátkých dotazů.
Dotaz může vypadat například nějak takto: