1. 程式人生 > >完善 無限極分類 的 無重新整理編輯

完善 無限極分類 的 無重新整理編輯

參考網址
http://www.56gee.com/demoshow/8aeb74e423/?tdsourcetag=s_pcqq_aiomsg

最終效果
在這裡插入圖片描述
我是 如何和 資料庫 建立連線的
html 頁面中

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 	"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="author" content="56gee 39℃" />
<meta name="ComeFrom" content="www.56gee.com" />
<script src="/tpl/default/static/js/jquery-2.2.3.min.js"></script>
<script src="/tpl/default/static/js/bootstrap.js"></script>

<title>Jquery實現無限極樹狀結構並動態新增增刪改等編輯功能——56gee</title>
<style type="text/css">
div, ul, li {
  margin: 0px;
  padding: 0px;
  list-style-type: none;
}

body {
  background-color: #FFFFFF;
  font-size: 12px;
  margin: 0px;
  padding: 0px;
}

#TreeList {
  background-color: #FFFFFF;
  margin-top: 6px;
  margin-right: auto;
  margin-bottom: 6px;
  margin-left: auto;
  border: 1px solid #5d7b96;
  padding-bottom: 6px;
  padding-left: 6px;
  width: 680px;
}
#TreeList .mouseOver {
  background-color: #FAF3E2;
}

#TreeList .ParentNode {
  line-height: 21px;
  height: 21px;
  margin-top: 2px;
  clear: both;
}

#TreeList .ChildNode {
  background-image: url(../demoImgs/Sys_ModuleIcos.png);
  /*background-image: url('/tpl/default/static/images/duigou.jpg');*/

  background-position: 15px -58px;
  padding-left: 39px;
  line-height: 21px;
  background-repeat: no-repeat;
  border-top-width: 0px;
  border-right-width: 0px;
  border-bottom-width: 1px;
  border-left-width: 0px;
  border-top-style: dashed;
  border-right-style: dashed;
  border-bottom-style: dashed;
  border-left-style: dashed;
  border-top-color: #aabdce;
  border-right-color: #aabdce;
  border-bottom-color: #aabdce;
  border-left-color: #aabdce;
  cursor: default;
  clear: both;
  height: 21px;
  color: #314f6a;
}

#TreeList .title {
  float: left;
}
#TreeList .input {
  font-size: 12px;
  line-height: 18px;
  color: #FFF;
  height: 16px;
  background-color: #3F6B8F;
  width: 120px;
  text-align: center;
  margin-top: 1px;
  border-top-width: 1px;
  border-right-width: 1px;
  border-bottom-width: 1px;
  border-left-width: 1px;
  border-top-style: solid;
  border-right-style: solid;
  border-bottom-style: solid;
  border-left-style: solid;
  border-top-color: #1F3547;
  border-right-color: #FFF;
  border-bottom-color: #FFF;
  border-left-color: #1F3547;
  float: left;
}
#TreeList .editBT {
  float: left;
  overflow: visible;
}
#TreeList .editBT .ok {
  /*background-image: url('/tpl/default/static/images/duigou.jpg');*/
  background-image: url(/tpl/default/static/images/duigou.png);
  
  /*background-image: url(../demoImgs/Sys_ModuleIcos.png);*/
  background-repeat: no-repeat;
  background-position: 0px -89px;
  height: 13px;
  width: 12px;
  float: left;
  margin-left: 3px;
  padding: 0px;
  margin-top: 3px;
  cursor: pointer;
}
#TreeList .editBT .cannel {
  background-image: url(../demoImgs/Sys_ModuleIcos.png);
  background-repeat: no-repeat;
  background-position: 0px -120px;
  float: left;
  height: 13px;
  width: 12px;
  margin-left: 3px;
  padding: 0px;
  margin-top: 3px;
  cursor: pointer;
}

#TreeList .editArea {
  float: right;
  color: #C3C3C3;
  cursor: pointer;
  margin-right: 6px;
}

#TreeList .editArea span {
  margin: 2px;
}

