Hej
Jeg fik for en del tid siden hjælp til at lave en menu ud fra indholdet i min database på
denne tråd. Siden den gang har jeg ændret en smule på den måde jeg bygger tingene op på og nu skal jeg så til at lave en menu i flere niveauer igen. Koden skal jeg have tilrettet, men da opbygningen af database og tabeller heller ikke længere er den samme, så behøver jeg lidt hjælp til at få koden til at fungere korrekt.
Den originale kode med MySQLi kan i se i linket ovenfor. Dog er jeg begyndt at bruge PDO i stedet, hvilket i sig selv ikke ændrer på hvordan resten af mit script skal fungere. Dog har jeg lavet en ændring som tilsyneladende påvirker den måde hvorpå scriptet reagerer.
Lige nu har jeg rettet koden til så den ser således ud:
- function buildMenu($array) {
- krumo($array);
- $output = '<ul>';
- foreach ($array as $item) {
- $output .= '<li>'.$item['item_title'].($item['children']?buildMenu($item['children']):'').'</li>';
- }
- $output .= '</ul>';
- print $output;
- }
- $tmp = array();
- $query = $db->prepare("SELECT `item_id`, `item_title`, `item_parent`, `item_link`, `item_show` FROM `menu_items` WHERE `menu_id`=1");
- try {
- $query->execute(); //Executes query
-
- $items = $query->fetchAll(PDO::FETCH_ASSOC);
- }
- catch (PDOException $e) {
- addMessage('error', $e->getMessage());
- die($e->getMessage());
- }
- foreach ($items as $item) {
- $tmp[$item['item_id']] = isset($tmp[$item['item_id']]) ? array_merge($tmp[$item['item_id']], $item) : $item;
- $tmp[$item['item_parent']]['children'][] =& $tmp[$item['item_id']];
- }
-
- $root = array($tmp[0]);
-
- buildMenu($root);
Jeg har ændret lidt på min struktur af databasen, således at jeg i den gamle tråd havde både menupunkter og indhold under en tabel. Det har jeg nu lavet om så jeg har en tabel til indhold, en tabel til menuer og en tabel til menupunkter. Der er relationer mellem tabellen til menuer og den til menupunkter, mens den eneste relation mellem tabellen til indhold og den til menupunkter er det link der skal hente det korrekte indhold frem.
Tabellen til indhold (pages)
- `page_id` int(11) NOT NULL AUTO_INCREMENT,
- `page_title` varchar(255) COLLATE utf8_danish_ci NOT NULL,
- `page_content` text COLLATE utf8_danish_ci NOT NULL,
- `page_author` int(11) NOT NULL,
- `page_url` varchar(255) COLLATE utf8_danish_ci NOT NULL,
- `page_alias` varchar(255) COLLATE utf8_danish_ci NOT NULL,
- `page_access` int(11) NOT NULL DEFAULT '0' COMMENT '0=Unpublished, 1=Published, 2=Login required, 3=Admin only',
- `meta_keywords` varchar(512) COLLATE utf8_danish_ci NOT NULL,
- `meta_description` text COLLATE utf8_danish_ci NOT NULL,
- `meta_robots` varchar(255) COLLATE utf8_danish_ci NOT NULL,
- `create_date` date NOT NULL,
- `update_date` date NOT NULL,
- `is_front` int(11) NOT NULL DEFAULT '0',
- PRIMARY KEY (`page_id`)
Tabellen til menuer (menus)
- `menu_id` int(11) NOT NULL AUTO_INCREMENT,
- `menu_name` varchar(255) COLLATE utf8_danish_ci NOT NULL,
- PRIMARY KEY (`menu_id`)
- )
Tabellen til menupunkter (menu_items)
- `item_id` int(11) NOT NULL AUTO_INCREMENT,
- `menu_id` int(11) NOT NULL,
- `item_title` varchar(255) COLLATE utf8_danish_ci NOT NULL,
- `item_parent` int(11) NOT NULL,
- `item_link` varchar(255) COLLATE utf8_danish_ci NOT NULL,
- `item_position` int(11) NOT NULL,
- `item_show` int(11) NOT NULL DEFAULT '1' COMMENT '0=Disabled, 1=Enabled, 2=Logged in, 3=Admin',
- PRIMARY KEY (`item_id`)
- )
Dump fra menu_items:
- INSERT INTO `menu_items` (`item_id`, `menu_id`, `item_title`, `item_parent`, `item_link`, `item_position`, `item_show`) VALUES
- (1, 1, 'Hjem', 0, 'home', 0, 1),
- (2, 1, 'Kompetencer', 0, 'kompetencer', 1, 1),
- (3, 1, 'Login', 0, 'login', 3, 1),
- (4, 1, 'Produkter', 0, 'produkter', 2, 1),
- (5, 1, 'Drupal', 4, 'produkter/drupal', 0, 1),
- (6, 1, 'Prestashop', 4, 'produkter/prestashop', 1, 1);
Dog ser det ud til at jeg har lavet et eller andet forkert da scriptet ikke længere laver tingene i den rigtige rækkefølge. Herunder er det output jeg får fra scriptet. Bemærk at den øverste egentlig er submenu-items til Produkter. I sin oprindelige tilstand og med den gamle struktur af database blev disse punkter placeret under den korrekte parent, men med den nye opbygning af databasen ser det ud som om at noget ikke helt er som det skal være.
- <ul>
- <li>Drupal</li>
- <li>Prestashop</li>
- </ul>
-
- <ul>
- <li>Hjem</li>
- <li>Kompetencer</li>
- <li>Login</li>
- <li>Produkter</li>
- </ul>
Det er sådan set første del af problemet. Næste del bliver så at jeg skal have sat nogle bestemte classes på min <ul>, da jeg anvender Bootstrap og for at den laver en korrekt menu skal der nogle classes på. Det kan jeg med nuværende script ikke gøre da den så vil sætte disse classes på submenuen. Dette er jo ikke meningen. Meningen er at jeg i en separat CSS-fil har ændret på den måde Bootstraps dropdown-menuer virker, således at jeg kan få dem frem når jeg holder musen henover. Dette kræver ikke nogen classes i min HTML.
Jeg har en idé om at jeg kan genbruge den gamle kode og så lave 2 funktioner ud af den. En funktion der laver hele menuen med de korrekte classes til Bootstrap og så en anden funktion der tager sig af submenuer.
Dog mangler jeg lidt hjælp til at finde ud af om jeg kan gøre det hele i en funktion eller om jeg skal dele det i to funktioner hvor den ene funktion kalder den anden.