无限级分类 栏目的增 改


无限级分类的思路

1. 先查出所有的栏目的id和parent_id.
2. 调用分类树的函数分类,进行分类排序.
3. 传值到模板里(如果是修改的v层模板,需要先把栏目名字前加上缩进空格后,再传值),在模板展显出来.
4. 修改时不能以自身或子孙栏目做自己的父栏目这里有两种思路:
  •     思路1(推荐这种方法):查出当前id要更改到的栏目id的所有父级pid(包含更改到的栏目id),
              判断当前id不能在查出在查出的数组中的,否则报错
    
  •     思路2:查出当前id的所有的子孙id,判断要更改到的栏目的id,不能在查出的id里,否则报错
    

先查出所有的栏目的id和parent_id.调用分类树的函数分类

公用函数

// 对无限级分类数组进行递归排序
function rec($arr,$id,$lev=0) {
    static $list = array();
    foreach($arr as $k=>$v) {
        if($v['parent_id'] == $id) {
            $v['lev'] = $lev;
            $list[] = $v;
            rec($arr,$v['cat_id'],$lev+1);
        }
    }
    return $list;
}

// 找一个栏目的家谱树
// 找出当前栏目id的所有的父级栏目id 
// 方法一:
function tree($arr,$id) {
    static $list = array();
    foreach($arr as $v) {
        if($v['cat_id'] ==  $id) {
            $list[] = $v;        
            if($v['parent_id'] > 0) {
                tree($arr,$v['parent_id']);
            }
        }
    }

    return $list;
}

方法二:
//找所有父级id
    public function getparentid($authRuleId){
        $AuthRuleRes=$this->select();
        return $this->_getparentid($AuthRuleRes,$authRuleId,True);
    }

    public function _getparentid($AuthRuleRes,$authRuleId,$clear=False){
        static $arr=array();
        if($clear){
          $arr=array();
        }
        foreach ($AuthRuleRes as $k => $v) {
            if($v['id'] == $authRuleId){
                $arr[]=$v['id'];
                $this->_getparentid($AuthRuleRes,$v['pid'],False);
            }
        }
        asort($arr);
        $arrStr=implode('-', $arr);
        return $arrStr;
    }


//找出所有的子孙id
//找所有子级id
    public function getchilrenid($cateid){
        $cateres=$this->select();
        return $this->_getchilrenid($cateres,$cateid);
    }

    public function _getchilrenid($cateres,$cateid){
        static $arr=array();
        foreach ($cateres as $k => $v) {
            if($v['pid'] == $cateid){
                $arr[]=$v['id'];
                $this->_getchilrenid($cateres,$v['id']);
            }
        }

        return $arr;
    }

list模板里层次展示出来

list列表展示的控制器

if($act == 'list') {    
    $sql = 'select cat_id,cat_name,parent_id from category';
    $catlist = $db->getAll($sql);
    
    $catlist = rec($catlist,0); //调用分类树的函数分类

    $smarty->assign('catlist',$catlist);
    $smarty->display('catelist.html');
}

list模板里层次展示出来

<form method="post" action="" name="listForm">
<div class="list-div" id="listDiv">

<table width="100%" cellspacing="1" cellpadding="2" id="list-table">
  <tr>
    <th>分类名称</th>
    <th>商品数量</th>
    <th>数量单位</th>
    <th>导航栏</th>
    <th>是否显示</th>

    <th>价格分级</th>
    <th>排序</th>
    <th>操作</th>
  </tr>

      {foreach from=$catlist item=cat}
      <tr align="center" class="0" id="0_1" id = 'tr_1'>
    <td align="left" class="first-cell" style = 'padding-left="0"'>
            <!--用lev等于数在上面加上空格,层次展示-->
            <img src="../images/menu_minus.gif" id="icon_0_1" width="9" height="9" border="0" style="margin-left:{$cat.lev}em" />

            <span><a href="#" >{$cat.cat_name}</a></span>
        </td>
    <td width="10%">0</td>
    <td width="10%"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span></td>
    <td width="10%"><img src="../images/no.gif" /></td>
    <td width="10%"><img src="../images/yes.gif" /></td>
    <td><span>5</span></td>

    <td width="10%" align="right"><span>50</span></td>
    <td width="24%" align="center">
      <a href="#">转移商品</a> |
      <a href="cate.php?act=edit&cat_id={$cat.cat_id}">编辑</a> |
      <a href="#" title="移除">移除</a>
    </td>
  </tr>
    {/foreach}
  </table>
</div>
</form>

添加时

控制器里显示数据,调用分类树排序后传值到模板里

添加的展示控制器

if($act == 'add') {
    $sql = 'select cat_id,cat_name,parent_id from category';
    $catlist = $db->getAll($sql);
    $catlist = rec($catlist,0);
    //分类下拉框里的栏目名字前加空格缩进
    foreach($catlist as &$v) {
        $v['cat_name'] = str_repeat('&nbsp;&nbsp;',$v['lev']).$v['cat_name'];
    }

    $smarty->assign('clist',$catlist);
    $smarty->display('cateadd.html');
}

添加的html展示模板里展示出来,下拉框里缩进展示

