2013-09-14 3 views
-1

надеюсь, что вы можете помочь мнеДинамическое меню и CSS

Я tryning сделать в динамической системе меню

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

<?php 
include '../inc/db_connect.php'; 

// Select all entries from the menu table 
// $result=mysql_query("SELECT id, label, link, parent FROM menu ORDER BY parent, sort, label"); 
// Create a multidimensional array to conatin a list of items and parents 

$sql = <<<SQL 
    SELECT id, label, link, parent, class 
    FROM menu 
    ORDER BY parent, sort, label 
SQL; 

if(!$result = $mysqli->query($sql)){ 
    die('There was an error running the query [' . $db->error . ']'); 
} 



$menu = array(
    'items' => array(), 
    'parents' => array() 
); 

// Builds the array lists with data from the menu table 
while ($items = mysqli_fetch_assoc($result)) 
{ 
// Creates entry into items array with current menu item id ie. $menu['items'][1] 
$menu['items'][$items['id']] = $items; 
// Creates entry into parents array. Parents array contains a list of all items with children 
$menu['parents'][$items['parent']][] = $items['id']; 
} 

// Menu builder function, parentId 0 is the root 
function buildMenu($parent, $menu) 
{ 
$menu = call_user_func(modifymenu, $parent,$menu); 

$html = ""; 
if (isset($menu['parents'][$parent])) 
{ 
    $html .= " 
    <ul>\n"; 

    foreach ($menu['parents'][$parent] as $itemId) 
    { 

     if(!isset($menu['parents'][$itemId])) 
     { 
     $html .= "<li class ='".$menu['items'][$itemId]['class']."'>\n <a href='?p=".$menu['items'][$itemId]['link']."'>".$menu['items'][$itemId]['label']."</a>\n</li> \n"; 
     } 
     if(isset($menu['parents'][$itemId])) 
     { 
     if ($_SESSION['submenu'] == $menu['items'][$itemId]['id']) { 
       $menu['items'][$itemId]['class'] = "active open"; 
      } 
     $html .= " 
     <li class ='submenu ".$menu['items'][$itemId]['class']." '>\n <a href='?p=".$menu['items'][$itemId]['link']."'>".$menu['items'][$itemId]['label']."</a> \n"; 
     $html .= buildMenu($itemId, $menu); 
     $html .= "</li> \n"; 
     } 
    } 
    $html .= "</ul> \n"; 
} 
return $html; 
} 
echo buildMenu(0, $menu); 

function modifymenu ($parent, $menu) { 

$ref = isset($_GET['p']) ? $_GET['p'] : null; 

foreach ($menu['parents'][$parent] as $itemId) 
    { 

     if($ref == $menu['items'][$itemId]['link']) { 
      $menu['items'][$itemId]['class'] = "active"; 

      if (isset($menu['items'][$itemId]['parent'])) { 
      $_SESSION['submenu'] = $menu['items'][$itemId]['parent']; 
      }else{ 
      $_SESSION['submenu'] = ''; 
      } 

      } 
    } 

    return $menu; 

    } 

    function modifyparent ($parent, $menu) { 

$ref = isset($_GET['p']) ? $_GET['p'] : null; 

foreach ($menu['parents'][$parent] as $itemId) 
    { 

     if($ref == $menu['items'][$itemId]['link']) { 
      $menu['items'][$itemId]['class'] = "active"; 
      $_SESSION['submenu'] = $menu['items'][$itemId]['parent']; 
      } 
    } 

    return $menu; 

    } 

Надежда кто-то может остановить ошибку

PS. Im а Нооп на PHP и я это знаю, но там это только один способ получить лучше :)

+0

Вы можете видеть это в прямом эфире http://plaq.dk/classes/sidebar.class.php – PlaQ

+0

Это беспорядок кода. Посмотрите на рекурсивные функции. Поскольку «вам нужно выбрать элемент подменю дважды», как только ваше фактическое меню будет установлено, остальное зависит от CSS, чтобы фактически скрыть/показать подменю. –

+0

Проблема не в CSS, а в моей функции «modifymenu», где она устанавливает «подменю» через сеанс – PlaQ

ответ

0

Я бы с чем-то вроде этого:

//Call all menu items from database into array 
$dbArray = #whatever database code you choose 

Вы можете отделить ссылки верхнего уровня с помощью parent поля в базе данных.

Тогда есть его обрабатывают с помощью рекурсивных функций:

function createMenu($dbArray){ 
    foreach($dbArray as $key => $value){ 
    if($parent=='top') 
    //establish as top link 
     createLink($key); 
    if($parent=='$id') 
    //if parent matches id then add as sub-menu of this top level item 
     createLink($key); 
    }  
} 

function createLink($linkData){ 
    foreach($linkData as $keys => $values){ 
    //add <a> and other per-link items 
    } 
} 

Я понимаю, что это грубый ответ, но, надеюсь, это поможет вам в более простое решение!

Смежные вопросы