2009-05-07 4 views
4

Ich verwende die jQuery-Bibliothek, um eine geordnete Liste mit der Möglichkeit zu haben, Elemente mit Drag & Drop neu zu ordnen. Ich möchte die Informationen der Bestellung an die Datenbank senden und beim nächsten Aktualisieren der Seite (oder laden Sie sie auf einem anderen Browser/Computer) würde es Ihre Bestellung haben.Speichern der Reihenfolge einer Liste (php/zend/jquery)

Ich habe eine Tabelle für jedes Element der Liste in mySQL und im Moment bestelle ich durch die creation_date. Also, was ist die beste Lösung und wo (und wie) speichere ich die Bestellung?

Antwort

2

Ich nehme an, Sie fügen der Tabelle ein Auftragsfeld hinzu, so dass Sie die Informationen jedes Mal mit einem AJAX-Aufruf aktualisieren, wenn Sie einen Drag & Drop durchführen. Mit jQuery ist es sehr einfach :-)

+0

ja aber dann würde ich die Reihenfolge für alle Elemente jedes Mal neu berechnen müssen, ich bin mir nicht sicher, dass ich das tun möchte – DFectuoso

+0

müssen Sie die Reihenfolge jedes Mal aktualisieren, wenn Sie eine Drag & Drop-Änderung vornehmen. Wann immer Sie die Webseite erneut laden (auf jedem Computer), werden Sie sie über das neue Bestellfeld bestellen. Die Sache ist, dass Sie es nicht in einem Cookie speichern können, weil es etwas permanent – fesja

+0

ist Ich weiß, dass ich etwas in der db speichern muss, aber ich könnte die Reihenfolge aller Liste (Komma getrennt) in einer anderen Tabelle und wann auch immer php lädt diese Werte einfach mit der Reihenfolge der Liste, aber ich möchte wissen, ob jemand eine andere Idee hat – DFectuoso

2

Dfectuoso, wenn Sie richtige Datenbank-Indizes haben, sollten Sie mit der Datenbank sortieren und speichern Sie die Reihenfolge in einer separaten Tabelle, Datei auf der Festplatte, memcached - nehmen Sie Ihre beste Wahl.

Der Grund, warum ich mit dieser Lösung gehen würde, ist, dass, wenn Ihr Datensatz größer wird, Ihr Neuanordnungs-/Wiedereinfügungsalgorithmus möglicherweise sehr lange dauern würde und Sie alle Ihre Artikel neu anordnen müssten.

Wenn Sie die Datenbank die Bestellung behandeln lassen, können Sie nur einen kleinen Teil der Elemente anfordern, und die DB wird einen Index verwenden und müsste nicht alles neu anordnen, was im Idealfall sehr schnell ist.

Andernfalls können Sie diese Daten in einem beliebigen Format speichern - serialisieren Sie das PHP-Objekt und speichern Sie es auf der Festplatte, wenn Sie das möchten.

2

ich über dieses Problem nachzudenken, und die Lösung kam ich eine Dezimalzahl als Auftrag mit und die Anzahl der Artikel ändern

Order Item 
----- ---- 
1  Original Item 1 
2  Original Item 2 
3  Original Item 3 
4  Original Item 4 
5  Original Item 5 

für eine Zahl zwischen den nächsten und dem vorhergehenden Punkt ändern wenn Sie das Element 4 in die zweite Position zu ändern, erhalten Sie:

Order Item 
----- ---- 
1  Original Item 1 
1.5  Original Item 4 
2  Original Item 2 
3  Original Item 3 
5  Original Item 5 

wenn Sie das Element 3 in die dritte Position zu ändern, erhalten Sie:

Order Item 
----- ---- 
1  Original Item 1 
1.5  Original Item 4 
1.75  Original Item 3 
2  Original Item 2 
5  Original Item 5 

Theoretisch gibt es immer eine Dezimalstelle zwischen zwei Dezimalstellen, aber Sie könnten sich einigen Speichergrenzen stellen.

Was denken Sie (Stapler) über diese Lösung?

4

Hier ist eine Lösung von der Spitze meines Kopfes. Es ist ungeprüft, aber sollte Sie in die richtige Richtung weisen. Haben Sie in der Tabelle, die Sie sortieren möchten, eine INT-Spalte 'Bestellung'.

Das HTML/Javascript (jQuery-ui)

<!-- This is the list of items where the item's data base id is in the element 
id, i.e. id="item-DATABASE_ID". These items can be displayed with PHP by 
SELECTing them from the database using ORDER BY order ASC --> 
<ul id="sortable"> 
    <li id="item-1">Foo</li> 
    <li id="item-2">Bar</li> 
    <li id="item-3">Baz</li> 
</ul> 

<script type="text/javascript"> 
$(function() { 
    // This turns the list into a jquery UI sortable list 
    $("#sortable").sortable({ 
     // This even fires whenever the list is changed 
     change: function(event, ui) { 
      // This sends the list data to an AJAX handler 
      $.post({ 
       url: 'path_to_ajax_handler.php', 
       // The serialize function transforms the list information 
       // into a query string i.e.: item[]=1&item[]=2&item[]=3 
       data: $('#sortable').sortable("serialize") 
      }); 
     } 
    }); 
}); 
</script> 

Die PHP

<?php 
// The IDs of the items to be sorted are passed to the AJAX handler in the order 
// they are listed in the page 
if (isset($_POST['item'])) 
{ 
    $items = (array)$_POST['item']; 

    // This updates all the items in the table with the correct order 
    for ($x = 0; $x < count($items); $x++) 
    { 
     $query = "UPDATE * FROM orderable_things SET order = $x WHERE id = ".$items[$x]; 
     mysql_query($query); 
    } 
} 
+0

Aber Sie aktualisieren alle Elemente, wenn nur einer ändert, nicht optimal IMO –

+0

Ja, aber in den meisten Fällen ist dies kein Problem. Natürlich, wenn Sie mit einer HA-Anwendung zu tun haben, müssen Sie einen anderen Ansatz verwenden, aber ich stelle mir vor, meine Lösung würde in einer überwältigenden Anzahl von Szenarien ausreichen. – pifantastic

0

ich etwas ähnliches wie Zendesk tun würde.

Sie klicken auf die Schaltfläche "Bestellung bearbeiten", und wenn Sie fertig sind, sagen Sie "Save Order" oder etwas in diesem Sinne. Dies können Ajax-Aufrufe sein, um sie brauchbarer zu machen, sie können aber auch Seitenaktualisierungen sein, die eine angemessene Herabwürdigung ermöglichen.

So wäre es etwas, was wie:

<ul> 
<li><input type="hidden" name="item1" value="1" />Item 1</li> 
<li><input type="hidden" name="item2" value="2" />Item 2</li> 
<li><input type="hidden" name="item3" value="3" />Item 3</li> 
<li><input type="hidden" name="item4" value="4" />Item 4</li> 
</ul> 

Wenn Sie die Einzelteile bewegen, dies den Wert des verborgenen Feldes ändern würde. Wenn Sie dies für Sie veröffentlichen, könnten Sie diese Werte in einer update-Anweisung verwenden und nur einen Anruf tätigen. Etwas wie:

UPDATE `things` SET `order` = $value WHERE `name` = $name; 

Es könnte in diesem Fall nicht effizient sein, da es würde 4 SQL-Anweisungen sein, obwohl es vielleicht eine andere Möglichkeit, dies zu lösen.

Ich denke der Hauptvorteil ist, dass Sie immer eine logische Reihenfolge von 1,2,3,4 anstelle von allem anderen haben würden, wenn Ihr JavaScript gut geschrieben ist.

Verwandte Themen