#TreeList .editArea .mouseOver {
  color: #BD4B00;
  border-top-width: 1px;
  border-right-width: 1px;
  border-bottom-width: 1px;
  border-left-width: 1px;
  border-top-style: solid;
  border-right-style: solid;
  border-bottom-style: solid;
  border-left-style: solid;
  border-top-color: #C9925A;
  border-right-color: #E6CFBB;
  border-bottom-color: #E6CFBB;
  border-left-color: #C9925A;
  background-color: #FFFFFF;
  margin: 0px;
  padding: 1px;
}

#TreeList .ParentNode .title {
  color: #314f6a;
  cursor: pointer;
  background-image: url(../demoImgs/Sys_ModuleIcos.png);
  background-repeat: no-repeat;
  padding-left: 39px;
}

#TreeList .ParentNode.show .title {
  font-weight: bold;
  background-position: 3px -27px;
}

#TreeList .ParentNode.hidden .title {
  background-position: 3px 4px;
}

#TreeList .ParentNode .editArea {
  color: #999;  
}
#TreeList .ParentNode.show {
  background-color: #d1dfeb;
  border-top-width: 0px;
  border-right-width: 0px;
  border-bottom-width: 1px;
  border-left-width: 1px;
  border-top-style: solid;
  border-right-style: solid;
  border-bottom-style: solid;
  border-left-style: solid;
  border-top-color: #5d7b96;
  border-right-color: #5d7b96;
  border-bottom-color: #5d7b96;
  border-left-color: #5d7b96;
}

#TreeList .ParentNode.hidden {
  border-top-width: 0px;
  border-right-width: 0px;
  border-bottom-width: 1px;
  border-left-width: 0px;
  border-top-style: dashed;
  border-right-style: dashed;
  border-bottom-style: dashed;
  border-left-style: dashed;
  border-top-color: #aabdce;
  border-right-color: #aabdce;
  border-bottom-color: #aabdce;
  border-left-color: #aabdce;
}

#TreeList .Row {
  clear: both;
  margin-left: 24px;
  background-image: url(../demoImgs/Sys_ModuleIcos2.png);
  background-repeat: repeat-y;
  background-position: 7px 0px;
}
</style>

<script type="text/javascript" src="/js/jquery-1.5.min.js"></script>
<script type="text/javascript">


