Cách tạo menu đa cấp trong php
Posted on March 22, 2008
by Blog.thegioiwebsite.Net Học thiết kế web với PHP |
Chắc có lẽ cũng nhiều bạn muốn biết cách để làm một forum nhiều children forum hay cây thư mục đa cấp nên minh viết một bài về đệ qui category sử dụng php & mysql cho các bạn tham khảo.
Cách viết cũng rất đơn giản thôi: sử dụng một function gọi lại chính nó.
vi dụ đơn giản chỉ với 100 lần gọi lại như sau:

function category($x="0",$text="--"){
for($x=1;$x<=100;$x++) // sau mỗi lần lặp lại nâng biến $x lên một giá trị
{
echo $x.$text."<br>";
category($x,$text."--"); // function category được gọi lại
}
}
Bây giờ ta ứng dụng đệ qui để làm một category như sau:
Các bạn tạo các file sau:
Run table sql sau:
CODE
CREATE TABLE `multi_category` (
`category_id` smallint(5) unsigned NOT NULL auto_increment,
`parent_id` smallint(5) unsigned NOT NULL default '0',
`name` varchar(100) NOT NULL default '',
`link` varchar(100) NOT NULL default '',
`date` date NOT NULL default '0000-00-00',
PRIMARY KEY (`category_id`)
) TYPE=MyISAM AUTO_INCREMENT=66 ;
Tạo một file config.php
PHP Code
<?
$dbhost="localhost";
$dbname="multi_category";
$dbuser="root";
$dbpass="";
$table="multi_category";
$date=date("YmdHis");
$db=mysql_connect("$dbhost","$dbuser","$dbpass") or die("Die connect: ".mysql_error());
mysql_select_db("$dbname") or die("Die select database: ".mysql_error());
?>
Tạo một file index.php
PHP Code
<?
include "config.php";
?>
<html>
<head>
<title>Multi Category</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<LINK href='style.css' type='text/css' rel=stylesheet>
<script language="Javascript" src="vietuni.js"></script>
</head>
<body>
<?include "add_category.php";?>
</body>
</html>
tiếp theo tạo file add_category.php
PHP Code
<?php
function show_categories($parent_id="0", $insert_text="--")
{
global $db;
if (! $categories = mysql_query("SELECT * FROM multi_category WHERE parent_id=".$parent_id." ORDER BY parent_id", $db))
{
die ("cannot query");
}
while ($category=mysql_fetch_array($categories, MYSQL_ASSOC))
{
echo("<option value='".$category["category_id"]."'>".$insert_text.$category["name"]."</option>");
show_categories($category["category_id"],$insert_text."--");
}
return true;
}
function selectCtrl ($name, $class)
{
global $db;
print "<SELECT name='". $name. "' class='". $class. "'>\n";
print "<option value='0'>Main category</option>";
show_categories();
print "</SELECT>";
}
?>
<?
echo "<form name='add_category' method='post' action='add_category_action.php'>
<table width='50%' align='center'>
<tr>
<td colspan='2'><div align='center'><strong>Multi category </strong></div></td>
</tr>
<tr>
<td>Lang type: </td>
<td>
<span>
<input type=radio name='switcher' value='OFF' checked onfocus='setTypingMode(0)'>Off
<input type=radio name='switcher' value='TELEX' onfocus='setTypingMode(1)'>Telex
<input type=radio name='switcher' value='vnVni' onfocus='setTypingMode(2)'>VNI
<input type=radio name='switcher' value='vnVni' onfocus='setTypingMode(3)'>VIQR
</span>
</td>
</tr>
<tr>
<td width='36%'>Name:</td>
<td width='64%'>
<input name='name' type='text' size='35' maxlength='100' class='forFormDim' onkeyup='telexingVietUC(this,event);'></td>
</tr>
<tr>
<td>Add link to name: </td>
<td><input name='link' type='text' size='35' maxlength='100' class='forFormDim'></td>
</tr>
<tr>
<td> Parent Category:</td>
<td>";
selectCtrl('parent', 'forFormDim');
print"</td>
</tr>";
echo "<tr>
<td> </td>
<td><input name='Submit' type='submit' class='forFormButton' value='Add category'></td>
</tr>
</table>
</form>";
?>
Tạo file add_category_action.php
PHP Code
<?
include "config.php";
$name = $HTTP_POST_VARS['name'];
$parent = $HTTP_POST_VARS['parent'];
$link = $HTTP_POST_VARS['link'];
$date = date ("d-m-Y");//$HTTP_POST_VARS['date'];
$query="insert into $table (name, parent_id, link, date) values ('$name', '$parent', '$link', '$date')";
$result= mysql_query($query) or die("Die query: ".mysql_error());
//$n= mysql_fetch_array($result);
header("Location: index.php");
?>
Sau khi tạo đủ các file trên bạn có thể test thử và xem code dể hiểu thôi.
Các bạn để ý file add_category.php function đệ qui được viết trong đó, ở đây chúng ta chỉ cần sử dụng 1 table sql với 2 field đủ để thể hiện multi category, có thể dùng cái này cho forum hoặc menu nhiều cấp..vv...
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
Comments
17 Responses to “Cách tạo menu đa cấp trong php”
Leave a Reply
Cam on bac nhieu lam , kiem mai moi ra
em lam duoc roi, nhung ma lam sao de dung no day, lam sao de dua ra trang category nhi ?
Ví dụ trên đưa ra cho bạn hướng và cách làm còn việc trình bày và đưa ra trang thế nào thì cần bạn phải tự viết thôi.
Ac Ac thế mà cũng nói, chán hẳn luôn
Cái hàm function show_categories chính là để hiển thị danh mục đa cấp. Trong ví dụ này nó hiển thị theo kiểu Select Box còn nếu muốn làm menu dạng tree thì bỏ select box đi là được chứ sao. Mỗi cấp con sẽ thụt vào bởi ký tự bạn đặt hoặc icon (ở bài này là dấu “–”).
rat hay dung la tuyet voi
hàm show_categories hiển thị category ra nhưng mình dùng hàm đó category cứ hiển thị lên trên cùng trang web là sao nhỉ , có cách nào cho nó hiển thị đúng nơi mình cần ko ? Mình viết theo kiểu smarty html va php riêng chứ ko viết chung như bạn. Nên nó hiển thị ko theo ý muốn, mong bạn giúp đơ. Thank!
Ý tưởng vẫn là ý tưởng. ý tưởng là một việc và đem vào áp dụng là việc khác. Bài viết này tôi nghĩ là chỉ mang tính chất tham khảo và học thêm cách trình bày các element của những bước next của vòng lặp For. Nói rõ hơn là tác giả xử lí trình bày một menu thông qua hàm : category
Và hàm hiển thị là : show_categories
Thay vì trình bày 2 cái Function thì tại sao không sử dụng 1 cái????
Và ở đây có nhược điểm là khi muốn hiện các Node khác thì phải có sự kiện Click và tiếp tục nhận Request từ server. Vậy điều này có tốt không ???
Tôi thấy nên sử dụng Javascript để trình bày thì sẽ tốt hơn.Vì mọi quá trình xử lí không ảnh hưởng tới server nữa mà hoàn toàn hoạt động trên Client.
Trình bày có thế thôi ai muốn viết một ứng dụng cụ thể xin liên hệ qua Email cho tôi!
Hàm đó như thế này này : Test thử cái này chạy rất hay mà lại đơn giản.
< ?php function Menu($parentid = 0,$space = '--', $trees = NULL){ if(!$trees) $trees = array(); $sql = mysql_query("SELECT * FROM php_category WHERE cat_parentid = ".intval($parentid)); while($rs = mysql_fetch_assoc($sql)){ $trees[] = array('id'=>$rs[’cat_id’],’title’=>$space.$rs[’cat_title’]); $trees = Menu($rs[’cat_id’],$space.’–’,$trees); } return $trees; } $Menu = Menu(0); $str = ”; foreach($Menu as $k=>$rs) $str .= ‘‘.$rs[’title’].’‘; echo $str; ?>Hàm của bạn Cương sao mình ko chạy dc nhỉ ? Bạn test lại hộ với . Thank!
To Thanh Giải pháp cho người viết PHP & Smarty đây :
Menu đa cấp khi click chuột vào 1 cấp nào đó thì sẽ show menu thuộc cấp thấp hơn (nếu có ).Đường dẫn download : http://blog.thegioiwebsite.net/wp-content/uploads/2008/08/category_tree.rar .
Ngoài ra còn có thể lấy được đường dẫn navigation của danh mục hiện tại như : sản phẩm / danh mục cấp 1 / danh mục cấp 2 / danh mục cấp 3 /…./ danh mục cấp n /
bạn Nguyễn Đức Mạnh có thể share luôn cái file để hiển thị ví dụ trên của bạn ko?
nếu có thể thì send qua mail cho mình nhé : tinhbanol@yahoo.com
Manh ơi nếu ứng dụng vào Xtemplate thì làm thế nào ạ
Chào bạn Mạnh, mình viết PHP bằng xtemplate nên ko hiểu cách viết của bạn , bạn có thể hướng dẫn mình viết menu đa cấp theo cách của bạn bằng xtemplate. Mong được giúp đỡ, mình đang cần cái này quá. Thank!
Manh ơi giúp Đức với ^_^
Ko giúp mình sao toàn xoá bài đi thế, giups mình làm cái này trên xtemplate với, đừng xoá bài của mình đi thế T_T
Uhi lâu rồi không Ko lập trình nữa nên cũng ít vào Blog. Các bạn thông cảm mình đã chuyển cho người khác quản trị Blog này rùi.Bạn có thể xem 1 cái site có 4 cấp : http://sytec.com.vn/product.php?act=list_cat&catid=104
người dùng có thể thêm bao nhiêu cấp tùy ý. Trên trang này họ chỉ thêm 4 cấp là vì sản phẩm của họ chỉ có thế. Menu đó là ứng dụng các hàm trong này : http://blog.thegioiwebsite.net/wp-content/uploads/2008/08/category_tree.rar .