2009-05-07 2 views
4

Я использую библиотеку jQuery для упорядоченного списка с возможностью переупорядочивать элементы с помощью перетаскивания. Я хочу отправить информацию о заказе в базу данных, и в следующий раз, когда вы обновите страницу (или загрузите ее на другой браузер/компьютер), у вас будет ваш заказ.Сохранение порядка списка (php/zend/jquery)

У меня есть таблица для каждого элемента списка в mySQL, и сейчас я заказываю creation_date. Итак, какое наилучшее решение и где (и как) я могу сохранить заказ?

ответ

2

Я предполагаю добавить в таблицу поле заказа, так что вы обновляете информацию с помощью вызова AJAX при каждом перетаскивании. С jQuery очень легко :-)

+0

да, но тогда мне придется пересчитывать порядок для всех элементов каждый раз, я не уверен, что хочу сделать это – DFectuoso

+0

, вам придется обновлять заказ каждый раз, когда вы делаете перетаскивание. Всякий раз, когда вы снова загружаете веб-страницу (на каждом компьютере), вы заказываете ее по новому порядку. Дело в том, что вы не можете хранить его в cookie, потому что это что-то постоянное. – fesja

+0

Я знаю, что мне нужно что-то хранить в db, но я мог хранить порядок всего списка (разделенный запятой) в другой таблице и всякий раз, когда php загружает эти значения, просто сортирует их по порядку списка, но я хочу знать, есть ли у кого-то другая идея. – DFectuoso

2

DFectuoso, если у вас есть надлежащие индексы db, вы должны пойти с сортировкой базы данных и просто сохранить заказ в отдельной таблице, файл на диске, memcached - возьмите свой лучший выбор.

Причина, по которой я пойду с этим решением, состоит в том, что если набор данных будет больше, ваш алгоритм переупорядочения/повторного ввода потенциально займет много времени, и вам придется переупорядочить все ваши элементы.

Если вы дадите дескриптору db упорядочение, вы можете запросить только небольшую часть предметов, а db будет использовать индекс и не нужно будет переупорядочивать все, что в идеале очень быстро.

В противном случае вы можете выбрать для хранения этих данных в любом формате, который вы хотите - сериализуете объект PHP и храните его на диске, если вам это нравится.

2

Я думаю об этой проблеме, и решение, которое я придумал оказывает десятичное число как порядок и изменить количество изменений элемента для ряда между следующим и предыдущим элементом

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

Если вы измените пункт 4 на 2-й позиции, вы получите:

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

Если вы измените пункт 3 на 3-й позиции, вы получите:

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

Теоретически всегда существует десятичный знак между двумя десятичными знаками, но вы можете столкнуться с некоторыми ограничениями на хранение.

Что вы (укладчики) думаете об этом решении?

4

Вот решение от верхней части головы. Он непроверен, но должен указывать вам в правильном направлении. Введите столбец «порядок заказа» в таблице, которую вы хотите отсортировать.

HTML/JavaScript (JQuery-щ)

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

Но вы обновляете ВСЕ элементы, когда изменяется только один, а не оптимальный IMO –

+0

Да, но в большинстве случаев это не проблема. Очевидно, что если вы имеете дело с HA-приложением, вам нужно будет использовать другой подход, но я полагаю, что мое решение будет достаточным в подавляющем числе сценариев. – pifantastic

0

Я хотел бы сделать что-то похожее на Zendesk.

Вы нажимаете кнопку «Изменить порядок», и когда вы закончите, скажите «Сохранить заказ» или что-то в этом роде. Это могут быть призывы Ajax, чтобы сделать его более удобным для использования, но также могут обновлять страницы, что позволяет грациозно разлагаться.

Так что будет какая-то вещь, как:

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

При перемещении предметов вокруг, это изменило бы значение скрытого поля. Когда вы публикуете это, вы можете использовать эти значения в инструкции обновления, делая только один вызов. Что-то вроде:

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

Это не может быть эффективным в этом случае было бы 4 заявления SQL, хотя там может быть другой способ решения этой проблемы.

Я думаю, что главное преимущество в том, что у вас всегда будет логический порядок 1,2,3,4 вместо всего остального, если ваш JavaScript хорошо написан.

Смежные вопросы