$(document).ready(function(e) {
  var TreeName = 'TreeList';//樹狀ID
  var PrentNodeClass = 'ParentNode';//父節點的標識
  var ChildNodeClass = 'ChildNode';//沒有下級子節點的標識
  var ChildrenListClass = 'Row';//子節點被包著的外層樣式
  var NewNodeName = '新建目錄';//預設新建節點的名稱
  var Orititle = 'Temptitle';//儲存原來名稱的屬性名稱
  
  var TModuleNode,TChildNode,TModuleNodeName;
  TModuleNode = $('#TreeList .'+PrentNodeClass);//頂層節點
  TChildNode = $('.'+ChildNodeClass);
  TModuleNodeName = $('#TreeList .' + PrentNodeClass + ' .title');//頂層節點名稱
  TModuleNode.removeClass('show').addClass('hidden');
  if(TModuleNode.next().hasClass(ChildrenListClass)){
    TModuleNode.next().css('display','none');//緊跟的下一個是子節點
  }
  
  //========================編輯區域的HTML原始碼==============================
  function EditHTML(NewName){
    var str = '<div class="title">' + NewName + '</div>';
    str += '<div class="editBT"></div>';
    str += '<div class="editArea"><span>[編輯]</span><span>[新增同級目錄]</span><span>[新增下級目錄]</span><span>[刪除]</span></div>';
    return str;
  } 
  
  //==========================樹狀展開收縮的效果============================
  TModuleNodeName.click(function(){
    TModuleNodeName_Click($(this));
  });
  
  //-------------------------------(定義)----------------------------------
  function TModuleNodeName_Click(Obj){
    if(Obj.has('input').length==0){     //非編輯模式下進行
      var tempNode = Obj.parent();
      if(tempNode.hasClass('hidden')){
        tempNode.removeClass('hidden').addClass('show');
        if(tempNode.next().hasClass(ChildrenListClass)){
        tempNode.next().css('display','');
        }
      }
      else{
        tempNode.removeClass('show').addClass('hidden');
        if(tempNode.next().hasClass(ChildrenListClass)){
          tempNode.next().css('display','none');
        }
      }
    }
  } 
  //==========================滑鼠經過、離開節點的效果============================  
  with(TModuleNode){
    mouseover(function(){
    TNode_MouseOver($(this));
    });
    
    mouseout(function(){
    TNode_MouseOut($(this));
    });
  }
  
  with(TChildNode){
    mouseover(function(){
    TNode_MouseOver($(this));
    });
    
    mouseout(function(){
    TNode_MouseOut($(this));
    });
  }
  
  //-------------------------------(定義)----------------------------------
  function TNode_MouseOver(Obj){
    if(!(Obj.hasClass('show'))){
      Obj.addClass('mouseOver');
    }
  }
  
  function TNode_MouseOut(Obj){
    Obj.removeClass('mouseOver');
  }
    
  //==========================編輯區操作============================ 
  $('.editArea').each(function(){   //1.編輯,刪除什麼第一步都先走這個。。$(this) 是指當前的物件,也就是
    EditArea_Event($(this));
  });
  //-------------------------------(定義)----------------------------------
  function EditArea_Event(Obj){    //Obj這個是當前編輯的物件 <input type="text" class="input" value="測試模組">
    var objParent = Obj.parent();   //是父節點
    var objTitle = objParent.find('.title');//節點名稱

     //-----------------編輯區的滑鼠效果------------------ 
    Obj.children().each(function(){
      with($(this)){
        mouseover(function(){
        $(this).addClass('mouseOver');
        });
        mouseout(function(){
        $(this).removeClass('mouseOver');
        });
      }
    });
     //--------------------第一步,判斷是哪個操作----------------------------- 
    Obj.children().each(function(index, element) {
      $(this).click(function(){
      
       // index 是數字,element 是對應的html元素
        if($('#TreeList').has('input').length==0){
        switch(index){
          case 0: EditNode(objTitle,objTitle.html());break;//編輯
          case 1: AddNode(0,objParent,NewNodeRename(0,objTitle));break;//新增同級目錄
          case 2: AddNode(1,objParent,NewNodeRename(1,objTitle));break;//新增下級目錄
          case 3: DelNode(objParent);break;//刪除
        }
       
        }
        else{
        alert('請先取消編輯狀態!'); 
        }
      });
    });
  }
  //************************************************************************************************************
  //************************************************************************************************************
  
  //===============================驗證編輯結果================================
  function CheckEdititon(pNode,text){
    var SameLevelTags = new Array(PrentNodeClass,ChildNodeClass);
    var SameLevelTag  = '';
    for(var i=0;i<SameLevelTags.length;i++){
      if(pNode.parent().attr('class').indexOf(SameLevelTags[i]) > -1){
        SameLevelTag = SameLevelTags[i];
        break;
      }
    }
    if(SameLevelTag!=''){
      if(text!=''){
      //---------------- 根據節點樣式遍歷同級節點 --------------------
      var IsExsit = false;
      pNode.parent().parent().children('div').children('.title').each(function(){
        if(pNode.find('input').val()==$(this).html()){
          IsExsit = true;
          alert('抱歉!同級已有相同名稱!');
          return false;
        }
      });
      return !IsExsit;
      }
      
      else{
        alert('不能為空!');
        return false;
      }
    }
  }
  
  //=================================自動命名================================
  function NewNodeRename(tag,pNode){
    //---------------- 根據節點樣式遍歷同級節點 --------------------
    var MaxNum = 0;
    var TObj;
    if(tag==0){//新增同級目錄
      if(pNode.attr('id')==TreeName){
        TObj = pNode.children('div').children('.title');
      }
      else{
        TObj = pNode.parent().parent().children('div').children('.title');
      }
       var dataid =TObj.attr('data_id');    // 新增同級時候有
    }
    else{   //新增下級目錄
      var aaa = pNode.parent().next().html();

      // if(pNode.parent().next().html()!=null){//原來已有子節點
      if(aaa.indexOf('編輯') != -1){//原來已有子節點
        TObj = pNode.parent().next().children('div').children('.title');
        // alert(1);
        // console.log(TObj);
        
      }
      else{//沒有子節點
        // TObj = null;
        // alert(2);
        TObj = pNode.parent().children('div').children('.title');
        // var dataid = TObj.parent().find('.title').attr('data_id');
        // var dataid = TObj.prevObject.find('.title').attr('data_id');
   
        var arr = TObj.prevObject[0];   // html
        var arr1 = $(arr);              // 轉化成jquery
        var dataid = arr1.attr('data_id');   // 我這獲取的是data_id
        // alert(arr1.attr('data_id'));
      } 
    }
    
    if(TObj){
      TObj.each(function(){
        var CurrStr = $(this).html();
        var temp;
        if(CurrStr.indexOf(NewNodeName)>-1){
          temp = parseInt(CurrStr.replace(NewNodeName,''));
          if(!isNaN(temp)){
            if(!(temp<MaxNum)){
              MaxNum = temp + 1;
            }
          }
          else{
          MaxNum = 1;  
          }
        }
      });
    }

  
    // var dataidxiaji =TObj.parent().find('.title').attr('data_id');   // 取的點選新增同級目錄時,同一結構的第一個div的id
    // console.log(dataid);
  
    var TempNewNodeName = NewNodeName;
    if(MaxNum>0){
      TempNewNodeName += MaxNum;
    }
    var array = TempNewNodeName+'=='+dataid;
    // return TempNewNodeName;    // 新建目錄名稱
    

    return array;    // 新建目錄名稱加id

  }
  
  //=============================== 第二步是確定編輯還是取消  編輯定義 ================================
  function EditNode(obj,text){

     // alert(obj.attr('data_id'));  // 得到id

    obj.attr(Orititle,text);//將原來的text儲存到Orititle中,         text是原來模組操作的名字
    obj.html("<input type='text' class=input value=" + text + ">"); //切換成編輯模式
    obj.parent().find('.editBT').html("<div class=ok title=確定></div><div class=cannel title=取消></div>");
    obj.has('input').children().first().focusEnd();//聚焦到編輯框內

  // 點選確定點選取消,觸發的操作
    obj.parent().find('.ok').click(function(){
      Edit_OK(obj); 
    });
    
    obj.parent().find('.cannel').click(function(){
      Edit_Cannel(obj);
    });
  }
  
 
  
  //=============================== 新增節點 目錄================================
  function AddNode(tag,obj,NameStr){
    arr = NameStr.split("==");
    NameStr = arr[0];       // 這就是 自動命名的  新建目錄,
    id = arr[1];            // 我獲取的是同一級的第一個id,  
    // alert('新增節點');
    // 現在新增同級是獲取的同級的第一個id,新增下級的是獲取的當前id
    
    if(tag==0 || tag==1){
      var newNode = $('<div class=' + ChildNodeClass + '></div>');

      if(tag==0){ //新增同級目錄

        newNode.appendTo(obj.parent());
      }
      else{     //新增下級目錄

        if(!(obj.next()) || (obj.next().attr('class')!=ChildrenListClass)){//最後一個節點和class!=ChildrenListClass都表示沒有子節點
          var ChildrenList = $('<div class=' + ChildrenListClass + '></div>');
          ChildrenList.insertAfter(obj);//將子節點的”外殼“加入到物件後面
          newNode.appendTo(ChildrenList);//將子節點加入到”外殼“內
        }
        else{
          newNode.appendTo(obj.next());//將子節點加入到”外殼“內
        }
        obj.attr('class',PrentNodeClass + ' show');//啟用父節點展開狀態模式
        obj.next().css('display','');//展開子節點列表
      }
     
      with(newNode){
        html(EditHTML(NameStr)); // 這是用來顯示編輯框的好像
        //---------------------------------動態新增事件-------------------------------
        mouseover(function(){
        TNode_MouseOver($(this));
        });
        
        mouseout(function(){
        TNode_MouseOut($(this));
        });
        
        find('.title').click(function(){
          TModuleNodeName_Click($(this));
        });
        
        find('.editArea').each(function(){
          EditArea_Event($(this));
        });
        //---------------------------------------------------------------------------
      }
  
      // 點選新增目錄時,輸入的名字就是傳過去的
      // 調的 EditNode 方法,走編輯狀態,這是第一種方法,把預設名字存進資料庫再點選編輯進行修改新目錄名稱
      // EditNode(newNode.find('.title'),newNode.find('.title').html());//新增後自動切換到編輯狀態

	// 這是第二種方法,直接把使用者輸入的目錄名存進資料庫
      var obj2 = newNode.find('.title');
      var text = newNode.find('.title').html();
      obj2.attr(Orititle,text);//將原來的text儲存到Orititle中,         text是原來模組操作的名字
      obj2.html("<input type='text' class=input value=" + text + ">"); //切換成編輯模式
      obj2.parent().find('.editBT').html("<div class=ok title=確定></div><div class=cannel title=取消></div>");
      obj2.has('input').children().first().focusEnd();//聚焦到編輯框內
      console.log(obj2);
     // alert(obj.attr('data_id'));  // 得到id

      // 點選確定點選取消,觸發的操作
      obj2.parent().find('.ok').click(function(){
          // alert('ok');
          var tempText = obj2.has('input').children().first().val();   // 文字內容
          // var id = obj.attr('data_id');   // 編輯操作的id
          // alert(tempText);
          $.ajax({
            url:'ewm-xuqiu_add333',
            type:'POST',
            data:{
                pid : id,        // 根據判斷tag來決定傳過來的id做父id還是它是子id       
                name: tempText,   // 預設名字  新建目錄
                tag:tag,      // 判斷是新增同級目錄還是下級目錄
            },
            dataType:'json',
            success:function(data){
                // console.log(data);
                if(data.code == '3'){
                     alert('新增分類成功');
                     // alert('data.id');
                }
                if(data.code == '4'){
                     alert('新增分類失敗');
                }
                // location.reload(true);   
            },
            error:function(data){
                // console.log(data);
               // alert('新增失敗');              
            }
        })  


        // 原先的js樣式  
        if(CheckEdititon(obj2,tempText)){
          obj2.html(tempText);
        }
        else{
          obj2.html(obj2.attr(Orititle));  
        }
        obj2.removeAttr(Orititle);
        obj2.parent().find('.editBT').html('');


        });


        
        obj.parent().find('.cannel').click(function(){
          // Edit_Cannel(obj);
        });
  

    }

  }
 
 
  //=============================== [刪除]按鈕 ================================
  function DelNode(obj){    // 這個obj 是editarea的父節點    editarea父節點的find 發現 class等於title的標籤,然後在取在這個標籤的data_id 屬性
    
    // console.log(obj);
    if(confirm('確定要刪除嗎?')){
      var objParent = obj.parent();
      var objChildren = obj.next('.Row');
      // var id = objParent.attr('data_id');
      var id = obj.find('.title').attr('data_id');  //節點名稱
      $.ajax({
            url:'ewm-xuqiu_delete333',
            type:'POST',
            data:{
                id : id,
            },
            dataType:'json',
            success:function(data){
                // alert(111);
                console.log(data);
                if(data.code == '3'){
                     alert('刪除分類成功');
                }
                if(data.code == '4'){
                     alert('刪除分類失敗');
                }
                if(data.code == '5'){
                     alert('模組下操作不能空,不能刪除');
                }
                // location.reload(true);
            },
            error:function(data){
                alert(222);
                console.log(data);
            }
        }) 

      // 原來js樣式
      obj.remove();//基於Jquery是利用解構函式,所以“刪除”後其相關屬性仍然存在,除非針對ID來操作就可以徹底刪除
      objChildren.remove();//刪除物件所有子節點
      ChangeParent(objParent);

    }
  }
  
  
  //===============================第3步 確定編輯操作  編輯[確定]按鈕 ================================
  function Edit_OK(obj){
    var tempText = obj.has('input').children().first().val();   // 文字內容
    var id = obj.attr('data_id');   // 編輯操作的id
            
    $.ajax({
        url:'ewm-xuqiu_update333',
        type:'POST',
        data:{
            name : tempText,
            id : id,
        },
        dataType:'json',
        success:function(data){
            // console.log(data);
            if(data.code == '3'){
                 // alert('編輯成功');
            }
            if(data.code == '4'){
                 alert('編輯失敗');
            }
            // location.reload(true);
        },
        error:function(data){
           alert('編輯失敗');
        }
    })  

    // 原先的js樣式  
    if(CheckEdititon(obj,tempText)){
      obj.html(tempText);
    }
    else{
      obj.html(obj.attr(Orititle));  
    }
    obj.removeAttr(Orititle);
    obj.parent().find('.editBT').html('');

  }
  
 
  //=============================== 編輯[取消]按鈕 ================================
  function Edit_Cannel(obj){
    obj.html(obj.attr(Orititle));
    obj.removeAttr(Orititle);
    obj.parent().find('.editBT').html('');
  }
  
  //=============================== 改變父節點樣式 ================================
  function ChangeParent(obj){
    if(obj.find('.ChildNode').length==0){//沒有子節點
      obj.prev('.'+PrentNodeClass).attr('class',ChildNodeClass);
      obj.remove();
    }
  }
  
  //************************************************************************************************************
  //************************************************************************************************************
  //************************************************************************************************************
  
  //=============================== 設定聚焦並使游標設定在文字最後 ================================
  $.fn.setCursorPosition = function(position){  
    if(this.lengh == 0) return this;  
    return $(this).setSelection(position, position);  
  }  
    
  $.fn.setSelection = function(selectionStart, selectionEnd) {  
    if(this.lengh == 0) return this;  
    input = this[0];  
    
    if (input.createTextRange) {
      var range = input.createTextRange();  
      range.collapse(true); 
      range.moveEnd('character', selectionEnd);  
      range.moveStart('character', selectionStart);  
      range.select(); 
    } else if (input.setSelectionRange) {  
      input.focus(); 
      input.setSelectionRange(selectionStart, selectionEnd);  
    }  
    return this;  
  }  
    
  $.fn.focusEnd = function(){
    this.setCursorPosition(this.val().length);  
  }
  
  //=========================================================================================
  
});
</script>

