Как получить детей и идентификатор в плагин jQuery Nestable после перетаскивания элемента и обновления в базе данных?

я использую jQuery Nestable плагин создать редактор меню для сайта.
Я пытался получить предмет Я БЫ а также Дети после того, как пользователь нажимает на пункты меню и меняет их положение.

вопросЯ не знаю, как получить ID и детей и обновить в базе данных.

Вот jQuery Nestable плагин

<script>
$(document).ready(function () {
var updateOutput = function (e) {
var list = e.length ? e : $(e.target), output = list.data('output');
if (window.JSON) {output.val(window.JSON.stringify(list.nestable('serialize')));//, null, 2));
} else {
output.val('JSON browser support required for this demo.');
}
console.log(list.nestable('serialize'));
console.log(window.JSON.stringify(list.nestable('serialize')));
};
$('#nestable').nestable({
group: 1,
maxDepth: 7,
}).on('change', updateOutput);
updateOutput($('#nestable').data('output', $('#nestable-output')));
});
</script>

Вот HTML для меню

<div class="cf nestable-lists">
<div class="dd" id="nestable">
<ol class="dd-list">
<li class="dd-item" data-id="1"> <div class="dd-handle">Item 1 when parent == 0</div> </li>
<li class="dd-item" data-id="44"> <div class="dd-handle"> Item 2 when this parent_id == its id </div>
<ol class="dd-list">
<li class="dd-item" data-id="3"><div class="dd-handle">Item 3</div></li>
<li class="dd-item" data-id="4"><div class="dd-handle">Item 3</div></li>
<li class="dd-item" data-id="5"><div class="dd-handle">Item 3</div></li>
<li class="dd-item" data-id="6"><div class="dd-handle">Item 3</div></li>
</ol>
</li>
</ol>
</div>
</div>

Результат на Приставка

[{"id":1},{"id":44,"children":[{"id":3},{"id":4},{"id":5},{"id":6}]}]

Издание

В моей структуре я хочу обновить меню, когда pARENT_ID == Я бы где меню Я бы и создать уровень пункта меню, но количество M_order. Но я не знаю, чтобы создать эту структуру.

А вот и var_dump ($ this-> input-> post (‘list’));

 1 =>
array (size=1)
'id' => string '2' (length=1)
2 =>
array (size=1)
'id' => string '3' (length=1)
3 =>
array (size=1)
'id' => string '4' (length=1)
4 =>
array (size=1)
'id' => string '5' (length=1)
5 =>
array (size=2)
'id' => string '6' (length=1)
'children' =>
array (size=1)
0 =>
array (size=2)
...

Вот изображения моих Таблица структура и меню

введите описание изображения здесь

29

Решение

Чтобы отправить список в PHP, вы должны изменить свой updateOutput Функция публикации списка через AJAX:

<script>
$(document).ready(function () {
var updateOutput = function (e) {
var list = e.length ? e : $(e.target), output = list.data('output');

$.ajax({
method: "POST",
url: "saveList.php",
data: {
list: list.nestable('serialize')
}
}).fail(function(jqXHR, textStatus, errorThrown){
alert("Unable to save new list order: " + errorThrown);
});
};

$('#nestable').nestable({
group: 1,
maxDepth: 7,
}).on('change', updateOutput);
});
</script>

В PHP вы получите $_POST['list'], который будет выглядеть так, как показано ниже. В этом случае я перетащил 4-й элемент (идентификатор 6) на 2-е место (после идентификатора 3) в списке, поэтому ожидаемый порядок 3, 6, 4, 5:

Array (
[0] => Array (
[id] => 1
)
[1] => Array (
[id] => 44
[children] => Array (
[0] => Array (
[id] => 3
)
[1] => Array (
[id] => 6
)
[2] => Array (
[id] => 4
)
[3] => Array (
[id] => 5
)
)
)
)

Затем вы можете просто перебрать этот массив и соответственно обновить свою базу данных.


редактировать: Чтобы сохранить данные в PHP, вам придется использовать рекурсию для навигации по всем дочерним массивам, которые могут существовать. Я написал простой скрипт, который будет экономить на каждом изменении заказа:

