Bir listenin sırasını Tasarruf (php / zend / jquery)

5 Cevap php

Ben sürükle ve bırak ile yeniden sipariş öğeler yeteneği ile sıralı bir liste var jQuery kütüphanesi kullanıyorum. Ben veritabanına düzenin bilgilerini göndermek istediğiniz ve (veya başka bir tarayıcı / bilgisayara yükleyebilirsiniz) sayfayı yenileyin sonraki zaman siparişinizi olurdu.

Ben mySQL listesinin her elemanı için bir tablo var ve şu anda ben creation_date tarafından emrediyorum. Yani en iyi çözüm ve nerede ne olduğunu (ve nasıl) ben sipariş kaydedebilirim?

5 Cevap

İşte benim başın üst kapalı bir çözümdür. Bu denenmemiş ama doğru yönde işaret etmelidir. Sıralamak istediğiniz tabloda bir INT 'sipariş' sütunu.

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>

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);
    }
 }

Ben masaya bir sipariş alan ekleyerek varsayalım, bu yüzden size bir sürükle ve bırak her zaman aramak bir AJAX ile bilgilerinizi güncelleyin. JQuery ile çok kolay olduğunu :-)

Ben bu sorun hakkında düşünüyorum ve ben geldi çözüm düzeni olarak bir ondalık sayı olan ve bir sonraki ve bir önceki öğe arasındaki bir dizi madde değişikliği sayısını değiştirmek

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

Eğer 2. pozisyona 4. madde değiştirirseniz, olsun:

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

Eğer 3üncü pozisyona öğeyi 3 değiştirirseniz, olsun:

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

Teorik olarak orada iki ondalık arasında bir ondalık her zaman, ama bazı depolama sınırları çarptırılabilir.

What do you (stackers) think of this solution?

Eğer uygun db dizinler varsa DFectuoso, veritabanı sıralama ile gitmek ve sadece ayrı bir tablo düzeni saklamak, diskte dosya gerekir, memcached - en iyi al.

Ben bu çözüm ile gitmek istiyorum nedeni veri seti büyük yaparsa, yeniden sıralama / algoritma reinserting potansiyel olarak uzun zaman alacağını ve size tüm öğeleri yeniden sıralamak olurdu olmasıdır.

Eğer db sıralamasını ele izin verirseniz, size öğeleri yalnızca küçük bir bölümünü talep edebilir ve db bir dizin kullanmak ve ideal çok hızlı olan her şeyi, yeniden düzenlemek zorunda değildir.

Aksi takdirde, istediğiniz herhangi bir biçimde bu verileri depolamak için de tercih olabilir - PHP nesneyi serialize ve bu fantezi eğer diskte saklamak.

Ben Zendesk benzer bir şey yapmak istiyorum.

"Düzen Order" diyerek bir düğmesini tıklayın ve işiniz bittiğinde "Kaydet al" ya da bu yönde bir şey söylüyorlar. Bu Ajax onu daha kullanışlı hale getirmek için çağırır, ama aynı zamanda sayfa yenilemeleri olabilir, incelikle aşağılayıcı için izin olabilir.

Yani böyle bir şey olur:

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

When you move the items around, this would change the value of the hidden field. When you post this for you could use those values in an update statement, making one call only. Something like:

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

4 SQL ifadeleri olurdu bu çözmek için başka bir yol var olabilir ancak bu durumda etkili olmayabilir.

Ben ana avantajı JavaScript iyi yazılmış ise her zaman yerine başka bir şey 1,2,3,4 mantıksal bir düzene sahip olacağını düşünüyorum.