• 无限级分类 栏目的增 改



    无限级分类的思路

    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>
    
  • 相关阅读:
    前缀和问题
    AtCoder Beginner Contest 085(ABCD)
    73.链表的基本操作
    112、文本串的加密
    100.容器List-ArrayList
    GUI颜色、字体设置对话框
    (贪心)多机调度问题
    POJ-1700 Crossing River
    lower_bound() upper_bound()函数
    HDU 1141
  • 原文地址:https://www.cnblogs.com/haima/p/9734114.html
Copyright © 2020-2023  润新知