thinkphp3.1無限級分類模塊的設計

實現無限級分類通常只用一個數據表,一般可經過遞歸和非遞歸兩種方法來實現。遞歸方法必須使用遞歸 php

調用方式才能進行數據遍歷,刪除等操做,因此須要發送屢次查詢數據庫語句,很是影響執行效率。那麼 html

非遞歸該怎樣來實現無限分類呢?簡單來講可用一張表四個字段和一條語句來實現。
一、一張表四個字段
DROP TABLE IF EXISTS `wb_columns`;
CREATE TABLE `eway_columns` (
  `colId` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
  `colPid` smallint(5) unsigned NOT NULL DEFAULT '0',
  `colPath` varchar(100) NOT NULL DEFAULT '',
  `colTitle` varchar(100) NOT NULL DEFAULT '',
  PRIMARY KEY (`colId`),
  KEY `colPath` (`colPath`)
) ENGINE=MyISAM  CHARSET=utf8; web

二、一條語句
SELECT concat(colPath,'-',colId) AS bpath, colId,colPid,colPath, colTitle,  FROM " . C thinkphp

('DB_PREFIX') . "columns ORDER BY bpath, colId;
 在上面的一條語句的SQL查詢中,使用MYSQL中的concat函數將colPath和colId字段經過字符"-"鏈接起來 數據庫

,並將該字段設置爲bpath別名。而後先經過bpathpb 字段進行排序,若是有相同的路徑再經過colId字段 函數

進行排序,這樣就會以分類的各級層次結構將結果返回。
下面是在thinkphp3.1中非遞歸無限級分類的實現代碼
<?php
/**
 * 分類Columns的控制器ColumnsAction.class.php
 */
class ColumnsAction extends Action{
//分類列表
public function index(){
                   
         $catarray=$this->Catlist();
                   
         $this->assign('catarray',$catarray);
                 
         $this->display();  
          }
              
//分類添加表單     
public function insert() {
             $catarray=$this->Catlist();
                   
         $this->assign('catarray',$catarray);
                 
         $this->display();          
    
}
             
public function add() {
        $D = D($module);
        if ($vo = $D->create()) {//由於使用模型類處理,自動完成必須經過create方法才能生效。
            $list = $D->add();
            if ($list !==false) {
                $this->success("添加成功");
            } else {
                $this->error('添加失敗');
            }
                
        } else {
            $this->error($D->getError());
        }
    }
//實現樹型層級的分類
function Catlist() {
        $Columns = new Model;
        $Module = M("News");
        $list = $Columns->query("SELECT concat(colPath,'-',colId) AS bpath, this

colId,colPid,colPath, colTitle,  FROM " . C('DB_PREFIX') . "columns ORDER BY bpath, colId");
    
        foreach ($list as $k => $v) {
            $list[$k]['count'] = count(explode('-', $v['bpath']));
            $list[$k]['total'] = $Module->where('catid=' . $v['colId'])->count();
            $str = '';
            if ($v['colPid'] <> 0) {
                for ($i = 0; $i < $list[$k]['count'] * 2; $i++) {
                    $str .= '&nbsp;';
                }
                $str .= '|-';
            }
            $list[$k]['space'] = $str;
        }
    
        return $list;
    }
    
    
/**
 * 分類Columns的模型類ColumnsModel.class.php
 * 做用:在添加分類或修改分類時自動處理colPath字段並保存到數據庫中
 * callback :回調方法 ,表示填充的內容是一個當前模型的方法
 * Model:: MODEL_INSERT 或者1新增數據時候驗證
 * Model:: MODEL_UPDATE 或者2編輯數據時候驗證
 * Model:: MODEL_BOTH 或者3 所有狀況下驗證(默認),這裏選擇該驗證。
 */
<?php
class ColumnsModel extends Model{
        protected $_auto=array(//thinkphp的自動填充
            array('colPath','colPath',3,'callback'),
                    
        );
                        
       function colPath(){
        $colPid=isset($_POST['colPid'])?(int)$_POST['colPid']:0;
        $colId=$_POST['colId'];
            if($colPid==0){            
                return 0;
            }
                
            $fat=$this->where('colId='.$colPid)->find();//查詢的是父級ID
            $data=$fat['colPath'].'-'.$fat['colId'];//獲得父級的colPath,連上父級ID,返回的 spa

是子級的colPath               
            return $data;
        }
} htm

須要注意的是,這是使用模型的自動完成功能,因此必須經過create方法才能生效,Create方法建立的數 對象

據對象是保存在內存中,並無實際寫入到數據庫中,直到使用add方法才真正寫入數據庫中。
完整的實例下載WBlog博客程序。
本文首發網誌博客,歡迎轉載!轉載請註明本文地址,謝謝。 

本文地址:http://www.w3note.com/web/32.html 

相關文章
相關標籤/搜索