recursive listesi yardım php

2 Cevap php

Ben üzerinde çalışıyorum bir site için PHP bir özyinelemeli listesini görüntülemek için çalışıyorum.

Ben gerçekten sorun ikinci düzey görüntülemek almaya çalışırken yaşıyorum. Ben aşağıdaki gibi sayfa içeriğini görüntüleyen bir işlevi var.

   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.'');
}

At the moment the content displays properly, however I want to turn this function into a DHTML dropdown menu. At present what happens with the level 2 elements is that using CSS the contents are indented using CSS. What I need to happen is to place the UL tag at the beginning and /UL tag at the end of the level 2 elements.

Bu mantıklı umuyoruz. Herhangi bir yardım büyük mutluluk duyacağız.

2 Cevap

Bunun yerine girinti ile <div> etiketleri kullanarak, ilki de dahil olmak üzere, her seviye için bir Sırasız liste kullanın. Sonunda başlangıç ​​ve </ul> adresinde fonksiyon çıkışını <ul> var, ve değişim <div style="text-indent: ..."> basit bir <li> için. Bunu üzerine kanca böylece ilk seviye bir kimlik vermek. Sonra, vb mermi noktaları kaldırmak ve girinti değiştirmek için CSS kullanabilirsiniz Sen girinti hesaplamak gerekir ya ve PHP-yerine, kullanım seçiciler kalın metin olmadığını tarayıcı onu anlamaya izin vermez:

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

Tüm bu yerine düzeyine göre dallanma yanı sıra menü web tarayıcılarının, arama motorları ve CSS-az tarayıcısı olanlar için bir menü gibi bakmak yapma, listenizi oluşturmak için bir standart algoritma kullanmanızı sağlayacak.

Bu arada, gerçekten htmlspecialchars tüm bu dinamik metin-ing olmalıdır. Sen bir sokak < pisliği İşaretlemenizi istemiyorum.

Yanılıyorsam, ancak bu ikinci seti için (yazdırmaya çalışırken sizin sorun <ul> etiketleri ilk setini yazdırmak için ne zaman bilmiyorum ki değil gibi görünüyor, ama eğer beni düzeltin level 2) her işlev çağrısında, ve böylece çok fazla açık / kapalı etiketleri ile biten.

Ben ne yapmaya çalışmalısınız sıralamak düzeyine göre dizi, ilk (uasort() görmek ve olduğunu düşünüyorum sonra yapabilirsiniz çıkış ikinci seviye (kullanımı ilk döngü açılış <ul> etiketi Eğer if ($i == 0) ya da eğer böyle bir şey yapmak ($i == (count($array) - 1)). Bu sizin kaç iç içe düzeyleri ne olursa olsun çalışacak ve ardından konum hangi döngü takip etmek için bir sayaç.