2010-05-25 112 views
0

我正在嘗試在PHP中顯示我正在處理的網站的遞歸列表。php遞歸列表幫助

我真的很難嘗試獲得第二級顯示。我有一個功能,顯示內容到頁面如下。

function get_menu_entries($content,$which=0) 
{ 
    global $tbl_prefix, $sys_explorer_vars, $sys_config_vars; 

    // INIT LIBRARIES 
    $db = new DB_Tpl(); 
    $curr_time = time(); 
    $db->query("SELECT * FROM ".$tbl_prefix."sys_explorer WHERE preid = '".$which."' && config_id = '".$sys_explorer_vars['config_id']."' && blocked = '0' && startdate < '".$curr_time."' && (enddate > '".$curr_time."' || enddate = '') ORDER BY preid,sorting"); 

    while($db->next_record()){ 
     $indent = $db->f("level") * 10 - 10; 

     $sitemap_vars['break'] = ""; 
     $sitemap_vars['bold'] = ""; 

     if($db->f("level") == 2) { 
      $sitemap_vars['ul_start'] = ""; 
      $sitemap_vars['bold'] = "class='bold'"; 
      $sitemap_vars['ul_end'] = ""; 
     } 

     switch($db->f("link_type")) 
     { 
      case '1': // External Url 
       $sitemap_vars['hyperlink'] = $db->f("link_url"); 
       $sitemap_vars['target'] = ""; 
       if($db->f("link_target") != "") { 
        $sitemap_vars['target'] = "target=\"".$db->f("link_target")."\""; 
       } 
      break; 

      case '2': // Shortcut 
       $sitemap_vars['hyperlink'] = create_url($db->f("link_eid"),$db->f("name"),$sys_config_vars['mod_rewrite']); 
       $sitemap_vars['target'] = ""; 
      break; 

      default: 
       $sitemap_vars['hyperlink'] = create_url($db->f("eid"),$db->f("name"),$sys_config_vars['mod_rewrite']); 
       $sitemap_vars['target'] = ""; 
      break; 
     } 

     if($db->f("level") > 1) { 
      $content .= "<div style=\"text-indent: ".$indent."px;\" ".$sitemap_vars['bold']."><a href=\"".$sitemap_vars['hyperlink']."\" ".$sitemap_vars['target'].">".$db->f("name")."</a></div>\n"; 
     } 

     $content = get_menu_entries($content,$db->f("eid")); 
    } 
    return(''.$content.''); 
} 

目前內容顯示正常,但是我想把這個功能變成一個DHTML下拉菜單。 目前2級元素髮生的情況是使用CSS內容使用CSS縮進。我需要做的是將UL標籤放置在開始處,將/ UL標籤放置在2級元素的末尾。

我希望這是有道理的。任何幫助將不勝感激。

回答

0

代替使用帶縮進的<div>標籤,請爲每個級別(包括第一個級別)使用無序列表。在開始處輸入<ul>,最後輸入</ul>,並將<div style="text-indent: ...">更改爲簡單<li>。給第一級別一個ID,這樣你就可以掛鉤了。然後,您可以使用CSS刪除項目符號點並更改縮進等。您不需要計算縮進或者是否要在PHP中加粗文本,而是使用選擇器並允許瀏覽器將其計算出來:

ul#menu { margin: 0; padding: 0; } 
    ul#menu > li { margin: 0; padding: 0; } 
     ul#menu > li > ul { margin-left: 10px; font-weight: bold; } 

所有這些都將允許您使用一種標準算法來生成您的列表,而不是根據關卡進行分支,並使菜單看起來像是網頁抓取工具,搜索引擎和那些使用無CSS瀏覽器的菜單。

順便說一句,你應該真的是htmlspecialchars-所有的動態文本。你不想要一個流浪的<搞亂你的標記。

+0

嗨,薩米爾,謝謝你的幫助。我的麻煩是,我不知道鯨魚到底插入UL和/ UL標籤,我嘗試過試驗,但是它爲每個2級元素都顯示多個UL標籤 – Jason 2010-05-25 02:07:49

+0

@Jason:開始標籤應該在你的大'while循環之前附加到'$ content',並且關閉標籤應該在之後進行它。 – 2010-05-25 02:09:56

0

糾正我,如果我錯了,但似乎你的問題不是你不知道什麼時候打印第一套<ul>標籤,但你試圖打印第二套(2級)在每個函數調用中,因此結束了太多的打開/關閉標籤。

我認爲你應該試着做的是先按級別對你的數組進行排序(見uasort(),然後你可以在第二級的第一個循環輸出你的開頭<ul>標記)(使用計數器來跟蹤哪個循環你正在做,然後做一些事情,如if ($i == 0)($i == (count($array) - 1))。這將工作,無論你有多少嵌套關卡。