Иерархическое рекурсивное меню с PHP / MySQL - PullRequest
3 голосов
/ 03 марта 2009

Для некоторых из вас (надеюсь) это будет довольно простой вопрос.

У меня есть рабочее рекурсивное меню из базы данных MySQL, теперь моя главная проблема:

Каков наилучший способ создания URL? Я бы предпочел ввести название каждой строки, как / яйца / молоко / бекон /. Яйца уровня 0, такие как: яйца-0, молоко-1, бекон-2. Любые идеи о том, как динамически выводить это?

Я в значительной степени собираюсь сказать, что "Клет" сказал несколько комментариев по этому вопросу: PHP / MySQL - построение иерархии меню навигации

Но мне нужно немного больше объяснений о том, как это сделать.

Ответы [ 3 ]

4 голосов
/ 04 марта 2009

Ну, если вам нужна иерархия, лучший из известных мне методов называется «Модифицированный обход дерева предзаказов», который подробно описан в этой статье Sitepoint , начинается примерно на полпути.

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

2 голосов
/ 04 марта 2009

Если вы не планируете часто изменять дерево меню, предварительное сохранение необходимого иерархического URL-адреса для каждого пункта меню, вероятно, является самым простым (для разрешения во время выполнения).

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

 id | name   | parent
----+--------+-------
 0  | eggs   | NULL
 1  | milk   | 0
 2  | bacon  | 1
 3  | tomato | 0
 4  | lettuce| 1

foreach (query("SELECT * FROM menu ORDER BY parent ASC") as $row) {
  $menuitem = array_merge(array(), $row);
  $menuLookup[$menuitem['id']] &= $menuitem;
  if ($menuitem['parent'] == null) {
    $menuitem['path'] = "/" . $menuitem['name'];
    $menu[] &= $menuitem[];
  } else {
    $parent &= $menuLookup[$menuitem['parent']];
    $menuitem['path'] = $parent['path'] . "/" . $menuitem['name'];
    $parent['menu'][] &= $menuitem;
  }
}

Я не отлаживал этот код, только проверял его на корректность; -)

0 голосов
/ 30 ноября 2009
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...