基于thinkphp框架站点导航

首先我在我的数据库 里面建有一个tasoo_node数据
相关字段是
nid :_pk
pid(父节点)
nodeText 节点名称
description 节点描述
后面我会依照这个数据库生成一个 SiteMap.xml的数据源文件 保存在 ./appName/runtime/data/文件夹下面
这个文件的格式如下

  1.   
  2. .....
复制代码

总之就可以用这个文件描述树的结构
好 准备工作好了
首先建立树的类
类名: Tree.class .php 保存在ThinkPHP /lib/Com/CNTY/文件夹下
相关代码如下

  1. // +----------------------------------------------------------------------
  2. // | Tasoo all right resvered        
  3. // +----------------------------------------------------------------------
  4. // | 中国微型软件,电子商务系统
  5. // +----------------------------------------------------------------------
  6. // | 作者 Tasoo
  7. // +----------------------------------------------------------------------
  8. // | E-MAIL: [email protected]
  9. // +----------------------------------------------------------------------
  10. // $Id$
  11. /**
  12. +------------------------------------------------------------------------------
  13. * Tree 实现
  14. +------------------------------------------------------------------------------
  15. * @category   Com
  16. * @package  Com
  17. * @subpackage  Tasoo
  18. * @author   Tasoo
  19. * @version   $Id$
  20. +------------------------------------------------------------------------------
  21. */
  22. class Tree
  23. {
  24.     protected  $data    = array();
  25.     protected $child    = array(-1=>array());
  26.     protected $layer    = array(-1=>-1);
  27.     protected $parent    = array();
  28.     function __construct ($value)
  29.     {
  30.         $this->setNode(0, -1, $value);
  31.     } // end func
  32.     protected function setNode ($id, $parent, $value)
  33.     {
  34.         $parent = $parent?$parent:0;
  35.         $this->data[$id]            = $value;
  36.         $this->child[$id]            = array();
  37.         $this->child[$parent][]        = $id;
  38.         $this->parent[$id]            = $parent;
  39.         if (!isset($this->layer[$parent]))
  40.         {
  41.             $this->layer[$id] = 0;
  42.         }
  43.         else
  44.         {
  45.             $this->layer[$id] = $this->layer[$parent] + 1;
  46.         }
  47.     } // end func
  48.     protected function getList (&$tree, $root= 0)
  49.     {
  50.         foreach ($this->child[$root] as $key=>$id)
  51.         {
  52.             $tree[] = $id;
  53.             if ($this->child[$id]) $this->getList($tree, $id);
  54.         }
  55.     } // end func
  56.     protected function getValue ($id)
  57.     {
  58.         return $this->data[$id];
  59.     } // end func
  60.     protected function getLayer ($id, $space = false)
  61.     {
  62.         return $space?str_repeat($space, $this->layer[$id])this->layer[$id];
  63.     } // end func
  64.    protected function getParent ($id)
  65.     {
  66.         return $this->parent[$id];
  67.     } // end func
  68.     protected function getParents ($id)
  69.     {
  70.         while ($this->parent[$id] != -1)
  71.         {
  72.             $id = $parent[$this->layer[$id]] = $this->parent[$id];
  73.         }
  74.         ksort($parent);
  75.         reset($parent);
  76.         return $parent;
  77.     } // end func
  78.    
  79.     protected function getChilds ($id = 0)
  80.     {
  81.         $child = array($id);
  82.         $this->getList($child, $id);
  83.         return $child;
  84.     } // end func
  85. } // end class
  86. ?>
复制代码

现在介绍从数据库区数据然后生成SiteMap.xml文件的类
类名是: BuildSiteMap.class.php 保存在ThinkPHP/lib/Com/CNTY/文件夹下
相关代码是

  1. // +----------------------------------------------------------------------
  2. // | Tasoo all right resvered        
  3. // +----------------------------------------------------------------------
  4. // | Tasoo
  5. // +----------------------------------------------------------------------
  6. // | 作者 Tasoo
  7. // +----------------------------------------------------------------------
  8. // | E-MAIL:[email protected]
  9. // +----------------------------------------------------------------------
  10. // $Id$
  11. /**
  12. +------------------------------------------------------------------------------
  13. * Tree 实现
  14. +------------------------------------------------------------------------------
  15. * @category  Com
  16. * @package  Com
  17. * @subpackage Tasoo
  18. * @author   Tasoo
  19. * @version   $Id$
  20. +------------------------------------------------------------------------------
  21. */
  22. import ('Com.CNTY.Tree');
  23. class BuildSiteMap extends Tree{
  24.         private $nodeData=array();
  25.         private $nodeXML ;//这个用于递归方法保存节点XML,用于为建立siteMap.xml,
  26.         function __construct($data,$rootName){
  27.                 parent::__construct($rootName);
  28.                 $this->nodeData=$data;
  29.                 $this->init();
  30.         }
  31.         private function init(){
  32. /**
  33. * 这个函数 负责装入数据
  34. *
  35. */
  36.         foreach ($this->nodeData as $item){
  37.                         $this->setNode ($item['nid'],$item['pid'], $item['nodeText']);
  38.                 }                        
  39.         }
  40.         private function buildXML($root= 0){
  41.                 foreach ($this->child[$root] as $key=>$id){
  42.                         $this->nodeXML.="getValue($id)}/" description=/"呵呵呵/" nid=/"$id/" pid=/"$root/">";
  43.             if ($this->child[$id]) $this->buildXML( $id);
  44.            $this->nodeXML.="";
  45.         }
  46.         }
  47.         public function saveXML($filePath){
  48.                 if(!file_exists($filePath))
  49.                 return ;
  50.                 $this->nodeXML="";
  51.                 $this->buildXML(-1);
  52.                 $this->nodeXML.="";
  53.                 $xml=new  DOMDocument();
  54.                 $xml->formatOutput = true;
  55.                 $xml->preserveWhiteSpace = false;
  56.                 $xml->loadXML($this->nodeXML);
  57.                 $xml->save($filePath);
  58.         }
  59. }
  60. ?>
