Сворачиваемая динамическая спецификация через jquery?

#php #jquery #css #sql-server

#php #jquery #css #sql-сервер

Вопрос:

У меня есть страница php, извлекающая данные из хранимой процедуры sql2000, представляющей спецификацию (спецификацию) для продукта. Прямо сейчас он отображается в виде плоской таблицы и отлично работает. Однако, после 3 дней поиска / взлома в Google, я ни за что на свете не могу понять, как преобразовать эти данные в сворачиваемую / расширяемую таблицу с отступом или UL.

Таблица выглядит следующим образом:

  • ИДЕНТИФИКАТОР[<—уникальный]
  • BOM_Level
  • Parent_Item
  • Component_Item
  • Component_qty

BOM_Level — это именно тот уровень спецификации (число от 0 до 12). Я предполагал, что, поскольку это было предусмотрено, это будет просто, поскольку bom_level действительно представляет уровень отступа каждой части, но, увы, это было непросто….

Общая структура выглядит следующим образом, но количество частей и уровней зависит от продукта:

 0 Top Level
 1 - Assembly 1
  2 - part 1 of Assembly 1
  2 - part 2 of Assembly 1
  2 - part 3 of Assembly 1
  2 - part 4 of Assembly 1
 1 - Assembly 2
  2 - Assembly 1 of Assembly 2
   3 - part 1 of Assembly 1 of Assembly 2
   3 - part 2 of Assembly 1 of Assembly 2
   3 - part 3 of Assembly 1 of Assembly 2
  

Я пытался сделать что-то вроде:

  • Если bom_level == previous_bom_level, то создайте li
  • Если уровень спецификации> previous_bom_level, добавьте новый UL и запустите новый li
  • Если уровень спецификации < предыдущий уровень спецификации, завершите предыдущий UL и запустите другой набор li.

При всем сказанном я просто не могу понять, как это сделать. Есть идеи?

Комментарии:

1. У меня такое чувство, что спецификация здесь не обозначает объектную модель браузера…

2. Хороший момент! Обновленный вопрос соответственно

Ответ №1:

Предположим, у вас есть такие данные:

 // plus any additional data per entry
$data = array (
  array (
    'id' => '10',
    'bom_level' => '2',
    'parent_item_no' => '2800CF',
    'comp_item_no' => '2800CF-02',
  ),
  array (
    'id' => '66',
    'bom_level' => '3',
    'parent_item_no' => '2800CF-02',
    'comp_item_no' => '2000CF-12',
  ),
  array (
    'id' => '189',
    'bom_level' => '4',
    'parent_item_no' => '2000CF-12',
    'comp_item_no' => '0578',
  ),
  array (
    'id' => '190',
    'bom_level' => '4',
    'parent_item_no' => '2000CF-12',
    'comp_item_no' => '2000CF-SH11',
  ),
  array (
    'id' => '222',
    'bom_level' => '5',
    'parent_item_no' => '2000CF-SH11',
    'comp_item_no' => '1000',
  ),
  array (
    'id' => '191',
    'bom_level' => '4',
    'parent_item_no' => '2000CF-12',
    'comp_item_no' => '2000CF-SH12',
  ),
  array (
    'id' => '223',
    'bom_level' => '5',
    'parent_item_no' => '2000CF-SH12',
    'comp_item_no' => '1000',
  ),
  array (
    'id' => '67',
    'bom_level' => '3',
    'parent_item_no' => '2800CF-02',
    'comp_item_no' => '2000CF-AG01',
  ),
  array (
    'id' => '192',
    'bom_level' => '4',
    'parent_item_no' => '2000CF-AG01',
    'comp_item_no' => '303025-20',
  ),
  array (
    'id' => '68',
    'bom_level' => '3',
    'parent_item_no' => '2800CF-02',
    'comp_item_no' => '2000CF-PL13',
  ),
  array (
    'id' => '193',
    'bom_level' => '4',
    'parent_item_no' => '2000CF-PL13',
    'comp_item_no' => '0500',
  ),
  array (
    'id' => '69',
    'bom_level' => '3',
    'parent_item_no' => '2800CF-02',
    'comp_item_no' => '2000CF-PL14',
  ),
  array (
    'id' => '194',
    'bom_level' => '4',
    'parent_item_no' => '2000CF-PL14',
    'comp_item_no' => '0187',
  ),
  array (
    'id' => '70',
    'bom_level' => '3',
    'parent_item_no' => '2800CF-02',
    'comp_item_no' => '2000CF-SQ01',
  ),
  array (
    'id' => '195',
    'bom_level' => '4',
    'parent_item_no' => '2000CF-SQ01',
    'comp_item_no' => '050018-20',
  ),
  array (
    'id' => '71',
    'bom_level' => '3',
    'parent_item_no' => '2800CF-02',
    'comp_item_no' => '2000CF-WB06',
  ),
  array (
    'id' => '196',
    'bom_level' => '4',
    'parent_item_no' => '2000CF-WB06',
    'comp_item_no' => '040013-20',
  ),
);
  

