Thứ Tư, 1 tháng 10, 2014

Tạo menu đa cấp, multi-level menu đệ quy trong PHP

Trong một website có lẽ sẽ không bao giờ không có menu, tùy vào mục đích thiết kế và ý tưởng mà menu được thể hiện khác nhau ở mỗi trang web. Trong đó menu đa cấp là một dạng phổ biến nhất, hôm nay mình sẽ chia sẽ với mọi người cách tạo menu đa cấp trong PHP, hy vọng đây sẽ là bài viết có ích cho các bạn mới học PHP
Menu là gì? Và tại sao cần phải có menu? Menu là một chỉ mục mà nó trỏ đến một list danh sách bài viết nay một bài viết hoặc một trang web nào đó. Đối với cấp độ người dùng thì menu giống như một sự chỉ dẫn cần thiết cho việc khai thác thông tin website một các hiểu quả. Đối với SEO thì menu cũng rất quan trọng nó giúp đánh giá sự điều hướng liên kết trong SEO.
Qua đó cho thấy sự cần thiết của menu trong WEB, vậy menu đa cấp hay multi-level menu là gì? menu đa cấp hay multi-level menu là một dạng menu mà nó phân ra các chỉ mục rõ ràng cho ta dễ dàng trong việc quản lý tính liên quan của thông tin từ website.
Tạo CSDL cho menu đệ quy
Lúc trước khi muốn tạo menu mấy cấp thì cho mấy bảng dữ liệu và truyền khóa ngoại vào giống như bài tạo menu đa cấp trong  lập trình web với ASP.net còn bây giờ với menu đệ quy thì tất cả các thể loại bạn lưu chỉ cần lưu trong một bảng dữ liệu duy nhất mà thôi.
Đây mình chỉ làm demo nên chỉ cho vào các thuộc tính cần thiết thôi bạn bổ sung vào nha!Trong CSDL trên có ID làm khóa chính, Tên Loại và Loại cha lưu các ID mà nó thuộc vào thể loại đó. Sau đó bạn vào trong host tạo một file menu.php để mình code test thử, bạn nhớ thêm dữ liệu vào để mình kiểm tra xem có đúng với yêu cầu không.
Sau đó khi đã có dữ liệu demo ví dự như trên bạn code menu đa cấp, multi-level menu đệ quy trong PHP như sau:
Mã HTML:
<?php
$hostname = "localhost";
$database = "bcdonline_db";
$username = "root";
$password = "root";
$con = mysql_pconnect($hostname, $username, $password) or trigger_error(mysql_error(),E_USER_ERROR);
mysql_query("set names 'utf8'");
?>
Mã HTML:
<?php
mysql_select_db($database, $con);
$sql = mysql_query("SELECT * FROM theloai WHERE LoaiCha = 0");
echo '<ul>';
while($row = mysql_fetch_array($sql)){      
echo '<li><a href="#" >'.$row['TenLoai'].'</a></li>';   // Tra lai tat ca cac Menu cha
getSubcategory($row['IDLoai']);        // neu ton tai cac Menu con thi se duoc hien thi
}  
echo '</ul>';
/**
* Ham nay tra lai tat cac cac Menu con
*/

Mã HTML:
function getSubcategory($loaicha){
$sql = mysql_query("SELECT * FROM theloai WHERE LoaiCha = ".$loaicha);  
while($row = mysql_fetch_array($sql)){
echo '<ul>';
echo '<li><a href="#" >'.$row['TenLoai'].'</a></li>';
getSubcategory($row['IDLoai']);         // *
echo '</ul>';
}  
}
?>
Mình đã phân rõ các phần, hàm của PHP từ việc kết nối CSDL trong php đến truy vấn và hiển thị ra cây menu bằng thể hiện các thẻ UL và LI.
Bây giờ mình chỉ việc CSS lại là có menu đa cấp, với các này bạn có thể lập vô tận n cấp tuy nhiên mình chỉ cần một bảng dữ liệu mà thôi.
Ngoài ra bạn còn có thể cho vào trong select option để chọn loại cho, việc làm này rất có ích và chuyên nghiệp trong việc code trang admin có thể loại.
Mã HTML:
<label>Loại Cha <span style="color: red;">*</span></label><br />
<select name='LoaiCha'>
<option value="0">Chọn loại cha</option>
<?php
mysql_select_db ($database, $con);
function Menu($parentid = 0, $space = "", $trees = array())
{
if(!$trees)
{
$trees = array();
}
$sql = "SELECT * FROM theloai WHERE LoaiCha = $parentid";
$query = mysql_query($sql);
while($rs = mysql_fetch_assoc($query))
{
$trees[] = array( 'IDLoai' => $rs['IDLoai'],
'TenLoai'=>$space.$rs['TenLoai'],
);
$trees = Menu($rs['IDLoai'], $space.'&nbsp;&nbsp;&nbsp;--&nbsp;&nbsp;', $trees);
}
return $trees;
}
$menu = Menu(0);
foreach($menu as $k => $row)
{
?>
<option value="<?php echo $row['IDLoai']; ?>"><?php echo $row['TenLoai']; ?></option>
<?php
}
?>
</select>
Demo sẽ giống như hình sau:

Kết luận: Bây giờ thì các bạn có thể tạo menu đa cấp, multi-level menu đệ quy trong PHP một cách dễ dàng rồi đúng không nào, hãy CSS và tùy biến lại theo cách mà bạn muốn, chúc mọi người thành công!

Không có nhận xét nào:

Đăng nhận xét