我正在使用 jQuery Nestable 插件 为网站创建菜单编辑器。 在用户单击菜单项并更改其位置后,我尝试获取项目 ID 和 Children。
问题:我不知道如何获取 ID 和 Children 并更新到数据库中。
这里是 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 == id where menus 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)
...
这是我的表格结构和菜单的图片
最佳答案
要将列表发送到 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 项(id 6)拖到列表中的第 2 位(在 id 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)
关于javascript - 拖放项目并在数据库中更新后,如何在 jQuery Nestable 插件中获取子项和 ID?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31531817/
出于纯粹的兴趣,我很好奇如何按顺序创建PI,而不是在过程结果之后生成数字,而是让数字在过程本身生成时显示。如果是这种情况,那么数字可以自行产生,我可以对以前看到的数字实现垃圾收集,从而创建一个无限系列。结果只是在Pi系列之后每秒生成一个数字。这是我通过互联网筛选的结果:这是流行的计算机友好算法,类机器算法:defarccot(x,unity)xpow=unity/xn=1sign=1sum=0loopdoterm=xpow/nbreakifterm==0sum+=sign*(xpow/n)xpow/=x*xn+=2sign=-signendsumenddefcalc_pi(digits
如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby
我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
exe应该在我打开页面时运行。异步进程需要运行。有什么方法可以在ruby中使用两个参数异步运行exe吗?我已经尝试过ruby命令-system()、exec()但它正在等待过程完成。我需要用参数启动exe,无需等待进程完成是否有任何rubygems会支持我的问题? 最佳答案 您可以使用Process.spawn和Process.wait2:pid=Process.spawn'your.exe','--option'#Later...pid,status=Process.wait2pid您的程序将作为解释器的子进程执行。除
鉴于我有以下迁移:Sequel.migrationdoupdoalter_table:usersdoadd_column:is_admin,:default=>falseend#SequelrunsaDESCRIBEtablestatement,whenthemodelisloaded.#Atthispoint,itdoesnotknowthatusershaveais_adminflag.#Soitfails.@user=User.find(:email=>"admin@fancy-startup.example")@user.is_admin=true@user.save!ende
我正在为一个项目制作一个简单的shell,我希望像在Bash中一样解析参数字符串。foobar"helloworld"fooz应该变成:["foo","bar","helloworld","fooz"]等等。到目前为止,我一直在使用CSV::parse_line,将列分隔符设置为""和.compact输出。问题是我现在必须选择是要支持单引号还是双引号。CSV不支持超过一个分隔符。Python有一个名为shlex的模块:>>>shlex.split("Test'helloworld'foo")['Test','helloworld','foo']>>>shlex.split('Test"
我在我的Rails项目中使用Pow和powifygem。现在我尝试升级我的ruby版本(从1.9.3到2.0.0,我使用RVM)当我切换ruby版本、安装所有gem依赖项时,我通过运行railss并访问localhost:3000确保该应用程序正常运行以前,我通过使用pow访问http://my_app.dev来浏览我的应用程序。升级后,由于错误Bundler::RubyVersionMismatch:YourRubyversionis1.9.3,butyourGemfilespecified2.0.0,此url不起作用我尝试过的:重新创建pow应用程序重启pow服务器更新战俘
我实际上是在尝试使用RVM在我的OSX10.7.5上更新ruby,并在输入以下命令后:rvminstallruby我得到了以下回复:Searchingforbinaryrubies,thismighttakesometime.Checkingrequirementsforosx.Installingrequirementsforosx.Updatingsystem.......Errorrunning'requirements_osx_brew_update_systemruby-2.0.0-p247',pleaseread/Users/username/.rvm/log/138121
我已经像这样安装了一个新的Rails项目:$railsnewsite它执行并到达:bundleinstall但是当它似乎尝试安装依赖项时我得到了这个错误Gem::Ext::BuildError:ERROR:Failedtobuildgemnativeextension./System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/rubyextconf.rbcheckingforlibkern/OSAtomic.h...yescreatingMakefilemake"DESTDIR="cleanmake"DESTDIR="