Как создать вложенное меню из MySQL с помощью PHP? - PullRequest
0 голосов
/ 06 октября 2009

Мне нужно создать меню с PHP из базы данных MySQL.

Таблица с названием категории имеет идентификатор, имя, parent_id, shortdesc и т. Д.

Выходные данные должны иметь список родителей и список детей под списком участников следующим образом.

Если вы можете показать мне коды или веб-сайт, я буду признателен.

<ul id="catmenu">
    <li class="menulist">Cars
        <ul>
            <li>Ford</li>
            <li>Honda</li>
            <li>Toyota</li>
        </ul>
    </li>
    <li class="menulist">Food
       <ul>
            <li>Pasta</li>
            <li>Pizza</li>
            ...
       </ul>
    </li>
...
...
</ul>

Ответы [ 3 ]

1 голос
/ 06 октября 2009

Если у вас есть только два уровня, вы можете просто отобразить их:

echo '<ul id="catmenu">';
foreach($menu as $element) {


    echo '<li><ul class="menulist">';
    foreach($element['submenu'] as $submenu) {

        echo '<li>' . $submenu['name'] . '</li>';
    }
    echo '</ul></li>';
}
echo '</ul>

Если у вас есть неопределенное количество подменю, вам следует использовать Рекурсивную функцию .

function menu($item) {
    $ret = '<li>' . $item['name'];

    if (!empty($item['submenu'])) {
        foreach($item['submenu'] as $submenu) {
            $ret .= menu($submenu);
        }
    }
    return $ret;
}
echo menu($menu);

Таким образом, будут отображаться все ваши подкатегории, независимо от их номера.

1 голос
/ 06 октября 2009

Вы создаете базу данных вот так.

ID    NAME     PARENT
0     Cars     -1
1     Foods    -1
2     Ford      0
3     Honda     0
4     Toyota    0
5     Pasta     1
6     Pizza     1
...

Вы запрашиваете их все и помещаете в массив.

$Menus = array();
// In a read MySQL loop
$Menus[$i]['ID']
$Menus[$i]['NAME']
$Menus[$i]['PARENT']
// Sorry, lazy to write. I think you know what I mean.

Затем вы перебираете все меню в поисках PARENT == -1. Создайте все UL и IL, а затем добавьте их в другое вложенное меню. Вы можете просто создать такую ​​функцию.

var $MenuLevelClass = array("menulist");
 
function CreateMenu($Menus, $Tab = 0, $Parent = -1, $Level = 0) &#123;
    global $MenuLevelClass;
     
    $CatClass  = ($Level != 0) ? '' : ' class="catmenu"';
     $MenuClass = $MenuLevelClass[$Level];
     if ($MenuClass != '')
         $MenuClass = ' class="'.$MenuClass.'"';
      
     $TabCount = $Level + $Tab;
     $TabUL    = "";
     for ($t = 0; $t < $TabCount; $t++)
         $TabUL = $TabUL."\t";
     $TabLI = $TabUL."\t";
      
?>
<?=$TabUL?><ul<?=$CatClass?>>
<?php
     
    $MenuCount = count($Menus);
    for ($m = 0; $m < $MenuCount; $m++) &#123;
        $Menu = $Menu[$m];
        $ID   = $Menu['ID'];
        if ($ID != $Parent)
            continue;
     
?>
<?=$TabLI?><li<?=$MenuClass?>><?=$Menu['Name']?><?=CreateMenu($Menus, $Tab + 1, $ID, $Level + 1)?></li>
<?php
     
?>
<?=$TabUL?></ul>
<?php
     
    &#125;
&#125;

И чтобы использовать его, просто запустите 'CreateMenu($Menus);' или 'CreateMenu($Menus, $PrefixTabCount);'. CreateMenu рекурсивно создаст для вас вложенное меню.

Я не проверял его, поэтому вам, возможно, придется его настроить.

Надеюсь, это поможет.

1 голос
/ 06 октября 2009

Это специально для двух уровней. Рекомендуемый подход, если это более целесообразно, - это использовать оптимизированную структуру таблицы для обхода, например http://articles.sitepoint.com/article/hierarchical-data-database/2 (указано в другом месте), или извлечь нужные данные, поместить их в словарь (ассоциативный массив) и выполнить запрос таким образом .

<?php
    $query = <<<EOT
        SELECT
            parent.name as parent_name,
            child.name as child_name,
        FROM
            items child
        INNER JOIN
            items parent
        ON
            child.parent_id = parent.id
        ORDER BY
            parent.name
EOT;

    $result = mysql_query($query) or die('Failure!');

    echo "<ul id=\"catmenu\">";

    $last_parent = '';
    while($row = mysql_fetch_array($result)){
        // If this is a new category, start a new one
        if($last_parent != $row['parent_name']){
            // Unless this is the first item, close the last category
            if($last_parent != ''){
                echo "</ul></li>";
            }
            $last_parent = $row['parent_name'];
            echo "<li class=\"menulist\">{$row['parent_name']}<ul>";
        }
        echo "<li>{$row['child_name']}</li>";
    }

    // If we actually had items, close the "category"
    if($last_parent != ''){
        echo "</ul></li>";
    }

    echo "</ul>";

?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...