|
服务端输出很简洁 response.Write "<table><tr>" response.Write "<td valign='top'>" & xslTransform("tree.xml","xmlFile","tree.xsl","class","tree") & "</td>" response.Write "<td valign='top'>" & xslTransform("tree.xml","xmlFile","tree.xsl","class","tree1") & "</td>" response.Write "<td valign='top'>" & xslTransform("tree.xml","xmlFile","tree.xsl","class","tree2") & "</td>" response.Write "<td valign='top'>" & xslTransform("tree.xml","xmlFile","tree2.xsl","class","tree3") & "</td>" response.Write "</tr></table>" 这里说下,为什么要写这个分类树. 看到很多时候大家都在问关于无限级的分类问题,也看过很多的实现无限级分类的代码,大家都看过动网的无限级分类的数据表了吧,结构复杂,要更新移动分类,排序时更复杂了。其实这个也是为了效率娣。但是能不能用ID,parentId,catalogName,sortId这样的简单的数据库结构来实现一棵可排序的分类树呢?很多的代码对于这种结构生成树时用到的代码用的是递归,一次次的递归rs.open效率很有问题,还在在当中夹着""类似的代码让人看得头晕。所有我的想法就是只读取一次的数据库中用记录集生成一个XML,再经过整理结构如下: <data> <row id="1" parentId="0" catalogName="分类1" sortId="1.1"/><!--sortId用小数就可以自由的排序啦--> <row id="2" parentId="0" catalogName="分类2" sortId="1"/> <row id="3" parentId="1" catalogName="分类1_1" sortId="1"/> <row id="4" parentId="1" catalogName="分类1_2" sortId="2"/> <row id="5" parentId="3" catalogName="分类1_1_1" sortId="1"/> <row id="6" parentId="3" catalogName="分类1_1_2" sortId="2"/> </data> 经过一个XSL的模板,整理出一个树形的XML <root> <catalog id="2" parentId="0" catalogName="分类2"/> <catalog id="1" catalogName="分类1"/> <catalog id="3" catalogName="分类1_1"> <catalog id="5" catalogName="分类1_1_1"/> <catalog id="6" catalogName="分类1_1_2"/> </catalog> <catalog id="4" catalogName="分类1_2"/> </catalog> </root>
这个XML可能存入缓存,以后不改变分类就不要再去读数据库啦,这个树形结构能大大方便我们写其它功能的代码
现在我们想实现一个导航条也就是分类1 > 分类1_1 > 分类1_1_2这类型的 比如这们有一条 [分类1_1_2] 的信息,要实现导航条通过ancestor-or-self::catalog一个xpath就搞定了。
要实现取下级的所有分类用descendant::catalog如果当前分类也算在内用descendant-or-self::catalog,就好了,简单吧:)
=============================================================================================
下面说说我从论坛上下的JTREE吧,本来有想利用这个的,不过看看代码,灵活性不太好: 这个是他生成XML用的 PUBLIC SUB saveVogueToXMLFile(pFileName) while not rst.eof set elemNode =xmlDom.createElement("item") set attCaption =xmlDom.createAttribute("caption") attCaption.text =rst("title") ..........
这个如果我要在树中加点内容,比如当前分类有个隐藏标识,当前分类再加个说明,就要改这里的代码,用记录集生成的XML就不要改任何东西
PUBLIC FUNCTION deleteType dim sql,rst,returnArray(1),isOk isOk=true sql="select * from mmst060 where parentTypeID=" & typeID set rst=conn.execute(sql) if not rst.eof then isOk=false returnArray(0)=false returnArray(1)="当前类别下存在分类,请先删除分类!" .................. 要是下面有20多个子分类,要一个个删??为什么不连同所有下级分类一起删??
我想不要把所有一级分类当成根节点,要不做个分类选择,根节点要写个什么网站分类,怪怪的,一看JS代码,不花点时间,是改不好的,要是JS水平不好,就没戏了。
下面还有个要求,加入连动的CHECKBOX,所有有下级分类的节点,加个菜单。再或者,把所有分类树后加个此分类的信息数量,再或者,把所有分类写成淘宝的主页的分类形式,但是超过二级分类的,要在二级分类下加个小小的下拉菜单,再或者我还要根据用户权限,禁用一部分分类的CHECKBOX,看看JTREE,我想还是自立更生吧。
===================================================================================
下面就说说我实现的功能吧: 因为很多树的前面修饰的小图片都是一张张小图,加载时会出现图片是个X的情况,有时还一大排,太不好了,如果我想改下外观,又要改一张张小图,又要改生成树的代码太累了,所以我把树的所有风格做的一张图里,用CSS的控制背景,就OK了,要改外观,改下那张背景图,改下CSS,就行了,可以做个换肤的效果了:)
加了个CHECKBOX的连动选择功能。
可以把所有的一级分类当成根目录显示。
因为在服务端生成,所有不存在XSLT的兼容问题。
因为实际应用中,我们可能希望XML中有些信息不要给客户看,如果要在客户端生成,还要专门处理下XML。在服务端处理,在xslt加个xsl:param 可以很灵活的实现各种需求。
生成的树的windows98的风格和window2003的风格(也就是有没有中间的那些线),用的是不同的XSLT(相同的也行,不过有点浪费资源,毕竟98的风格要比2003写多点XSLT),window2003的风格的XSLT很简洁。
准备要实现的:
用COOKIES保持树的状态,支持页面的同时存在分类树,支持各个不同页面的分类树的状态保持。[用一个公用的JS实现]
展开全部,折叠全部
预先展开某些节点
加入节点的下拉菜单
AJAX加载
在树中的进行各种控制,比如隐藏分类不让操作,推荐分类加红色字,再换个修饰小图标。一个分类的前面修饰小图标可自定。 树的展开有动画效果(这个好像是好看,不实用)。
利用树的XML结构得到无限极的SELECT的连动菜单,当然也是XSLT生成的:)
|