Вот что бы я сделал, и это, конечно, не самый чистый способ, но он должен работать.
Предполагается, что вы работаете со своими собственными страницами, а не с сценарием, в котором вы получаете страницу html через http-запрос на какой-либо внешний сайт (например, через CURL) и нуждаетесь в его анализе. DOMDocument отлично подходит для последнего случая. Это решение для первого, поскольку я предполагаю, что, поскольку вы работаете с javascript на стороне клиента, это, вероятно, ваша собственная страница (если вы не введете этот javascript на страницу после ее загрузки).
Прежде всего, внутри каждого элемента списка я бы включил доступный входной тег на стороне сервера. Он будет отслеживать позицию и значение и передавать его на серверный скрипт при отправке формы.
<form method="POST">
<ul id="sortable">
<li class="ui-state-default">1
<input id="the_list_item_1" name="the_list_item[]" type="text" value="1_0" style="display: none;">
</li>
...
</ul>
</form>
Значение фактическое значение этого элемента (пример имел их в диапазоне 1 - 12), и это положение разделенных подчеркивания (значение + «_» + позиция);
Список должен находиться внутри переменной формы, если вам нужно отправить список на сервер для обработки, когда пользователь выполнен. Однако, если вы намерены использовать Ajax для получения этих данных на сервере, это решение не обязательно (так как вы просто просто используете jquery для получения каждой пары позиций и значений и отправляете их непосредственно в свой вызов ajax).
Вам нужно будет обрабатывать эти входные теги, когда пользователь перетаскивает элементы и изменяет порядок списка. См. here, если вам нужно знать, как работать с сортируемыми событиями. Возможно, на обновление, для каждого элемента списка вызвать эту функцию с новым положением:
function update_pos(value,pos)
{
$("#the_list_item_"+value).val(value+"_"+pos);
}
Так на подчиненной формы, мы теперь на стороне PHP.
$list_items = $_POST["the_list_item"]; // This is basically an array of all the list_items, thanks to naming all the list items with "the_list_item[]", note the empty subscript (square braces).
$ordered_list_items = array(); // Let's push them into an associative array.
foreach($list_items as $li)
{
$li_split = explode("_",$li);
if(count($li_split) <= 0)
continue; // maybe you'd want to handle this situation differently, it really shouldn't happen at all though. Here, I'm just ignoring nonsensical values.
$item_id = $li_split[0];
$pos = $li_split[1];
$ordered_list_items[$item_id] = $pos;
}
// Then later you can shoot through this list and do whatever with them.
foreach($ordered_list_items as $item_id => $pos)
{
// postgres perhaps. Insert if not already there, update regardless.
pg_query("insert into the_list_item (item_id,position) select '$item_id','$pos' where '$item_id' not in (select item_id from the_list_item where '$item_id' = item_id limit 1));
pg_query("update the_list_item set position = '$pos' where item_id = '$item_id'");
}
Конечно, все, что было сказано, в зависимости от ваших потребностей, возможно, потребуется перегрузить эти данные на страницу. Итак, зацикливаясь на результатах вашего db (возможно, для этого пользователя), вы должны вывести каждый list_item на место.
$list_items = pg_fetch_all(pg_query($sql)); // $sql needs to be the query to get the results. Probably should order by position ascending.
$lic = count($list_items);
?>
<html> and stuff
<form method="POST">
<ul id="sortable">
<?php
for($i = 0; $i < $lic; $i++)
{
$li = $list_items[$i];
echo "<li class=\"ui-state-default\">".$li["item_id"]."<input id=\"the_list_item_".$li["item_id"]."\" name=\"the_list_item[]\" type=\"text\" value=\"".$li["item_id"]."_".$li["position"]."\" style=\"display: none;\"></li>";
}
?>
</ul>
</form>
Если вы сохраняете способ сортировки, почему бы не использовать что-то вроде 'data-index'? Вы можете изменить значение по мере их изменения с помощью '.data()' jQuery, сохранить его целочисленное значение, а затем, когда вы вытащите из БД для создания списка в будущих загрузках страницы, вы можете «ЗАКАЗАТЬ» этот элемент, чтобы порядок списка остается. – PlantTheIdea
То, как они сортируются, я считаю неуместным, потому что это изменило бы DOM перед обработкой PHP, я не уверен. Я просто ищу способ доступа к неупорядоченному списку в элементе PHP по элементу для хранения каждого в переменной. – user1628206
@ user1628206: Если один из ответов помог вам решить вашу проблему, отметьте ее как «принятую», поэтому пользователи, столкнувшиеся с подобной проблемой в будущем, смогут легко ее обнаружить. – gkalpak