Сохранять вложенный сортируемый список jquery в html? - PullRequest
1 голос
/ 23 марта 2009

Проблема:

У меня есть вложенный список на странице конфигурации, который выглядит следующим образом:

<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. Элементы не могут быть переключены через список.

Общее количество узлов в списке превышает 1 тыс.

Когда конфигурация сохранена (ссылка Сохранить), я должен отправить конфигурацию порядка списка (сначала сформировать самый глубокий узел) на сервер, который проанализирует ее и сохранит порядок всех элементов в базе данных. Для этого используется php.

Вопросы:

Каков «лучший» или менее неправильный способ анализа конфигурации и как я должен передать ее в мой php-парсер?

Есть ли метод, аналогичный $('#configuration-list').sortable('serialize') или $('#configuration-list').sortable('toArray'), который генерирует мне XML, JSON или аналогичный со всей структурой? Расширение ui.sortable или другого плагина с такой функциональностью?

Заранее спасибо.

Ответы [ 3 ]

1 голос
/ 23 марта 2009

Непонятно, если

содержит радио / чеки / текстовые поля, поэтому предложение может отличаться. Много лет назад (я думаю, 5-6 лет) я сталкивался с подобной ситуацией, и тогда я использовал имена, напоминающие структуры массива (если я правильно помню, слишком старые воспоминания: /)

* 1004 Т.е. *

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

Может быть, это может вам помочь.

0 голосов
/ 18 ноября 2009

Когда вы сохраняете большие вложенные наборы, вы должны учитывать модель вложенного набора, это другой подход для хранения иерархических данных в плоской таблице, как MySQL или любая другая база данных не XML. NSM работает с двумя числами, левым и правым для определения диапазона набора и всех дочерних элементов в нем.

Ссылка, которая была очень полезна для меня: http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/

В вашем контроллере PHP (или там, где вы обрабатываете / управляете своими данными перед их сохранением) вы можете просто перебирать свои конфигурации. В этом случае я предпочитаю использовать значения массива для forminputs, как и в других постерах.

Для этого вы должны использовать элемент формы, я предпочитаю скрытые поля, присваивайте имени поля что-то вроде node_ #, где # представляет идентификатор-родителя для ребенка. И тогда значение должно быть идентификатором текущего потомка.

Используйте простой цикл 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 т / м 7 будут храниться в виде массива в $ _POST ["node_1"].

0 голосов
/ 23 марта 2009

.sortable('serialize') принимает необязательный второй параметр (или, serialize() принимает один параметр. Боже, я ненавижу API плагина):

убедитесь, что атрибуты id включают нижнее подчеркивание. Они должны быть в форме: "set_number" Например, 3 элемента список с атрибутами id foo_1, foo_5, foo_2 будет сериализован в foo[]=1&foo[]=5&foo[]=2. Ты можешь использовать знак подчеркивания, знак равенства или дефис отделить набор и номер. За пример foo=1 или foo-1 или foo_1 все сериализовать до foo[]=1.

...