sql >> Databasteknik >  >> RDS >> Mysql

PHP/MySQL - bygga en navigeringsmenyhierarki

Hierarkisk data är något irriterande i en relationsdatabas (exklusive Oracle, som har operatorer i START WITH/CONNECT BY att hantera detta). Det finns i princip två modeller :angränsande lista och kapslade uppsättningar.

Du har valt adjacency-set, vilket jag också brukar göra. Det är mycket lättare att ändra än den kapslade uppsättningsmodellen, även om den kapslade uppsättningsmodellen kan hämtas i rätt ordning i en enda fråga. Närliggande listor kan inte vara. Du måste bygga en mellanliggande datastruktur (träd) och sedan konvertera den till en lista.

Vad jag skulle göra (och har gjort nyligen faktiskt) är:

  • välj hela menyinnehållet i en fråga sorterad efter förälder-ID;
  • Bygg ett träd av menystrukturen med hjälp av associativa arrayer eller klasser/objekt;
  • Gå i det trädet för att skapa kapslade oordnade listor; och
  • Använd en jQuery-plugin som Superfish för att göra den listan till en meny.

Du bygger något sånt här:

$menu = array(
  array(
    'name' => 'Home',
    'url' => '/home',
  ),
  array(
    'name' => 'Account',
    'url' => '/account',
    'children' => array(
      'name' => 'Profile',
      'url' => '/account/profile',
    ),
  ),
  // etc
);

och konvertera det till detta:

<ul class="menu">;
  <li><a href="/">Home</a></li>
  <li><a href="/account">Account Services</a>
    <ul>
      <li><a href="/account/profile">Profile</a></li>
...

PHP för att generera menyuppsättningen från är ganska okomplicerad men lite finnickig att lösa. Du använder en rekursiv trädvandringsfunktion som bygger HTML kapslade listuppmärkning men kommer att lämna dess implementering som en övning för läsaren. :)



  1. Anropa en PL SQL-funktion med objektparameter i java

  2. Fast Anrop till odefinierad funktion oci_connect() med XAMPP

  3. Att välja den bästa poängen per spelare

  4. HTML &PHPMySQL, infoga många data i tabellen från textområdet