10/10/2018, 10:28

Làm Menu Đa Cấp...help me!

Mình đang làm cái menu theo dạng đa cấp, tức là cứ click vào gốc thì sinh ra con, click vào con thì sinh ra con nữa...rồi cứ tiếp tục cho ra vài con nữa...Nhưng ở đây mình phải dùng PHP lấy từ Database ra, mình làm mãi mà chưa được? các bạn giúp mình với????
Thanks nhìu nhìu...
ngoc_viet08 viết 12:44 ngày 10/10/2018
hỏi phải thêm thông tin mới bik trả lời chứ T_T . mới làm menu đa cấp xong nên tiện thể hiếp , à quên help bác luôn .
basic table nhé :
+menu table :
structure : menu_id - name- link -parent_id
menu_id : id của menu
name : tên của menu ví dụ : Home , About , Contact...
link : url của menu ví dụ : http://mysite.com/ , http://mysite.com/about/...
parent_id : id của menu cha ( mẹ ). 0 là menu ko cha ko mẹ

tạo table :
PHP Code:
CREATE TABLE `menus`.`menu` (
`
menu_idINT NOT NULL AUTO_INCREMENT ,
`
nameVARCHAR255 NOT NULL ,
`
linkVARCHAR255 NOT NULL ,
`
parent_idINT NOT NULL ,
PRIMARY KEY ( `menu_id` ) 

thêm dữ liệu thử .
PHP Code:
INSERT INTO `menus`.`menu` (
`
menu_id` ,
`
name` ,
`
link` ,
`
parent_id
)
VALUES (
NULL 'home''http://mysite.com/''0'
), (
NULL 'about''http://mysite.com/about''0'
), (
NULL 'blog''http://mysite.com/blog''0'
), (
NULL 'first blog''http://mysite.com/blog/first-blog''3'
), (
NULL 'contact''http://mysite.com/contact''0'
); 
đầu tiên là query để lấy ra tất cả (lọc ra nếu table phức tạp hơn , ví dụ thêm trường status : show/hidden:
select * from menu
chuyển kết quả vừa query về dạng mảng[mảng]
PHP Code:
$result=mysql_query('select * from menu ');
if (
mysql_num_rows($result)>0){
    
$menus change_result_to_array($result)

function change_result_to_array($result) đây
PHP Code:
function change_result_to_array($result){
        if (
mysql_num_rows($result)<>0){
            
$new_array=array();
            
$num=0;
            while (
$row=mysql_fetch_array($result)){
                
$new_array***91;$num***93;=$row
                
$num++;
            }
            return 
$new_array;
        }
        else{
            return 
false;
        }
    } 
lúc này ta đã có mảng[mảng] có thể xem cấu trúc của nó bằng cách :
PHP Code:
var_dump($menus); 
đến đoạn tạo menu đa cấp .
- đầu tiên ta list ra các menu ko có parent = function foreach_child .
- function foreach_child có nhiệm vụ tìm trong mảng ra những menu nào có parent_id bằng $id ( ban đầu là 0 ) ( giống như tìm con )

- trong quá trình list mỗi menu trên ra , nó sẽ foreach_child 1 lần nữa để tìm kiếm các child của nó .

- quá trình cữ diễn ra như thế .
PHP Code:
$menu_html='';
foreach_child(0,$menus,$level,$menu_html);
echo 
$menu_html
function foreach_child
PHP Code:
function foreach_child($id,$data,$level,&$html){ 
   
$html.='<ul>';
    foreach(
$data as $data_id =>$item){ 
        if (
$item***91;'parent_id'***93;==$id){  
            
$html.='<li><a href="'.$item***91;'link'***93;.'">'.$item***91;'name'***93;.'</a>';
            unset(
$data***91;$data_id***93;); 
            
foreach_child($item***91;'menu_id'***93;,$data,$level,$html); 
            
$html.='</li>';
        } 
    } 
    
$html.='</ul>';

chú ý đoạn code
unset($data[$data_id]);
nó để loại bỏ menu đã được hiển thị ( đưa vào <li> ) và đã lọc ( tìm kiếm child ) để giảm tải cho những lần sau .

all code :
PHP Code:
<?php
$db
=mysql_connect("localhost","root","");

if (! 
$db)

{

echo 
" Không thể kết nối CSDL lúc này ! ";

exit;

}

mysql_select_db("menus");

mysql_query("SET NAMES 'utf8'");

$result=mysql_query('select * from menu '); 
if (
mysql_num_rows($result)>0){ 
    
$menus change_result_to_array($result) ;
}



//var_dump($menus); 

$menu_html='';
foreach_child(0,$menus,$level,$menu_html);
echo 
$menu_html;

function 
change_result_to_array($result){ 
    if (
mysql_num_rows($result)<>0){ 
        
$new_array=array(); 
        
$num=0
        while (
$row=mysql_fetch_array($result)){ 
            
$new_array***91;$num***93;=$row;  
            
$num++; 
        } 
        return 
$new_array
    } 
    else{ 
        return 
false
    } 
}  


function 
foreach_child($id,$data,$level,&$html){ 
   
$html.='<ul>';
    foreach(
$data as $data_id =>$item){ 
        if (
$item***91;'parent_id'***93;==$id){  
            
$html.='<li><a href="'.$item***91;'link'***93;.'">'.$item***91;'name'***93;.'</a>';
            unset(
$data***91;$data_id***93;); 
            
foreach_child($item***91;'menu_id'***93;,$data,$level,$html); 
            
$html.='</li>';
        } 
    } 
    
$html.='</ul>';


?>
còn thắc mắc gì thì hỏi nha
tuanit85 viết 12:30 ngày 10/10/2018
Hôm nay rảnh thế "Ku" :p
shrimp2t viết 12:30 ngày 10/10/2018
Ok rất hay đó hồi trước mình nghĩ mai mới ra mà đã làm thì làm cả phần Back-end co Anh em xem luân
ngoc_viet08 viết 12:43 ngày 10/10/2018
Hôm nay rảnh thế "Ku" :p
đang bí wordpress nên rảnh đó anh
Ok rất hay đó hồi trước mình nghĩ mai mới ra mà đã làm thì làm cả phần Back-end co Anh em xem luân
back-end toàn simple mờ anh , có add new , edit , soft thui mờ
jacky9 viết 12:38 ngày 10/10/2018
he Add thì dẽ Edit cũng Ok còn phần sort thì khó đấy ( mình thấy thế ) :d
veryperfect viết 12:35 ngày 10/10/2018
cha, chao may ban, nhin ma tui thay loan ca len. nhung tui cung dang hoc lap trinh wed ma khong biet ty chi. co ai chi giao gium duoc hem. thanks nhiu nha
loren viết 12:36 ngày 10/10/2018
Cảm ơn bạn ngoc_viet08 nhé.bạn ơi làm ơn bạn giảng lại cái hàm foreach_child($id,$data,$level,&$html)đó được ko?Mình không hiểu lắm.
Table menu của mình là cate_sp: có id,parent,name.
Lúc mình rê chuột vào menu thì nó chỉ sô ra 2 cấp, bây h mình muốn thêm cấp 3,4...Nhưng làm mãi không được bạn à?

[=========> Bổ sung bài viết <=========]

Bạn giảng lại giùm mình cái hàm foreach_child($id,$data,$level,&$html),cảm ơn bạn ngoc_viet08 nhìu nhìu...
ngoc_viet08 viết 12:35 ngày 10/10/2018
cái này còn tùy vào code html của bạn nữa . pm nick ngoc_viet08 để mình bàn cho lẹ chứ giờ ngồi chuyển qua chuyển lại mất thời gian lắm ...
bka viết 12:29 ngày 10/10/2018
uh đúng đó

ù thì 20 ký tự nè
Bài liên quan
0