jQuery Sortable + PHP
Fritz
- jquery
- jquery-ui
- php
Hallo,
könnt ihr hier ein Fehler sehen?
<section class="test-sortable">
<?php $result = $mysqli->query("SELECT * FROM test WHERE rubrik = 1"); ?>
<ul id="test-list">
<?php
$i = 1;
while ($row = $result->fetch_assoc()) {
?>
<li id="listItem_<?php echo $i;?>">
<?php echo htmlspecialchars($row["bezeichnung"] . " - " . $row["sort"])?>
</li>
<?php $i++; } ?>
</ul>
</section>
$(document).ready(function(){
$( "#test-list" ).sortable({
handle : '.handle',
update : function () {
var order = $('#test-list').sortable('serialize');
$("#info").load("process-sortable.php?"+order);
}
});
});
Das Beispiel habe ich von hier: https://gist.github.com/linssen/2773872
Ich möchte damit erreichen dass sich meine Sortierung ändert indem man einfach einen Beitrag an eine andere Stelle schiebt.
Das PHP im Hintergrund:
foreach ($_GET['listItem'] as $position => $item)
{
$sql[] = "UPDATE test SET sort = $position WHERE id = $item";
}
print_r ($sql);
Ok, ich muss es so aufbauen
<li id="listItem_<?php echo $i;?>">
<?php echo htmlspecialchars($row["bezeichnung"] . " - " . $row["sort"])?>
<span class="handle">x</span>
</li>
handle : '.handle' hier wird gesagt mit was er ziehen soll.
Sorry für den weiteren Beitrag, meinen alten kann ich nicht mehr bearbeiten.
Was ich nicht verstehe ist folgendes. Warum erhalte ich nach dem Update in der Spalte -sort- eine 0. Eine 0 kommt in meinem Script nicht vor? Kann ich irgendwie erreichen dass ich mit einer 1 beginne?
<?php $result = $mysqli->query("SELECT * FROM test WHERE rubrik = 1 ORDER by sort ASC"); ?>
<ul id="test-list">
<?php
while ($row = $result->fetch_assoc()) {
?>
<li id="listItem_<?php echo htmlspecialchars($row["id"])?>"><?php echo htmlspecialchars($row["bezeichnung"] . " - Sort: " . $row["sort"])?>
|| <span class="handle" style="cursor: pointer;">xxx</span>
</li>
<?php
}
?>
</ul>
<script>
$(document).ready(function(){
$( "#test-list" ).sortable({
handle : '.handle',
update : function () {
var order = $('#test-list').sortable('serialize');
$("#info").load("process-sortable.php?"+order);
}
});
});
</script>
foreach ($_GET['listItem'] as $position => $item)
{
if ($stmt = $mysqli->prepare("Update test SET sort=? WHERE id = ?"))
{
$sort = $position;
$id = $item;
$stmt->bind_param("ss",
$sort,
$id
);
$stmt->execute();
}}
Und meine letzte Frage kann ich irgendwie erreichen dass ich meine li innerhalb von id="test-list" ziehen kann und nicht ein extra <span> einsetzen muss?
Tach!
Was ich nicht verstehe ist folgendes. Warum erhalte ich nach dem Update in der Spalte -sort- eine 0.
Bitte etwas genauer beschreiben. Welche Operation liefert die 0?
dedlfix.
Hallo,
Bitte etwas genauer beschreiben
Ausgangspunkt, was in meiner Datenbank steht ist folgendes:
INSERT INTO `test` (`id`, `rubrik`, `bezeichnung`, `sort`) VALUES
(1, '1', 'Ich bin zum Start an Position 1', '1'),
(2, '1', 'Ich bin zum Start an Position 2', '2'),
(3, '1', 'Ich bin zum Start an Position 3', '3');
Nachdem ich die Einträge verschoben habe steht folgendes in der Datenbank
INSERT INTO `test` (`id`, `rubrik`, `bezeichnung`, `sort`) VALUES
(1, '1', 'Ich bin zum Start an Position 1', '1'),
(2, '1', 'Ich bin zum Start an Position 2', '0'),
(3, '1', 'Ich bin zum Start an Position 3', '2');
Ich habe den zweiten Eintrag an die erste Position geschoben.
Welche Operation liefert die 0?
Ich denke PHP?
Tach!
Welche Operation liefert die 0?
Ich denke PHP?
Debugging ist der leider oftmals beschwerliche Weg, das genauer herauszufinden. Durch Auf-den-Code-Schauen findet man meist nur die einfachen offensichtlichen Fälle. Vielleicht ist das Array $_GET['listItem'] die Ursache. Hat dieses explizite Keys, oder sind da nur die standardmäßig vergebenen numerischen Werte beginned mit 0 drin?
dedlfix.
Hallo,
Vielleicht ist das Array $_GET['listItem'] die Ursache. Hat dieses explizite Keys, oder sind da nur die standardmäßig vergebenen numerischen Werte beginned mit 0 drin?
Wenn ich mir
var_dump($_GET['listItem']);
ausgeben lasse, erhalte ich dieses
array(3) {
[0]=>
string(1) "2"
[1]=>
string(1) "3"
[2]=>
string(1) "1"
}
Dann gehe ich davon aus, dass es am
standardmäßig vergebenen numerischen Werte
liegt? Kann man dieses irgendwie überschrieben? Ansonsten muss ich eben meine Abfrage etwas anpassen.
Tach!
Dann gehe ich davon aus, dass es am
standardmäßig vergebenen numerischen Werte
liegt? Kann man dieses irgendwie überschrieben?
Manchmal sieht man die einfachsten Dinge nicht ;) Eine 1 dazurechnen.
$sort = $position + 1;
dedlfix.
Hallo,
Manchmal sieht man die einfachsten Dinge nicht ;) Eine 1 dazurechnen.
$sort = $position + 1;
dankeschön, es hat wunderbar funktioniert.
Und meine letzte Frage kann ich irgendwie erreichen dass ich meine li innerhalb von id="test-list" ziehen kann und nicht ein extra <span> einsetzen muss?
Das Problem ist auch behoben. Geht mit dieser Zeile JavaScript Code
$( "#test-list" ).disableSelection();
Nachdem dedlfix das "+1" Problem gelöst hat, möchte ich noch einen Hinweis zum SQL einwerfen.
// Deins, etwas reformatiert foreach ($_GET['listItem'] as $position => $item) { if ($stmt = $mysqli->prepare("Update test SET sort=? WHERE id = ?")) { $sort = $position; $id = $item; $stmt->bind_param("ss", $sort, $id); $stmt->execute(); } }
Gebundene Parameter benutzt man etwas anders. Wenn eine Schleife eingesetzt wird, macht man den prepare nur einmal. Und bind_param bindet eine Referenz auf Variablen an das Statement, d.h. auch das macht man nur einmal und schreibt danach nur noch die Werte in die gebundenen Variablen. Ganz wichtig ist dann am Ende der stmt->close, um Ressourcen und Bindungen wieder freizugeben.
// Mein Vorschlag
if ($stmt = $mysqli->prepare("Update test SET sort=? WHERE id = ?"))
{
$stmt->bind_param("ss", $sort, $id);
foreach ($_GET['listItem'] as $position => $item)
{
$sort = $position;
$id = $item;
$stmt->execute();
}
$stmt->close();
}
Ob man die foreach-Variablen direkt binden kann, weiß ich nicht, das müsste man mal ausprobieren. Es wäre ein netter Platzsparer.
$stmt->bind_param("ss", $position, $item);
foreach ($_GET['listItem'] as $position => $item)
{
$stmt->execute();
}
Rolf