PHP ile MySQL iç içe bir menü oluşturmak nasıl?

3 Cevap php

Ben bir MySQL veritabanı PHP ile bir menü oluşturmak gerekir.

Kategorileri olarak adlandırılan tablo id, adı, parent_id, KısaAçıklama, vs vardır

Çıktı aşağıdaki gibi partent listesinin altındaki ana liste ve çocukların listesi olması gerekir.

Bana kodları veya web sitesi gösterebilir, ben bunu takdir edecektir.

<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 Cevap

Bu iki düzeyde derin içindir. Önerilen yaklaşım daha fazla olmalıdır http://articles.sitepoint.com/article/hierarchical-data-database/2 (başka yerde işaret) veya ihtiyacınız veri çekme ve bir sözlük (ilişkisel dizi) içine itmek ve bunu sorgulamak gibi, geçişi için optimize edilmiş bir tablo yapısını kullanmak olduğunu yol.

<?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>";

?>

Eğer sadece iki düzeyleri varsa, sadece onları görüntüleyebilir:

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>

Eğer alt menülerin tanımsız bir dizi varsa ancak bir Recursive Function kullanmalısınız.

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

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

Bu yüzden onların numarası görüntülenir olacak ne olursa olsun sizin alt kategoriler her.

Böyle bir veri tabanı oluşturacağız.

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

Siz tüm bunları sorgulamak ve bir dizi koydu.

$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.

Then you loop all menu looking for PARENT == -1. Generate all UL and IL then sub it with another nested menu. You can simply create a function like this.

var $MenuLevelClass = array("menulist");
 
function CreateMenu($Menus, $Tab = 0, $Parent = -1, $Level = 0) {
    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++) {
        $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
     
    }
}

And to use it just run 'CreateMenu($Menus);' or 'CreateMenu($Menus, $PrefixTabCount);'. CreateMenu will recursively create the nested menu for you.

Bunu ayarlamak zorunda kalabilirsiniz bu yüzden test değil.

Umarım bu yardımcı olur.