<link href="/DemoShow/styles/public.css" rel="stylesheet" type="text/css" />
</head>

<body>
<div id="TopAD"></div>
<div id="TopADCode" style="display:none">
  <script type="text/javascript" >BAIDU_CLB_SLOT_ID = "772619";</script>
  <script type="text/javascript" src="http://cbjs.baidu.com/js/o.js"></script>
</div>
<script type="text/javascript">
if(document.getElementById('TopAD')!=null){
  document.getElementById('TopAD').innerHTML = '<div class="SearchEngine_AD1">' + document.getElementById('TopADCode').innerHTML + '</div>';
}
</script>
<div id="AD_B"></div>

<div id="TreeList">
<{foreach $commlist as $data}>

  <{foreach $data.children as $child}>
    <div class="ParentNode hidden">
      <!-- <div class="title" id="dataid" data_id="<{$child.id}>"><{$child.name}></div> -->
      <div class="title"  data_id="<{$child.id}>"><{$child.name}></div>
      <div class="editBT"></div>
      <div class="editArea" id="<{$child.id}>"><span>[編輯]</span><span>[新增同級目錄]</span><span>[新增下級目錄]</span><span>[刪除]</span></div>
    </div>
   
    <div class="Row" style="display:none">
    <{foreach $child.children as $grandson}>
      <div class="ParentNode">
        <div class="title"  data_id="<{$grandson.id}>"><{$grandson.name}></div>
        <div class="editBT"></div>
        <div class="editArea" id="<{$grandson.id}>"><span >[編輯]</span><span>[新增同級目錄]</span><span>[新增下級目錄]</span><span>[刪除]</span></div>
      </div>

            <div class="Row" style="display:none">
      <{foreach $grandson.children as $grandsonson}>
              <div class="ChildNode">
                <div class="title"  data_id="<{$grandsonson.id}>"><{$grandsonson.name}></div>
                <div class="editBT"></div>
                <div class="editArea" id="<{$grandsonson.id}>"><span>[編輯]</span><span>[新增同級目錄]</span><span>[新增下級目錄]</span><span>[刪除]</span></div>
              </div> 
      <{/foreach}>             
            </div>
        
      <{/foreach}>
    </div>