Где comp_item_no является уникальным и parent_item_no указывает на его родительский элемент. С parent_item_no=0 корневым узлом.

Вы можете сопоставить это с другой структурой с помощью:

 $map = array();
foreach ($data as $entry) {
  if (!isset($map[$entry['parent_item_no']])) {
    $map[$entry['parent_item_no']] = array();
  }

  $map[$entry['parent_item_no']][] = $entry;
}
  

Который, в свою очередь, может быть рекурсивно пройден, с чем-то вроде этого:

 function helper($children, $map) {
  if (sizeof($children) > 0) {
    echo '<ul>';
    foreach ($children as $parentId => $child) {
      echo '<li>';
      echo $child['comp_item_no'];
      if ($child['comp_item_no'] !== $child['parent_item_no'] amp;amp; isset($map[$child['comp_item_no']])) {
        helper($map[$child['comp_item_no']], $map);
      }
      echo '</li>';
    }
    echo '</ul>';
  }
}

/**
 * note that '2800CF' here is manually choosen
 * because it has the lowest bom_level! In your real
 * code you might want to capture those nodes while
 * restructuring the array (see above)
 */
helper($map['2800CF'], $map); 
  

для создания вложенного ul. Пример (для приведенных выше данных):

  • 2800CF-02
    • 2000CF-12
      • 0578
      • 2000CF-SH11
        • 1000
      • 2000CF-SH12
        • 1000
    • 2000CF-AG01
      • 303025-20
    • 2000CF-PL13
      • 0500
    • 2000CF-PL14
      • 0187
    • 2000CF-SQ01
      • 050018-20
    • 2000CF-WB06
      • 040013-20

Демонстрация: http://codepad.org/FJwX3Z1c

Комментарии:

1. Когда вы говорите «родительский элемент указывает на его родительский элемент», вы имеете в виду, что родительский элемент указывает на его родительский идентификатор? Если это так (что я думаю, что это так) Я не уверен, как экстраполировать это из таблицы, поскольку «parent_ID» недоступен. Только Parent_Item_no (который является номером детали). Я уверен, что это возможно, я просто не знаю, как это сделать. Я пытался что-то подобное, но безрезультатно: if($ parent_item_no == $ oldparent_item_no){$parentid = $oldid;} else {$parentid = $id; $ oldid = $id;}

2. Я должен был добавить некоторые детали: я пытаюсь перебрать результаты ВЫЗОВА и передать эти данные в массив, который соответствует структуре данных, которую вы указали в своем примере массива (id, parentid, component_item_no). Строка кода выше находится в циклах, пытаясь вывести родительский идентификатор, сравнивая parent_item_number с предыдущим parent_item_no .

3. Да, я имел parent в виду идентификатор фактического родителя. Может быть, вы можете добавить некоторые данные, с которыми вы фактически работаете (возможно, используйте var_export или что-то в этом роде), чтобы я мог адаптировать пример кода.

4. Из того, что вы пишете ( "parent_ID" isn't available. Only Parent_Item_no (which is the part number) ), я бы предположил, что вы могли бы просто изменить parent с Parent_Item_no помощью и id с помощью элемента no. Единственное, что требуется, это то, что независимо от того, какой идентификатор вы выберете для записи, он должен быть уникальным.

5. спасибо за вашу помощь до сих пор: вот пример того, как выглядит таблица: codepad.org/xZ2VLAH5