也许是扼杀,但我在SO中找不到关于我的问题的帖子。
我有一些菜单项,我想让用户按自定义顺序将它们保存在DB表中。我正在使用jquery UI来让它们以良好的顺序放置项目(在tbody-element上可排序)。我的情况现在确实很简单,但是将来会更加复杂(子菜单,特殊页面,...)。
<table>
<thead>
<tr>
<th>#</th>
<th>Item</th>
<th>ID</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>Title</td>
<td>2</td>
</tr>
<tr>
<td>2</td>
<td>Title</td>
<td>4</td>
</tr>
<tr>
<td>3</td>
<td>Title</td>
<td>6</td>
</tr>
</table>
我的问题: 将项目顺序保存在数据库表中的可能性有哪些?这种可能性有什么缺点?
我正在考虑将其与页面(id)和权重一起保存在数据库表中。 越高,重要性越小(必须对数据库表进行微调)。
CREATE TABLE `pageweight` (
`id` int(11) NOT NULL,
`page` int(11) NOT NULL,
`weight` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
我看到的可能性:
我可以通过选择表体内的表行将其保存在jQuery中。对于每个表行,我都有一个Ajaxrequest ..更新/创建数据库中的行。
我可以使用表单中的隐藏字段。 id / name-attribute可以包含menuitemid,值是权重。 jQuery每次有变化时都可以更新吗?然后在PHP中,我处理每个字段并保存。.
还是还有其他方法?尤其是当它变大时。
答案 0 :(得分:1)
最基本的方法是迭代每一行并将每个单元格组合成一个对象,然后保存到数组中。
function getTableData(tObj){
var keys = [];
$("thead tr th").each(function(i, el){
keys.push($(el).text().trim());
});
var rows = [];
$("tbody tr", tObj).each(function(i, el){
var r = {};
$.each(keys, function(k, v){
if(v == "#"){
r["id"] = parseInt($("td", el).eq(k).text().trim());
} else {
r[v] = $("td", el).eq(k).text().trim();
}
});
rows.push(r);
});
}
var pageWeights = getTableData($("table"));
此功能将读取标题行和创建的键。假设它们是id
,page
和weight
或任何其他值,它将收集它们。然后它将捕获每个正文行的关联数据。如果执行console.log(pageWeights)
,则会看到类似以下内容的
[{
id: 1,
page: "Title",
weight: "2"
},{
id: 2,
page: "Title",
weight: "4"
},{
id: 3,
page: "Title",
weight: "6"
}];
然后您可以将其发布到服务器端脚本:
$.post("savetable.php", {
data: JSON.stringify(pageWeights)
}, function(result){
console.log(result);
});
如果表更复杂,这可能不是最佳解决方案。例如,如果表包含100或1000行,则这可能会创建大量无法通过POST传递的数据,或者可能导致浏览器运行不佳。考虑更改功能:
您可能还想看看使用DataTables库。这可以帮助您完成很多事情。
希望有帮助。
答案 1 :(得分:-2)
我认为将每个设置保存到表中的每个记录是理想的。您的表将比您的实际内容大。因此,您在表设计上浪费了空间和查询时间。 我建议将“用户设置”保存在一个单独的记录中,例如表内的JSON或TEXT格式的记录。加载时间更少。