<{/foreach}>

<{/foreach}>
  </div>


<div id="AD_T"></div>
<div id="ADCode_B" style="display:none">
  <script src="/js/sogouad/AD_468-15.js" type="text/javascript"></script>
  <script language='JavaScript' type='text/javascript' src='http://images.sohu.com/cs/jsfile/js/l.js'></script>
</div>

<div id="ADCode_T" style="display:none">
  <script type="text/javascript" >BAIDU_CLB_SLOT_ID = "772426";</script>
  <script type="text/javascript" src="http://cbjs.baidu.com/js/o.js"></script>
</div>
<script type="text/javascript" >BAIDU_CLB_SLOT_ID = "772399";</script>
<script type="text/javascript" src="http://cbjs.baidu.com/js/o.js"></script>
<script type="text/javascript" src="/js/ad_alliance/ad_alliance.js"></script>

</body>
</html>

第2種頁面,以 - 格式展示下級目錄

         請選擇父級分類:<select name="pid" size="20">

         <option value="0">根分類</option>

         {volist name="alist" id="vo"}

           <option value="{$vo['id']}">
	// 統計有幾個 - 頁面就顯示幾個 —
           {:str_repeat("__",$vo['count']-2)}

           {$vo['name']}

           </option>

         {/volist}

         </select><br />

         新的分類名稱:<input type="text" name="name" /><br />

         <input type="submit" value="新增分類" />

  </form>

