2016-03-31 5 views
0

Как создать динамическое меню, созданное в базе данных?PHP: создать меню из базы данных SQL Server

Образец таблицы меню:

ID NAME  URL   IDPARENT 
---------------------------------- 
1 Accueil  #Accueil 0   
2 Parcs  #Parcs  0   
3 Allemagne #Allemagne 2   
4 Berlin  #Berlin  3   
5 France  #France  2   
6 Contact  #Contact 0  

Результат должен быть:

<ul> 
<li>Accueil</li> 
<li>Parcs</li> 
    <ul> 
    <li>Allemagne</li> 
     <ul> 
      <li>Berlin</li> 
     </ul> 
    <li>France</li> 
    </ul> 
<li>Contact</li> 
</ul> 

РЕШИТЬ: Мой код:

 <?php 
     //connection to the database 
     $dbhandle = mssql_connect('*****', '*****', '*****') 
      or die("Couldn't connect to Server");  
     //select a database to work with 
     $selected = mssql_select_db("*****", $dbhandle) 
      or die("Couldn't open database"); 
      //declare the SQL statement that will query the database 
     $query = "SELECT * FROM CATEGORIES "; 
     //execute the SQL query and return records 
     $result = mssql_query($query); 
     //display the results 
     while($row = mssql_fetch_array($result)) 
       { 
       // Assign by reference 
       $thisref = &$refs[ $row['ID'] ]; 
       // add the the menu parent 
       $thisref['IDCategoriePere'] = $row['IDCategoriePere']; 
       $thisref['NOM'] = $row['NOM']; 
       $thisref['URL'] = $row['URL']; 
       // if there is no parent id 
       if ($row['IDCategoriePere'] == 0) 
       { 
        $list[ $row['ID'] ] = &$thisref; 
       } 
       else 
       { 
        $refs[ $row['IDCategoriePere'] ]['children'][ $row['ID'] ] = &$thisref; 
       } 
     } 
     function create_menu($arr) 
      { 
       $html = "\n<ul>\n"; 
       foreach ($arr as $key=>$val) 
       { 
        $html .= '<li><a href="'.$val['URL'].'">'.$val['NOM']."</a></li>\n"; 
        if (array_key_exists('children', $val)) 
        { 
         $html .= create_menu($val['children']); 
        } 
       } 
       $html .= "</ul>\n"; 
       return $html; 
      } 
      echo create_menu($list); 
      //close the connection 
     mssql_close($dbhandle); 
     ?> 

