MzTreeView 是一款优秀的JS开发框架,中文名为“梅花雪树控件”,主要用来进行树结构的显示,使得展示层次清晰。一个可能的使用场合是,需要展示一件产品下所包含的组件和材料信息。下面以“高压水枪”为例,利用MzTreeView 2.0实现该产品树结构显示。
(注:图片来源:http://a.img.youboy.com/coimg/2010/1/24/g3_2230987.jpg)
下图为“高压水枪”的产品结构图:
首先,需要建立产品信息数据库demo,demo中包含三张表:demo_product, demo_material和demo_tree。其中,demo_product包含了product, component和item的信息,这样做是为了减少数据库的复杂度。demo_material为材料数据表。demo_tree为树结构显示数据表,通过这张表建立demo_product和demo_material的联系,从而实现产品结构的树状显示。demo的数据字典如下图:
通过学习MzTreeView提供的关于csdn导航目录的例子,可以知道MzTreeView是依据“父节点_当前节点”来进行树结构展示的,所以要正确展示出“高压水枪”的树状结构图,必须在demo_tree中正确关联demo_product和demo_material中的数据。
定义好数据的存储结构后,下一步需要考虑的将是如何正确读取数据的问题。因为“高压水枪”包含组件和材料,而组件下又包含材料,所以需要递归的读取数据,因此考虑一个递归函数,只要当前节点不为材料,便继续往下读取信息,一直到材料层。
<?php
require '../Smarty/Smarty.class.php';
$id = trim($_GET['id']); // 产品ID
$treeId = trim($_GET['treeId']); // 产品树ID
$con = mysql_connect('localhost', User, Password);
if (!$con)
die('数据库连接错误:'.mysql_error());
mysql_select_db('demo', $con);
// 根据当前产品id,查询产品名称
mysql_set_charset('utf8', $con);
$prodResult = mysql_query("SELECT name FROM demo_product WHERE id = {$id}");
$prodArray = mysql_fetch_array($prodResult, MYSQL_ASSOC);
$prodName = $prodArray['name'];
// 递归函数
function getTree($proId)
{
static $child = array();
$result = mysql_query("SELECT * FROM demo_tree WHERE parentId = {$proId} ORDER BY parentId");
if ($total = mysql_num_rows($result))
{
for ($i=0; $i<$total; $i++)
$tree[$i] = mysql_fetch_array($result, MYSQL_ASSOC);
}
$total = count($tree);
if ($total > 0)
{
for ($i=0; $i<$total; $i++)
{
if ($tree[$i]['type'] == 0)
{
$result = mysql_query("SELECT name FROM demo_material WHERE id = {$tree[$i]['currentId']}");
$material = mysql_fetch_array($result, MYSQL_ASSOC);
$tree[$i]['name'] = $material['name'];
$child = array_merge($child, array($tree[$i]));
}
elseif ($tree[$i]['type'] == 1)
{
$result = mysql_query("SELECT name FROM demo_product WHERE id = {$tree[$i]['currentId']}");
$product = mysql_fetch_array($result, MYSQL_ASSOC);
$tree[$i]['name'] = $product['name'];
$child = array_merge($child, array($tree[$i]));
getTree($tree[$i]['id']);
}
}
}
return $child;
}
$test = getTree($treeId);
//print_r($test);exit;
// Use Smarty
$smarty = new Smarty();
$smarty->assign("treeId", $treeId);
$smarty->assign("name", $prodName);
$smarty->assign("child", $test);
$smarty->display('show.html');
mysql_close($con);
?>
需要说明一点,$id为产品的根节点标识,此处即指“高压水枪”在demo_product中对应的id。而$treeId为产品树的标识,即demo_tree中字段parentId=0所对应的id。PHP正是通过这两个值在数据库中进行指定查询,从而显示不同的树结构。$id和$treeId的值是通过GET方法传递的。
最后,在模板层,通过MzTreeView的语法结构data[],配合Smarty的遍历语法foreach结构,便能正确为树结构显示赋值。
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Product Tree</title>
<style type="text/css">
#treeview{
width: 500px;
height: 200px;
margin: 10px 0;
padding: 10px;}
</style>
<script src="../scripts/jsframework.js"></script>
<script type="text/javascript">
var a;
function test(){
alert('Hello World');
}
function loadTree(){
var data = {};
{foreach from=$child item=item}
data["{$item.parentId}_{$item.id}"] = "text: {$item.parentId}_{$item.id}_{$item.name} ;";
{/foreach}
data["-1_{$treeId}"] = "text: {$name};";
Using("System.Web.UI.WebControls.MzTreeView");
a = new MzTreeView();
a.autoSort = false;
a.useCheckbox = false;
a.canOperate = true;
a.dataSource = data;
document.getElementById("treeview").innerHTML = a.render();
a.expandLevel(1);
}
</script>
</head>
<body>
<button onClick="javascript:loadTree();">Show Tree!</button>
<div id="treeview"></div>
</body>
</html>
当在URL上传递正确的id和treeId时,如:http://127.0.0.1/treeview/demo/index.php?id=1&treeId=1,页面显示一个值为“Show Tree!”的按钮,点击按钮并将每层节点都打开时,显现如下树状图:
(完)