2010-05-25 6 views
0

Я пытаюсь отобразить рекурсивный список в PHP для сайта, над которым я работаю.php recursive list help

У меня действительно возникли проблемы с попыткой отобразить второй уровень. У меня есть функция, которая выводит содержимое на страницу следующим образом.

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>. Дайте первому уровню идентификатор, чтобы вы могли на него наложить. Затем вы можете использовать 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. Я попытался поэкспериментировать, однако он продолжает отображать несколько тегов UL для каждого элемента уровня 2. – Jason

+0

@Jason: открывающий тег должен быть добавлен к '$ content' перед вашим большим циклом' while', а закрытие тег должен идти сразу после Это. –

0

Исправьте меня, если я ошибаюсь, но кажется, что ваша проблема не в том, что вы не знаете, когда печатать первый набор тегов <ul>, но вы пытаетесь напечатать второй набор (для уровня 2) в каждом вызове функции и, следовательно, заканчивается слишком большим количеством тегов open/close.

Я думаю, что вы должны попытаться сделать сортировку своего массива по уровню, сначала (см. uasort(), а затем вы можете вывести свой вводный тег <ul> в первый цикл второго уровня (использовать счетчик, чтобы отслеживать, какой цикл вы находитесь, а затем делаете что-то вроде if ($i == 0) или ($i == (count($array) - 1)).Это будет работать независимо от того, сколько у вас уровней вложенных.