jQuery sortable php i mysql
W artykule pokażę kompleksowo (zarówno po stronie klienta jak i serwera) jak stworzyć za pomocą jquery UI sortable
sortowalną listę elementów metodą drag and drop.
CREATE TABLE elements ( id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, name VARCHAR(100) NOT NULL, position INT UNSIGNED NOT NULL );Teraz czas na bardzo prostą implementację w php. Zanim do tego przejdziemy trzeba wypełnić tabelę w bazie jakimiś danymi. Pobieramy z bazy danych elementy z tabeli i wyświetlamy je w liście nieuporządkowanej. Wszystko jest zawarte w formularzu. W każdym elemencie li umieszczamy ukrytego inputa, aby przekazać za jego pomocą do skryptu id elementu.
$con = mysql_connect('localhost', 'user', 'pass');
$db = mysql_select_db('dbname', $con);
<form method="post" action="<?php echo $_SERVER['PHP_SELF']?>">
<ul id="list">
<?php
$result = mysql_query("SELECT id, name, position FROM elements ORDER BY position");
while ($row = mysql_fetch_assoc($result))
{
echo '<li><input type="hidden" name="element[]" value="'.$row['id'].'" />'.$row['name'] .'</li>';
}
?>
</ul>
</form>
Będziemy przechwytywać tablicę $_POST['element'], w której będzie zapisana kolejność elementów. Następnie
dokonujemy aktualizacji w bazie danych. Implementacja mechanizmu drag and drop do jedna linijka w jquery.
$('#list').sortable();
W zdarzeniu update jquery sortable wysyłamy ajaxowo dane z formularza. Dzięki temu update do bazy idzie automatycznie
gdy zmieniamy kolejność elementów listy.
Pełny kod poniżej:
<?php
$link = mysql_connect('localhost', 'user', 'pass');
$db = mysql_select_db('dbname', $link);
if ($_POST) {
$i=1;
foreach ($_POST['element'] as $id) {
$result = mysql_query("UPDATE elements SET position=".$i." WHERE id=". mysql_real_escape_string($id));
$i++;
}
}
?>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="jquery-ui.js"></script>
<script type="text/javascript">
$(document).ready(function(){
$('#list').sortable({
update: function(event, ui) {
$.ajax({
url: '/',
data: $("form").serialize(),
type: 'POST',
success: function()
{
//kod dla sukcesu
}
});
}
});
});
</script>
<form method="POST" action="<?php echo $_SERVER['PHP_SELF']?>">
<ul id="list">
<?php
$result = mysql_query("SELECT id, name, position FROM elements ORDER BY position");
while ($row = mysql_fetch_assoc($result))
{
echo '<li><input type="hidden" name="element[]" value="'.$row['id'].'" />'.$row['name'].'</li>';
}
?>
</ul>
</form>
