1

问题:

我的配置页面上有一个嵌套列表,如下所示:

<a id='Save'>Save<a>
<ul id='configuration-list'>
   <li id='e1'>Elem A
      <ul>
          <li id='ey'>Elem Y </li>
          <li id='ex'>Elem X
             <ul><!-- and so on until 5 levels of nesting --></ul>
          </li>
          <li id='ez'>Elem Z </li>
      </ul>
   </li>
   <li id='e45'>
      <ul>
         <!-- more li's and ul's nesting here -->
      </ul>
   </li>
 <!-- even more li's and ul's nesting here -->
   <li id='eN'>
   </li>

</ul>

列表中的每个 li 内部都可以有另一个无序列表,其中包含 li,其中可以包含其他无序列表。

所有列表都是可排序的,使用 jquery ui.sortable 插件。无法通过列表切换项目。

列表中的节点总数超过 1k。

保存配置(保存链接)后,我必须将列表顺序配置(从第一个到最深的节点)发送到服务器,服务器将解析它并将所有元素顺序保存在数据库中。为此,使用了 php。

问题:

解析配置的“最佳”或错误较少的方法是什么,我应该如何将它传递给我的 php 解析器?

是否有一种类似于$('#configuration-list').sortable('serialize')$('#configuration-list').sortable('toArray')生成我的所有结构的 xml、JSON 或类似的方法?ui.sortable 的扩展或其他具有此功能的插件?

提前致谢。

4

3 回答 3

1

不清楚 <li> 是否包含单选/检查/文本框,因此建议可能会有所不同。很久以前(我想是 5-6 年)我遇到过类似的情况,那次我使用了回忆数组结构的名称(如果我没记错的话,太旧的记忆:/)

IE

<input type="text" name="nodes[node1][item1]" />
<input type="text" name="nodes[node1][item2]" />

也许它可以帮助你。

于 2009-03-23T18:39:47.623 回答
0

.sortable('serialize')接受一个可选的第二个参数(或者,serialize()接受一个参数。上帝我讨厌插件 api):

确保 id 属性包含下划线。它们必须采用以下形式: "set_number"例如,具有 id 属性的 3 元素列表, foo_1将序列化为 。您可以使用下划线、等号或连字符来分隔集合和数字。例如or或全部序列化为.foo_5foo_2foo[]=1&foo[]=5&foo[]=2foo=1foo-1foo_1foo[]=1

于 2009-03-23T19:37:47.220 回答
0

当您保存大型嵌套集时,您应该考虑嵌套集模型,它是一种将分层数据存储在平面表中的不同方法,MySQL 或任何其他非 XML 数据库都是如此。NSM 使用左右两个数字来定义集合的范围和其中的所有子项。

一个对我非常有用的链接:http: //mikehillyer.com/articles/managing-hierarchical-data-in-mysql/

在您的 PHP 控制器(或在保存数据之前处理/控制数据的任何地方)中,您可以简单地遍历您的配置。在这种情况下,我更喜欢将数组值用于表单输入,就像其他海报所说的那样。

您应该为此使用表单元素,我更喜欢隐藏字段,将字段名称命名为 node_# ,其中 # 代表子项的父 ID。然后该值必须是当前孩子的 ID。

使用简单的 for 循环遍历“node_#”并从元素值 1 中获取数组值 1。当节点经过时,将具有相同父节点的每个节点的排序顺序增加 1。

样本:

<input type="hidden" name="node_1[]" value="4"/> 
<input type="hidden" name="node_1[]" value="5"/>
<input type="hidden" name="node_1[]" value="6"/>
<input type="hidden" name="node_1[]" value="7"/>

然后节点 4 t/m 7 将作为数组存储在 $_POST["node_1"] 中。

于 2009-11-18T10:41:15.350 回答