复制代码

这个类只在改变数据表tasoo_node才需要运行
这个一个函数就是解析 SiteMap.xml文件的函数
函数名: ShowPath($nid) 放在 ./appName/common/functions.php
相关代码:

  1. /**
  2. +----------------------------------------------------------
  3. * 显示站的路径
  4. +----------------------------------------------------------
  5. * @access public
  6. +----------------------------------------------------------
  7. * @param int $nid 栏目ID
  8. +----------------------------------------------------------
  9. * @return array
  10. +----------------------------------------------------------
  11. */
  12. function ShowPath($nid=-1){
  13.         $path=array();
  14.         $nid=$nid;
  15.         $SiteMapFile=DATA_PATH."SiteMap.xml";
  16.         $Dom=new DOMDocument();
  17.         $Dom->load($SiteMapFile);
  18.         $tasoo=$Dom->getElementsByTagName("SiteMapNode");
  19.         //dump($tasoo);
  20.         //foreach ($tasoo as $item){
  21.         //        dump($item->getAttribute('title'));
  22.         //}
  23.         $query=new DOMXPath($Dom);
  24.         $target=$query->query("//SiteMapNode[@nid=/"$nid/"]");
  25.         $target=$target->item(0);
  26.         //dump($target->parentNode);
  27.         while($target->parentNode){
  28.                 $path[]=array(
  29.                 'title'=>$target->getAttribute("title"),
  30.                 'nid'=>$target->getAttribute("nid"),
  31.                 'pid'=>$target->getAttribute("pid"),
  32.                 'description',$target->getAttribute("description"),
  33.                 'url'=>$target->getAttribute("url")
  34.                 );
  35.                 $target=$target->parentNode;
  36.         }
  37.         $path=array_reverse($path);
  38.         array_shift($path);
  39.         return $path;
  40. }
复制代码

这个函数通过解析xml文件 然后返回一个 array('title'=>title','nid'=>nid,.....);形式的数组
用于在标签 解析时候调用

在/ThinkPHP/Lib/Think/Template/Tags文件夹下建立 tasoo.xml
在/ThinkPHP/Lib/Think/Template//TagLib 建立相应的解析类 TagLibTasoo.class.php
tasoo.xml如下

  1. tasoo
  2.         GetPath
  3.         empty
  4.         
  5.                 nid
  6.                 true
  7.         
复制代码

TagLibTasoo.class.php 代码如下

  1. // +----------------------------------------------------------------------
  2. // | Tasoo all right resvered        
  3. // +----------------------------------------------------------------------
  4. // | Tasoo
  5. // +----------------------------------------------------------------------
  6. // | 作者 Tasoo
  7. // +----------------------------------------------------------------------
  8. // | E-MAIL: [email protected]
  9. // +----------------------------------------------------------------------
  10. // $Id$
  11. import('TagLib');
  12. /**
  13. +------------------------------------------------------------------------------
  14. * Tasoo标签库解析类
  15. +------------------------------------------------------------------------------
  16. * @category   Think
  17. * @package  Think
  18. * @subpackage  Template
  19. * @author   Tasoo
  20. * @version   $Id$
  21. +------------------------------------------------------------------------------
  22. */
  23. class TagLibTasoo extends TagLib{
  24.    public function _GetPath($attr){
  25.                    $tag= $this->parseXmlAttr($attr,'GetPath');
  26.                    $nid=(int)$tag['nid'];
  27.                    $pathData=ShowPath($nid);
  28.                    $Html="
    您当前的位置 : /n";
  29.                    foreach($pathData as $item){
  30.                            $Html.=" ".$item['title']."  >>/n";
  31.                    }
  32.                    $Html.="
";
  •                    return $Html;
  •    }
  • }
  • ?>
  • 复制代码

    呵呵 大功告成了 这后就可以在相应的模板 里这样调用

    发个我自己运行的结果

    你可能感兴趣的:(框架,function,tree,encoding,url,path,Web开发,thinkphp)