一直以来对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. luogu P2831 愤怒的小鸟

    题目描述 Kiana最近沉迷于一款神奇的游戏无法自拔. 简单来说,这款游戏是在一个平面上进行的. 有一架弹弓位于(0,0)处,每次Kiana可以用它向第一象限发射一只红色的小鸟,小鸟们的飞行轨迹均为形 ...

  2. fastscript增加公共函数

    fastscript增加公共函数 unit fs_BsCommFuncs; interface{$i fs.inc}uses SysUtils, Classes, fs_iclassesrtti, f ...

  3. 智能手机+DIY红外=万能遥控器

    目前好像只有:三星S4.,努比亚大牛,华为荣耀3等几款新机才有红外遥控功能,那我们使用的手机没有这个功能怎么办?不要急我有办法呵呵,本次DIY材料好找又简单,大家都可以亲自试一试! DIY材料:红外二 ...

  4. Delphi TScrollBar 用于滚动窗口、组件内容

    滚动条组件(TScrollBar)此组件是一个Windows滚动条,用于滚动窗口.组件内容.许多控制有滚动条属性,它们把滚动条作为自己的一部分,对于没有完整滚动条的控制,TScrollBar组件提供了 ...

  5. POJ2503字典树

    此代码原始出处:http://blog.csdn.net/cnyali/article/details/47367403 #include<stdio.h> #include<str ...

  6. 转:WebRTC技术及应用2 – NAT穿越技术的使用

    评:webrtc自带的打洞,穿透协议. 转: http://www.unclekevin.org/?p=924 959 views WebRTC技术及应用2 – NAT穿越技术的使用 发表回复 (题图 ...

  7. Python学习笔记8:标准库之正則表達式

    Python拥有强大的标准库.从如今起,開始学习标准库中提供的一些经常使用功能. 首先看正則表達式(regular expression),它的主要功能是从字符串(string)中通过特定的模式(pa ...

  8. 金山面试CDN

    History 今天去金山网络面试的时候,被问到性能优化,我说了几个.最后说到了CDN,我说要尽量把静态的内容放置到CDN,可是为什么呢?面试官说既然你说到CDN.你就说说它的原理. 之前有看过,可是 ...

  9. HDU 2648(搜索题,哈希表)

    #include<iostream> #include<map> #include<string> #include<cstring> #include ...

  10. linux查看命令总结

    通过命令+文件名查看内容.如下命令可以查看.1, cat :由第一行开始显示文件内容:2,tac:从最后一行开始显示,可以看出tac与cat字母顺序相反:3,nl:显示的时候输出行号:4,more:一 ...