Он отлично работает! но когда я попытался поставить CSS (http://cssmenumaker.com/menu/flat-jquery-responsive-menu), раскрывающийся список не показывает :(

Результат с и witout CSS:

<style> 
/* CSS Document */ 
@import url(http://fonts.googleapis.com/css?family=Open+Sans); 
@import url(http://fonts.googleapis.com/css?family=Bree+Serif); 
#container { 
margin: 0 auto; 
} 
nav { 
margin: 50px 0; 
background-color: #E64A19; 
} 
nav ul { 
padding: 0; 
margin: 0; 
list-style: none; 
position: relative; 
} 
nav ul li { 
display:inline-block; 
background-color: #E64A19; 
} 
nav a { 
display:block; 
padding:0 10px; 
color:#FFF; 
font-size:20px; 
line-height: 60px; 
text-decoration:none; 
} 
nav a:hover { 
background-color: #000000; 
} 
/* Hide Dropdowns by Default */ 
nav ul ul { 
display: none; 
position: absolute; 
top: 60px; /* the height of the main nav */ 
} 
/* Display Dropdowns on Hover */ 
nav ul li:hover > ul { 
display:inherit; 
} 
/* Fisrt Tier Dropdown */ 
nav ul ul li { 
width:170px; 
float:none; 
display:list-item; 
position: relative; 
} 
/* Second, Third and more Tiers */ 
nav ul ul ul li { 
position: relative; 
top:-60px; 
left:170px; 
} 
/* Change this in order to change the Dropdown symbol */ 
li > a:after { content: ' +'; } 
li > a:only-child:after { content: ''; } 
</style> 

<!-- WITH PHP --> 
<div id="container"> 
<nav> 
<?php 
     //connection to the database 
     $dbhandle = mssql_connect('*****', '*****', '*****') 
      or die("Couldn't connect to Server");  
     //select a database to work with 
     $selected = mssql_select_db("*****", $dbhandle) 
      or die("Couldn't open database"); 
      //declare the SQL statement that will query the database 
     $query = "SELECT * FROM CATEGORIES "; 
     //execute the SQL query and return records 
     $result = mssql_query($query); 
     //display the results 
     while($row = mssql_fetch_array($result)) 
       { 
       // Assign by reference 
       $thisref = &$refs[ $row['ID'] ]; 
       // add the the menu parent 
       $thisref['IDCategoriePere'] = $row['IDCategoriePere']; 
       $thisref['NOM'] = $row['NOM']; 
       $thisref['URL'] = $row['URL']; 
       // if there is no parent id 
       if ($row['IDCategoriePere'] == 0) 
       { 
        $list[ $row['ID'] ] = &$thisref; 
       } 
       else 
       { 
        $refs[ $row['IDCategoriePere'] ]['children'][ $row['ID'] ] = &$thisref; 
       } 
     } 
     function create_menu($arr) 
      { 
       $html = "\n<ul>\n"; 
       foreach ($arr as $key=>$val) 
       { 
        $html .= '<li><a href="'.$val['URL'].'">'.$val['NOM']."</a></li>\n"; 
        if (array_key_exists('children', $val)) 
        { 
         $html .= create_menu($val['children']); 
        } 
       } 
       $html .= "</ul>\n"; 
       return $html; 
      } 
      echo create_menu($list); 
      //close the connection 
     mssql_close($dbhandle); 
     ?> 
     </nav> 
</div> 

<!-- WITHOUT PHP --> 
<div id="container"> 
<nav> 
    <ul> 
     <li><a href="#">ACCUEIL</a></li> 

     <li><a href="#">PARCS</a> 
     <!-- First Tier Drop Down --> 
     <ul> 
      <li><a href="#">ALLEMAGNE</a> 
      <!-- Second Tier Drop Down --> 
      <ul> 
       <li><a href="#">BERLIN</a></li> 
      </ul> 
      </li> 
      <li><a href="#">FRANCE</a> 
      </li> 
     </ul> 
     </li> 
     <li><a href="#">CONTACT</a></li> 
    </ul> 
</nav> 
</div> 

enter image description here

+0

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

+0

сделано, извините ^^ ' – Senneville

+0

Вы должны сначала отделить страны от городов, так как когда вы в курсе, ваша таблица будет беспорядочной с иерархией и исключением, чтобы правильно извлечь массив для создания вашего меню. – cpugourou

ответ

1

Пожалуйста, дайте за подробный ответ все сведения, такие как ваш тип базы данных, а также запрос или весь ваш код. Также имя столбца NAME - это зарезервированное ключевое слово SQL, поэтому обычно это не очень хорошая идея, но mssql в основном не ANSI, поэтому, возможно, это не интересно :)

Если вы хотите многомерного меню, то вы можете не только распечатать таблицу. Сначала вы должны заказать данные (передать все дочерние элементы родителям), а затем вы можете создать свое меню. Для этого вы обычно используете рекурсивные функции или методы вроде функции create_menu.

<?php 

    $serverName = "serverName\instanceName"; 
    $connectionInfo = array("Database"=>"dbName", "UID"=>"username", "PWD"=>"password"); 
    // connect to sql server 
    $conn = sqlsrv_connect($serverName, $connectionInfo); 
    if($conn === false) { 
     die(print_r(sqlsrv_errors(), true)); 
    } 

    // create an array to hold the references 
    $refs = array(); 

    // create and array to hold the list 
    $list = array(); 

    $tsql = "SELECT ID, IDPARENT, NAME, URL FROM menu_items ORDER BY NAME;" 

    $stmt = sqlsrv_query($conn, $tsql); 
    if($stmt === false) { 
     die(print_r(sqlsrv_errors(), true)); 
    } 
    while($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) 
    { 
     // Assign by reference 
     $thisref = &$refs[ $row['ID'] ]; 

     // add the the menu parent 
     $thisref['IDPARENT'] = $row['IDPARENT']; 
     $thisref['NAME'] = $row['NAME']; 
     $thisref['URL'] = $row['URL']; 

     // if there is no parent id 
     if ($row['IDPARENT'] == 0) 
     { 
      $list[ $row['ID'] ] = &$thisref; 
     } 
     else 
     { 
      $refs[ $row['IDPARENT'] ]['children'][ $row['ID'] ] = &$thisref; 
     } 
    } 
    mssql_close($conn); 

    /** 
    * 
    * Create a HTML menu from an array 
    * 
    * @param array $arr 
    * @param string $list_type 
    * @return string 
    * 
    */ 
    function create_menu($arr) 
    { 
     $html = "\n<ul>\n"; 
     foreach ($arr as $key=>$val) 
     { 
      $html .= '<li><a href="'.$val['URL'].'">'.$val['NAME']."</a>"; 
      if (array_key_exists('children', $val)) 
      { 
       $html .= create_menu($val['children']); 
      } 
      $html .= "</li>\n"; 
     } 
     $html .= "</ul>\n"; 
     return $html; 
    } 

    echo create_menu($list); 
    ?> 
+0

Спасибо! Это сработало ! (небольшая окончательная проблема .. cf вопрос) – Senneville

+0

Приятно слышать. Это, как правило, новый вопрос, и, не смотря на код, как вы называете меню, не легко сказать, почему он не работает. – Pintus

+0

Вопрос uddited, чтобы показать проблему с css. – Senneville

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