控制器中

第一種方法,以  -  遞進格式展示的html頁面
public function xuqiu()
{
    $list = K::M('code/xuqiu')->chaxun555();
    // var_dump($result);
    foreach($list as $key=>$value){
        $list[$key]['count']=count(explode('-',$value['bpath']));
    }
    // die;
    $this->pagedata['alist'] = $list;
    $this->tmpl = 'xuqiu_add.html';
}

public function xuqiu_list()
{
    $list = K::M('code/xuqiu')->chaxun555();
    foreach($list as $key=>$value){
        $list[$key]['count']=count(explode('-',$value['bpath']));
    }
     $this->pagedata['alist'] = $list;
    $this->tmpl = 'xuqiu_list.html';
}

public function xuqiu_add()
{
    echo '<pre>';
    $pid = $this->GP('pid');    // pid是新新增資料的id
    $name = $this->GP('name');
    // 執行新增操作
    $list = K::M('code/xuqiu')->add555($pid,$name);
    if($list)
    {
        $this->err->add('新增分類成功', 201);
    }else{
        $this->err->add('新增分類失敗', 201);
    }
    
    // var_dump($list);
    // die;
    $this->tmpl = 'xuqiu_add.html';
}

// 應該是 ajax 刪除
public function xuqiu_delete()
{
    echo '<pre>';
    $url = $this->request['uri'];    
    $url = explode('=',$url);
    $id = $url[1];
    $result = K::M('code/xuqiu')->chaxun222('pid',$id);
    // var_dump($result);
    // die;
    if($result)
    {
         $this->err->add('模組下操作不能空,不能刪除', 201);
    }else{
         $list = K::M('code/xuqiu')->delete('id',$id);
        // 設定有子類的情況下不能刪除
        if($list)
        {
            $this->err->add('刪除分類成功', 201);
        }else{
            $this->err->add('刪除分類失敗', 201);
        }
    }
    $this->tmpl = 'xuqiu_list222.html';
}


