PDA

View Full Version : Làm Menu Đa Cấp...help me!



loren
27-04-2010, 01:48
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
27-04-2010, 02:44
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ẹ :bored:

tạo table :


CREATE TABLE `menus`.`menu` (
`menu_id` INT NOT NULL AUTO_INCREMENT ,
`name` VARCHAR( 255 ) NOT NULL ,
`link` VARCHAR( 255 ) NOT NULL ,
`parent_id` INT NOT NULL ,
PRIMARY KEY ( `menu_id` )
)


thêm dữ liệu thử .


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]


$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


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[$num]=$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 :


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 :D )

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


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


function foreach_child


function foreach_child($id,$data,$level,&$html){
$html.='<ul>';
foreach($data as $data_id =>$item){
if ($item['parent_id']==$id){
$html.='<li><a href="'.$item['link'].'">'.$item['name'].'</a>';
unset($data[$data_id]);
foreach_child($item['menu_id'],$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
$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[$num]=$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['parent_id']==$id){
$html.='<li><a href="'.$item['link'].'">'.$item['name'].'</a>';
unset($data[$data_id]);
foreach_child($item['menu_id'],$data,$level,$html);
$html.='</li>';
}
}
$html.='</ul>';
}

?>

còn thắc mắc gì thì hỏi nha :punk:

tuanit85
27-04-2010, 08:21
Hôm nay rảnh thế "Ku" :p

shrimp2t
27-04-2010, 08:44
Ok rất hay đó :D hồi trước mình nghĩ mai mới ra :D mà đã làm thì làm cả phần Back-end co Anh em xem luân :D

ngoc_viet08
27-04-2010, 09:57
Hôm nay rảnh thế "Ku" :p
đang bí wordpress nên rảnh đó anh :D

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 :D , có add new , edit , soft thui mờ :D

jacky9
27-04-2010, 18:55
he Add thì dẽ Edit cũng Ok còn phần sort thì khó đấy :D ( mình thấy thế ) :d

veryperfect
27-04-2010, 20:21
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
27-04-2010, 22:02
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
27-04-2010, 22:47
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
27-04-2010, 23:25
uh đúng đó

ù thì 20 ký tự nè

Thanh duc
06-05-2010, 21:03
Lợi hại

Lợi ở chỗ chỉ cần 1 query

Hại ở chỗ code lặp lại nhiều lần hơn so với gọi query ---> chậm khi số lượng menu nhiều.
Hại tìm cây cha cũng phức tốn kém

Có 1 phương páp khác lợi hại hơn gọi là nested:
http://dev.mysql.com/tech-resources/articles/hierarchical-data.html
Lợi ở chỗ: cần query và 1 vòng lặp có thể show ra toàn bộ cây và cấp của cây
Tìm cây , node khá dễ dàng chỉ cần 1 query

Hại rất phức tạp khi di chuyển, thay đổi thứ tự node


p/s:

snoob_clo4
06-05-2010, 22:45
Hê thế trong forum thì dùng cách nào :rolleyes:

ngoc_viet08
06-05-2010, 22:50
Hại ở chỗ code lặp lại nhiều lần hơn so với gọi query ---> chậm khi số lượng menu nhiều.

theo hiểu biết của mình thì xử lý nhiều code php vẫn nhẹ hơn xử lý nhiều sql trong mysql . thằng bạn mình có nói lờ tình trạng "thắt cổ chai" xảy ra ở khúc query vào database mysql , xử lý php thì khỏe hơn. hắn nói vậy thui chứ mình chưa có kiểm chứng dc.

minhbkis
06-05-2010, 23:17
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...

menu đa cấp à bạn vào đây :http://www.izwebz.com/video-tutorials/menu-tha-xuong-da-cap-jquery-css/
pro thì đừng hỏi.!..!!... :)

kenphan19
07-05-2010, 10:22
vãi hà :D code hay đáo để