Помощь с PHP рекурсивным меню списка навигации - PullRequest
3 голосов
/ 26 мая 2010

Я пытаюсь добавить меню динамического списка рекурсивной навигации на сайт, над которым я работаю. Scennerio состоит в том, что меню имеет 2 уровня, связанных парентидой (preid).

Моя проблема в том, что я могу правильно отобразить список 1-го уровня, но не могу правильно отобразить второй уровень. Я не уверен, куда добавить теги UL и / UL для второго уровня.

Это то, что я после

<ul>
<li>Item 1</li>
<li>item 2</li>
<li>item 3</li>
<ul>
  <li>sub item 1</li>
  <li>sub item 2</li>
</ul>
<li>Item 4</li>
<li>item 5</li>
<ul>
  <li>sub item 1</li>
  <li>sub item 2</li>
</ul>
<li>item 6</li>
</ul>

Это фактически то, что я получаю с помощью приведенного ниже кода:

    <ul>
  <li>item 1
    <ul>
    </ul>
  </li>
  <li>item 2
    <ul>
      <li>sub item 1</li>
      <ul>
      </ul>
      <li>sub item 2</li>
      <ul>
      </ul>
    </ul>
  </li>
  <li>Sports Injuries
    <ul>
    </ul>
  </li>
    </ul>
  </li>
</ul>

Ниже приведен файл класса, который я использую для создания меню:

class Dynamic_Menu 
    {
        function getConfig()
        {
            $this->DB_SERVER = 'localhost';
            $this->DB_USER = '***';
            $this->DB_PASS = '***';
            $this->DB_NAME = '***';

        }

        function __construct()
        {
            $this->getConfig();
            $Conn = mysql_connect($this->DB_SERVER, $this->DB_USER, $this->DB_PASS);
            if (!$Conn)
                die("Error: ".mysql_errno($Conn).":- ".mysql_error($Conn));
            $DB_select = mysql_select_db($this->DB_NAME, $Conn);
            if (!$DB_select)
                die("Error: ".mysql_errno($Conn).":- ".mysql_error($Conn));
        }

        function select_row($sql)
        {
            //echo $sql . "<br />";
            if ($sql!="")
            {
                $result = mysql_query($sql) or die("Error: ".mysql_errno().":- ".mysql_error());
                if ($result)
                {
                    while($row = mysql_fetch_array($result))
                        $data[] = $row;
                }
                return $data;
            }
        }

        function recordCount($sql)
        {
            if ($sql!="")
            {
                $result = mysql_query($sql) or die("Error: ".mysql_errno().":- ".mysql_error());
                if ($result)
                {
                    $cnt = mysql_num_rows($result);
                    return $cnt;
                }
            }
        }

        function getChild($id)
        {
            $menu = "";
            $str = "";
            $s = "SELECT * FROM vcms_sys_explorer WHERE preid = '$id' ";
            $res = $this->select_row($s);
            $menu .= '<ul>';
            for ($i=0;$i<count($res);$i++)
            {
                $cnt_of_child = $this->recordCount("SELECT * FROM vcms_sys_explorer where preid = '".$res[$i][eid]."' ");
                //if ($cnt_of_child > 0)
                //  $str = '';
                //else
                //  $str = " (is sub menu item)";

                $menu .= '<li>'. $res[$i][name].$str.'</li>';   
                $menu .= $this->getChild($res[$i][eid]);
            }
            $menu .= '</ul>';       
            return $menu;
        }

        function getMenu($parentid)
        {
            $menu = "";
            $s = "SELECT * FROM vcms_sys_explorer WHERE preid = '$parentid'  ";
            $res = $this->select_row($s);

            $menu .= '<ul>';

            for ($i=0;$i<count($res);$i++)
            { 
                $menu .= '<li>'.$res[$i][name].$this->getChild($res[$i][eid]).'</li>';
                if ((count($res) - 1) > $i) {
                }
            } 

            $menu .= '</ul>';

            return $menu;
        }
    }

Я вызываю меню с:

$menu = new Dynamic_Menu();
$menu->getMenu(1);

Может кто-нибудь помочь и объяснить, где мне нужно разместить теги UL и / UL уровня 2. Я бился головой об этом последние 2 дня. Любая помощь будет принята с благодарностью, спасибо ...

Ответы [ 2 ]

11 голосов
/ 26 мая 2010

Во вложенном списке подсписки всегда будут содержаться в элементе списка - вот что делает их вложенными. Вы можете распечатать полный список только в одной функции, используя этот формат (в общем коде, но вы должны понять основную идею):

function get_list($parent) {
    $children = query('SELECT * FROM table WHERE parent_id = '.$parent);
    $items = array();
    while($row = fetch_assoc($children)) {
        $items[] = '<li>'.$row['name'].get_list($row['id']).'</li>';
    }
    if(count($items)) {
        return '<ul>'.implode('', $items).'</ul>';
    } else {
        return '';
    }
}

И это даст вам список, правильно структурированный как:

<ul>
    <li>Item 1</li>
    <li>Item 2
        <ul>
            <li>Item 2.1</li>
            <li>Item 2.2</li>
        </ul>
    </li>
</ul>
0 голосов
/ 30 декабря 2012

Все, хотя этот вопрос отличается от вопроса , который я опубликовал 2 дня назад, здесь результат того, что я пытался сделать с папками, а не с БД. Следующее будет проходить по каталогу и всем подкаталогам указанного $ path и выкладывать результаты во вложенный неупорядоченный список по завершении выполнения скрипта. Надеюсь, это поможет.

<?php
function readDirs($path){
    $dirHandle = opendir($path);
    echo "<ul>";
    while ($item = readdir($dirHandle)) {
        $newPath = $path . "/" . $item;

        if (is_dir($newPath) && $item != '.' && $item != '..') {
            echo "<li><a href='$newPath'>$item</a>";
            readDirs($newPath);
        }
    }
    echo "</li></ul>";
}
$path = "./galleries";
readDirs($path);

?>
...