// 第2 種方法,是  欄目層級的展示頁面
public function xuqiu333()
{
    echo '<pre>';
    $list = K::M('code/xuqiu')->chaxun555();
    // $a = $this->array2level($list); // 這個有level欄位
    $b = $this->arr2tree($list);    // 展示出樹級結構,chilren,遍歷顯示在頁面

    $this->pagedata['commlist'] = $b;
    $this->tmpl = 'xuqiu_list222.html';
    
}

public function xuqiu_add222()
{
    // echo '<pre>';
    $name = $this->GP('name');
    $pid = $this->GP('id');
    $list = K::M('code/xuqiu')->addfenlei($pid,$name);
    // 返回json資料給前臺
    $returnData = json_encode($list,JSON_UNESCAPED_UNICODE); 
    // return $returnData;
    echo $returnData;   // 只有echo才打印資訊,如果是return就返回資訊為空,格式正確,但是走error
    exit;    
}

public function xuqiu_delete222()
{
    // echo '<pre>';
    $id = $this->GP('id');
    $a = K::M('code/xuqiu')->deletefenlei($id);
    $returnData = json_encode($a,JSON_UNESCAPED_UNICODE); 
    echo $returnData;   
    exit;    
}

// level 資料的展示
function array2level($array, $pid = 0, $level = 1) 
{ 
    static $list = []; 
    foreach ($array as $v) 
    { 
        if ($v['pid'] == $pid) 
        { 
            $v['level'] = $level;
            $list[] = $v; 
            $this->array2level($array, $v['id'], $level + 1);
         }
     } 
return $list; 
}