<div class="main-div">
  <form action="cate.php" method="post" name="theForm" enctype="multipart/form-data">
    <input type="hidden" name="act" value="insert" />  <!--form表单提交到insert控制器处理-->
  <table width="100%" id="general-table">
      <tr>
        <td class="label">分类名称:</td>
        <td>
          <input type='text' name='cat_name' maxlength="20" value='' size='27' /> <font color="red">*</font>
        </td>
      </tr>
      <tr>
        <td class="label">上级分类:</td>
        <td>
          <select name="parent_id">
            <option value="0">顶级类目</option>
            {foreach from=$clist item=cat}
            <option value="{$cat.cat_id}">{$cat.cat_name}</option>
            {/foreach}
          </select>
        </td>
      </tr>
      
      <tr>
        <td class="label">关键字:</td>
        <td><input type="text" name="keywords" value='' size="50">
        </td>
      </tr>

      <tr>
        <td class="label">分类描述:</td>
        <td>
          <textarea name='cat_desc' rows="6" cols="48"></textarea>
        </td>
      </tr>
      </table>
      <div class="button-div">
        <input type="submit" value=" 确定 " />
        <input type="reset" value=" 重置 " />
      </div>
  </form>
</div>

添加/更新的数据控制器

//插入数据
if($act == 'insert') {
    // 做一些数据合法性的检验,略过

    $cat = array();
    $cat['cat_name'] = trim($_POST['cat_name']);
    $cat['parent_id'] = $_POST['parent_id'] + 0;
    $cat['keywords'] = trim($_POST['keywords']);
    $cat['cat_desc'] = trim($_POST['cat_desc']);

    // 第1个参数是表名,第2个数组数据, 第3个代表动作,insert ,update,默认是insert 
    
    $cat_id = $_POST['cat_id'] + 0;
    
    // 判断 栏目的新父id 是不是此栏目的子孙
    $sql = 'select cat_id,parent_id from category';
    $list = $db->getAll($sql);
    $list = tree($list,$cat['parent_id']);
    
    foreach($list as $v) {
        if($v['cat_id'] == $cat_id) {
            echo "不能以自身或子孙栏目做自己的父栏目";
            exit;
        }
    }
    
    //如果没有$cat_id就插入,则否就修改这条数据
    if(!$cat_id) {
        if($db->autoExecute('category',$cat)) {
            echo "插入成功";
        } else {
            echo "失败";
        }
    } else {
        if($db->autoExecute('category',$cat,'update',' cat_id='.$cat_id)) {
            echo "修改成功";
        } else {
            echo "修改失败";
        }
    }
}

修改数据时(不能以自身或子孙栏目做自己的父栏目)

修改的展示页面控制器里
修改时判断 不能以自身或子孙栏目做自己的父栏目

//修改的展示页面
if($act == 'edit') {
    $cat_id =  $_GET['cat_id'] + 0;
    $sql = 'select * from category where cat_id = '.$cat_id;
    $cat = $db->getRow($sql);

    //分类下拉框里的数据
    $sql = 'select cat_id,cat_name,parent_id from category';
    $catlist = $db->getAll($sql);
    $catlist = rec($catlist,0);
    //分类下拉框里的栏目名字前加空格缩进
    foreach($catlist as &$v) {
        $v['cat_name'] = str_repeat('&nbsp;&nbsp;',$v['lev']).$v['cat_name'];
    }

    $smarty->assign('clist',$catlist);
    $smarty->assign('info',$cat);
    $smarty->display('catedit.html');
}

html里模板里
模板里把库里的数据展示出来,下拉栏里缩进展示出来,并选中表里的默认数据

<div class="main-div">
  <form action="cate.php" method="post" name="theForm" enctype="multipart/form-data">
    <input type="hidden" name="act" value="insert" />  <!--form表单提交到insert控制器处理-->
    <!--把要修改的栏目主键传过去,控制器里判断有主建就执行修改操作-->
    <input type="hidden" name="cat_id" value="{$info.cat_id}" />  
  <table width="100%" id="general-table">
      <tr>
        <td class="label">分类名称:</td>
        <td>
          <input type='text' name='cat_name' maxlength="20" value='{$info.cat_name}' size='27' /> <font color="red">*</font>
        </td>
      </tr>
      <tr>
        <td class="label">上级分类:</td>
        <td>
          <select name="parent_id">
            <option value="0">顶级类目</option>
            {foreach from=$clist item=cat}
            <option value="{$cat.cat_id}" {if $info.parent_id eq $cat.cat_id}selected = "selected"
            {/if}>{$cat.cat_name}</option>
            {/foreach}
          </select>
        </td>
      </tr>

      
      <tr>
        <td class="label">关键字:</td>
        <td><input type="text" name="keywords" value='{$info.keywords}' size="50">
        </td>
      </tr>

      <tr>
        <td class="label">分类描述:</td>
        <td>
          <textarea name='cat_desc' rows="6" cols="48">{$info.cat_desc}</textarea>
        </td>
      </tr>
      </table>
      <div class="button-div">
        <input type="submit" value=" 确定 " />
        <input type="reset" value=" 重置 " />
      </div>
  </form>
</div>
posted @ 2018-10-01 09:40  HaimaBlog  阅读(357)  评论(0编辑  收藏  举报