Я знаю, что этот вопрос задавали раньше, но решения для меня не сработали. Я пытаюсь сохранить новый порядок элементов в базе данных.
Я очень упростил его, но это основная идея. У меня есть форма с сортированным списком, встроенным в нее.
<form id="itemlist"> <ul id="itemsort"> <li id="Item_1">Item<input type="hidden" name="itemid[]" value="itemsRowID01"/></li> <li id="Item_2">Item<input type="hidden" name="itemid[]" value="itemsRowID02"/></li> <li id="Item_3">Item<input type="hidden" name="itemid[]" value="itemsRowID03"/></li> <li id="Item_4">Item<input type="hidden" name="itemid[]" value="itemsRowID04"/></li> </ul> </form>
У меня загружен пользовательский интерфейс JQuery и JQuery, а следующий код включает сортируемую функцию списка и отправляет идентификаторы элементов и новый порядок сортировки в php-скрипт. переменная «editor» является общедоступной переменной, которая задана при загрузке, она отлично работает. Сортировка отлично работает, но значение neworder, которое сообщения, похоже, не изменяется при переупорядочении списка.
//sorting feature $("#itemsort").live('hover', function() { $("#itemsort").sortable({ opacity:.5, update : function () { var neworder = $('#itemsort').sortable('serialize'); var inputs = serializePost('#itemlist'); $.post("core/actions.php",{ 'order': editor, 'inputs': inputs, 'neworder': neworder},function(){ alert("Order saved.", 1); }); } }); });
На actions.php …
if(isset($_POST['order'])){ //set a variable for each post $batchid = $_POST['inputs']['itemid']; parse_str($_POST['neworder'], $neworder); //count the number of entries to be ordered $count = count($batchid); //use the count to create an incremental loop for each item to be updated. $i=0; while ($i <= $count) { $query ="UPDATE {$_POST['order']} SET order=$neworder[item][$i] WHERE id=$batchid[$i]"; ++$i; } }
Я не уверен, почему заказ, который я получаю для каждого элемента, не изменится.
Есть идеи?
-L
$("#list").live('hover', function() { $("#list").sortable({ update : function () { var neworder = new Array(); $('#list li').each(function() { //get the id var id = $(this).attr("id"); //create an object var obj = {}; //insert the id into the object obj[] = id; //push the object into the array neworder.push(obj); }); $.post("pagewhereyouuselist.php",{'neworder': neworder},function(data){}); } }); });
Затем в вашем файле PHP или в этом примере "pagewhereyouuselist.php"
$neworderarray = $_POST['neworder']; //loop through the list of ids and update your db foreach($neworderarray as $order=>$id){ //you prob jave a connection already i just added this as an example $con = mysql_connect("host","username","password"); if (!$con){ die('Could not connect: ' . mysql_error()); } mysql_select_db("my_db", $con); mysql_query("UPDATE table SET order = {$order} WHERE id = {$id}"); mysql_close($con); }
который должен это сделать, я не тестировал его, поскольку это пример подключения. фактический сценарий, который я фактически использую, более специфичен для моей программы, это упрощенная версия, чтобы показать концепцию
Попробуй это:
Ваши поля HTML
<form id="itemlist" method="POST"> <ul id="itemsort"> <li id="Item_1">Item 1<input type="hidden" name="itemid[]" value="itemsRowID01"/></li> <li id="Item_2">Item 2<input type="hidden" name="itemid[]" value="itemsRowID02"/></li> <li id="Item_3">Item 3<input type="hidden" name="itemid[]" value="itemsRowID03"/></li> <li id="Item_4">Item 4<input type="hidden" name="itemid[]" value="itemsRowID04"/></li> </ul> </form>
JS для отправки заказа:
$("#itemsort").live( 'hover', function() { $("#itemsort").sortable({ update: function () { var inputs = $('#itemlist').serialize(); $.post("./jq-ui-test.php", inputs, alert("Order saved.") ); } }); });
Порядок сохранения:
if( isset( $_POST['itemid'] ) && is_array( $_POST['itemid'] ) ) { foreach( $_POST['itemid'] as $order => $item ) { $order = intval( $order ); $item_esc = mysql_real_escape_string( $item ); $sql_query = "UPDATE {$_POST['order']} SET order={$order} WHERE id = '{$item_esc}'"; } }
Кроме того, если вы хотите, чтобы начальный порядок начинался с 1 (не от 0), измените $order = intval( $order );
to $order = intval( $order ) + 1;