// tree 資料的展示
function arr2tree($tree, $rootId = 0,$level=1) 
{ 
    $return = array(); 
    foreach($tree as $leaf) 
    { 
        if($leaf['pid'] == $rootId) 
        { 
            $leaf["level"] = $level; 
            foreach($tree as $subleaf) 
            { 
                if($subleaf['pid'] == $leaf['id']) 
                { 
                    $leaf['children'] = $this->arr2tree($tree, $leaf['id'],$level+1); break; 
                } 
            } 
            $return[] = $leaf; 
        } 
    } 
    return $return;
 }

// 第三種
// 把增加同級目錄,下級目錄修改成,輸入名字之後就存資料庫

public function xuqiu_update333()
{
    // echo '<pre>';
    $name = $this->GP('name');
    $pid = $this->GP('id');
    $data['name'] = $name;
    $list = K::M('code/xuqiu')->update($pid,$data,true);
    if($list)
    {
        $returnData = ['code'=>3, 'info'=>'編輯成功'];
    }else{
        $returnData = ['code'=>4, 'info'=>'編輯失敗'];
    }
    $returnData = json_encode($returnData,JSON_UNESCAPED_UNICODE); 
    echo $returnData;   // 只有echo才打印資訊,如果是return就返回資訊為空,格式正確,但是走error
    exit;
    // die;
     
}


public function xuqiu_delete333()
{
    // echo '<pre>';
    $id = $this->GP('id');
    // var_dump($id);
    // die;
    $a = K::M('code/xuqiu')->deletefenlei($id);
    $returnData = json_encode($a,JSON_UNESCAPED_UNICODE); 
    echo $returnData;   
    exit;    
}


public function xuqiu_add333()
{
    // 新增同級目錄,就是新增id 的同pid =pid
    // 新增下級目錄,就是pid=id
    // 新增同級還是下級 tag=0 新增同級 tag=1 新增下級
  
    echo '<pre>';
    $pid = $this->GP('pid');    // pid是新新增資料的id,當新增的是下級目錄時,提示$pid沒有定義
    $name = $this->GP('name');
    $tag = $this->GP('tag');
    var_dump($pid);
    // 執行新增操作
    $list = K::M('code/xuqiu')->add666($pid,$name,$tag);
    // die;
    // var_dump($pid);
    // var_dump($name);
    // var_dump($tag);
    // die;
    $returnData = json_encode($list,JSON_UNESCAPED_UNICODE); 
    echo $returnData;   // 只有echo才打印資訊,如果是return就返回資訊為空,格式正確,但是走error
    exit;
}