一直以来对cms后台的栏目管理不太理解,尤其是子栏目顶级栏目这种关系,通过网上的搜索与自己的摸索,实现方法如下(原理是利用数据库的path字段):

1、建立简单的栏目表:

CREATE TABLE `self_cd`(
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
`name` VARCHAR( 255 ) NOT NULL,
`pid` INT UNSIGNED NOT NULL DEFAULT '',
`path` TEXT NOT NULL
) ENGINE = MYISAM ;

2、建立CdModel.class.php模型

class CdModel extends Model{
/*
* 数据验证
*/
protected $_validate = array(
array('name','require','栏目名称不能为空',1),
);
/*
* 自动提交
*/
protected $_auto = array(
array('path','getPath',3,'callback'),
);
function getPath(){
//获取父id
$pid = $_POST['pid'];
//
$pm = $this->field('id,path')->getById($pid);
$path = $pid !== 0 ? $pm['path'].'-'.$pm['id'] : 0;
return $path;
}
}

3、建CdAction.class.php控制器

class CdAction extends CommonAction{
function index(){ }
function add(){
$cd = new CdModel();
$list = $cd->field("id,name,pid,path,concat(path,'-',id) as bpath")->order('bpath,id')->select();
foreach($list as $key=>$val){
$list[$key]['margin'] = (strlen(str_replace('-','',$val['path']))-1)*5;
}
$this->assign('cdlist',$list);
$this->display();
}
function insert(){
$cd = new CdModel();
if($cd->create()){
if(false!==$cd->add()){
echo '栏目添加成功';
$this->redirect(__APP__.'/Cd/add');
}else{
echo '数据添加失败'.$cd->getDbError();
}
}else{
echo '数据验证失败'.$cd->getError();
}
}
}

4、模板实现:

add.html

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>创建栏目</title>
</head>
<body>
<form method="post" action="__URL__/insert">
栏目名称:<input type="text" name="name" />
父栏目名:<select name="pid">
<option value="0">添加顶级栏目</option>
<volist name='cdlist' id='data'>
<option style="margin-left:{$data['margin']}" value="{$data['id']}">|-{$data['name']}</option>
</volist>
</select>
<input type="submit" value="添加" />
</form>
</body>
</html>

5、显示效果如下

ThinkPHP利用数据库字段做栏目的无限分类的更多相关文章

  1. ThinkPHP增加数据库字段后插入数据为空的解决办法

    今天用ThinkPHP做了一个简单的商品发布系统,数据库本来只有四个字段id,name,url,image.id是主键,name是商品名称,url是商品链接,image是商品图片,做的差不多了,发现还 ...

  2. 利用数据库链做DML操作时报ORA-02069: global_names parameter must be set to TRUE for this operation

    按照 http://space.itpub.net/195110/viewspace-711110 的说法顺利解决问题. 通过DBLink更新远程数据的时候,如果使用到本地的sequence.函数.过 ...

  3. thinkphp 找数据库某个字段为空的数据,PHP 数据调取 空数据

    $arr['dingwei'] = array('EXP','is null');

  4. 数据库字段值为null利用setInc方法无法直接写入

    1.数据库字段值为null利用setInc方法无法直接写入,先判断是否为空,再写入. if($points->add($dataList)){ $user=M('cuser'); $null=$ ...

  5. 【EF】EntityFramework 更新数据库字段的三种方法

    实体类 public class TestDbContext : DbContext { public DbSet<Test> Tests { get; set; } public Tes ...

  6. thinkphp 对数据库的操作

    查看ThinkPHP完全开发手册3.1 首先编辑配置文件 thinkphp这个数据库就不乱改了 昨天新建了一个 confluence(utf8)数据库 所以就用它学习一下吧,因为就只建立了一个数据库, ...

  7. 主流数据库字段类型转.Net类型的方法

    最近在阅读一些开源的代码,发现其中有些方法总结的很全面,至少在我做同样的事情时候,需要抓破脑袋想活着google,现在看到了这个关于主流数据库字段类型转.Net类型的方法,故收藏之,也顺便分享给那些能 ...

  8. thinkphp从数据库里的html代码显示页面不解析

    首先,这个问题不应该出现在这里,因为以前在用ThinkPHP3.1.2的时候,利用富文本编辑器保存文本后,直接从数据库里面取出的数据都能正常显示,改用ThinkPHP3.2.3之后,thinkphp从 ...

  9. 关于金额,重量等浮点数的数据库字段设计(用Int,Long代替浮点数计算)

    金额.重量.成绩等数据库字段推荐使用int或bigint类型. 通常我们数据库设计中金额,重量等涉及到小数位的字段会用float或decimal,mysql还可以用double,但往往每笔金额的计算我 ...

随机推荐

  1. 公司内部技术分享之Vue.js和前端工程化

    今天主要的核心话题是Vue.js和前端工程化.我将结合我这两年多的工作学习经历来谈谈这个,主要侧重点是前端工程化,Vue.js侧重点相对前端工程化,比重不是特别大. Vue.js Vue.js和Rea ...

  2. ASP.NET Core 依赖注入基本用法

    ASP.NET Core 依赖注入 ASP.NET Core从框架层对依赖注入提供支持.也就是说,如果你不了解依赖注入,将很难适应 ASP.NET Core的开发模式.本文将介绍依赖注入的基本概念,并 ...

  3. 洛谷—— P1847 轰炸II

    https://www.luogu.org/problemnew/show/1847 题目背景 本题为轰炸数据加强版 题目描述 一个城市遭到了M次轰炸,每次都炸了一个每条边都与边界平行的矩形 在轰炸后 ...

  4. Linux字符模式下如何设置/删除环境变量

    Linux字符模式下设置/删除环境变量方法: bash下 设置:export 变量名=变量值 删除:unset 变量名 csh下 设置:setenv 变量名 变量值 删除:unsetenv 变量名 h ...

  5. Xamarin.Forms单元控件Cell

    Xamarin.Forms单元控件Cell   单元控件Cell是Xamarin.Forms为ListView和TableView专门定制的一类项目元素.它包括5个控件,分别为文本框单元EntryCe ...

  6. Java创建和解析Json数据方法(五)——Google Gson包的使用

    (五)Google Gson包的使用 1.简介 Gson包中,使用最多的是Gson类的toJson()和fromJson()方法:         ①toJson():将java对象转化为json数据 ...

  7. 【swagger】2.swagger提供开发者文档--返回统一格式篇【spring mvc】【spring boot】

    接着上一篇来说, 不管正常返回结果还是后台出现异常,应该返回给前台统一的响应格式. 所以这一篇就为了应对解决这个问题. ======================================== ...

  8. ubuntu安装常用软件

    安装unzip sudo apt-get install unzip

  9. mysql_config_editor使用简介

      原文 : http://blog.itpub.net/29773961/viewspace-1817640/   ----------------------------------------- ...

  10. hdoj 4828 卡特兰数取模

    Grids Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others) Total Sub ...