index.php

<?php
require "pdoConnection.php";
$list = getFullListFromDB($conn);
?>

<html>
<head>
<script src="https://code.jquery.com/jquery-1.11.3.min.js"></script>
<script src="https://cdn.rawgit.com/dbushell/Nestable/master/jquery.nestable.js"></script>
<script>
$(document).ready(function () {
var updateOutput = function (e) {
var list = e.length ? e : $(e.target), output = list.data('output');

$.ajax({
method: "POST",
url: "saveList.php",
data: {
list: list.nestable('serialize')
}
}).fail(function(jqXHR, textStatus, errorThrown){
alert("Unable to save new list order: " + errorThrown);
});
};

$('#nestable').nestable({
group: 1,
maxDepth: 7,
}).on('change', updateOutput);
});
</script>
</head>

<body>
<div class="cf nestable-lists">
<div class="dd" id="nestable">
<?php displayList($list); ?>
</div>
</div>
</body>
</html>

<?php
function getFullListFromDB($conn, $parent_id = 0) {
$sql = "SELECT id, parent_id, description
FROM items
WHERE parent_id = :parent_id
ORDER BY m_order
";

$statement = $conn->prepare($sql);
$statement->bindValue(':parent_id', $parent_id, PDO::PARAM_INT);
$statement->execute();

$result = $statement->fetchAll(PDO::FETCH_ASSOC);

foreach($result as &$value) {
$subresult = getFullListFromDB($conn, $value["id"]);

if (count($subresult) > 0) {
$value['children'] = $subresult;
}
}
unset($value);

return $result;
}

function displayList($list) {
?>
<ol class="dd-list">
<?php foreach($list as $item): ?>
<li class="dd-item" data-id="<?php echo $item["id"]; ?>"><div class="dd-handle"><?php echo $item["description"]; ?></div>
<?php if (array_key_exists("children", $item)): ?>
<?php displayList($item["children"]); ?>
<?php endif; ?>
</li>
<?php endforeach; ?>
</ol>
<?php
}
?>

saveList.php

<?php

require "pdoConnection.php";

if ($_POST) {
saveList($conn, $_POST['list']);
exit;
}

function saveList($conn, $list, $parent_id = 0, &$m_order = 0) {
foreach($list as $item) {
$m_order++;

$sql = "UPDATE items
SET
parent_id = :parent_id,
m_order = :m_order
WHERE id = :id
";
$statement = $conn->prepare($sql);
$statement->bindValue(":parent_id", $parent_id, PDO::PARAM_INT);
$statement->bindValue(":id", $item["id"], PDO::PARAM_INT);
$statement->bindValue(":m_order", $m_order, PDO::PARAM_INT);
$statement->execute();

if (array_key_exists("children", $item)) {
saveList($conn, $item["children"], $item["id"], $m_order);
}
}
}

?>

pdoConnection.php

<?php
$server = "myServer"; $database = "DbName"; $username = "myself"; $password = "secret";
$conn = new PDO("sqlsrv:Server=$server;Database=$database", $username, $password);
?>

Определение таблицы (MSSQL)

CREATE TABLE [items](
[id] [int] NOT NULL,
[parent_id] [int] NOT NULL,
[description] [nvarchar](100) NOT NULL,
[m_order] [int] NOT NULL,
CONSTRAINT [PK_items] PRIMARY KEY CLUSTERED ([id] ASC)
) ON [PRIMARY]

INSERT [items] ([id], [parent_id], [description], [m_order]) VALUES (1, 0, N'Item 1', 1)
INSERT [items] ([id], [parent_id], [description], [m_order]) VALUES (2, 0, N'Item 2', 2)
INSERT [items] ([id], [parent_id], [description], [m_order]) VALUES (3, 2, N'Item 3.1', 3)
INSERT [items] ([id], [parent_id], [description], [m_order]) VALUES (4, 2, N'Item 3.2', 4)
INSERT [items] ([id], [parent_id], [description], [m_order]) VALUES (5, 2, N'Item 3.3', 5)
INSERT [items] ([id], [parent_id], [description], [m_order]) VALUES (6, 2, N'Item 3.4', 6)
21

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]