夺命雷公狗ThinkPHP项目之----企业网站11之栏目的删除完成
我们删除要在分类模型中添加一个_before_delete的钩子函数,而且在删除一个分类时候,如果这个分类有子分类就不允许删除
model层代码如下所示:
<?php
namespace Admin\Model;
use Think\Model;
class CategoryModel extends Model{
protected $_validate = array(
//array(验证字段1,验证规则,错误提示,[验证条件,附加规则,验证时间]),
array('cate_name','require','栏目中文名不能为空!',1,'regex',3), //默认情况下用正则进行验证,
//这里的1是必须验证
//regex正则验证,定义的验证规则是一个正则表达式(默认)
//3全部情况下验证
array('cate_ename','require','栏目英文名不能为空!'), //默认情况下用正则进行验证
); //定义一个方法,获取树状的分类信息
public function catTree(){
$cats = $this->select();
//通过tree里面的方法进行排序
return $this->tree($cats);
} public function tree($arr,$pid=0,$level=0){ //$level是自己定义出来的
static $tree;
foreach($arr as $v){
if($v['cate_pid']==$pid){
//说明找到,保存
$v['level'] = $level;
$tree[] = $v;
//继续找
$this -> tree($arr,$v['cate_id'],$level+1); //这里的cate_id表的id
}
}
return $tree;
} //getSubIds函数的作用是获取一个分类所有子分类的id
public function getSubIds($cate_id){
//找所有分类
$data = $this -> select();
//递归找出所有子分类的id
return $this -> _getSubIds($data,$cate_id);
}
//递归查找
private function _getSubIds($data,$cate_pid,$isclear=false){
static $ret;
//因为每次调用他静态变量他都会追加,所以我们让他格式化一下
if($isclear){
$ret = array();
}
foreach($data as $k=>$v){
if($v['cate_pid'] == $cate_pid){
$ret[] = $v['cate_id'];
//再找这条分类的子分类
$this -> _getSubIds($data,$v['cate_id']);
}
}
return $ret;
} //_before_delete TP的钩子函数
protected function _before_delete($option){
//查询有没有子分类
$ck = $this -> getSubIds($option['where']['cate_id']);
if($ck){
$this -> error = "该栏目有子分类不能删除";
return false;
}
} }
然后我们就到控制器来完善下即可:
<?php
namespace Admin\Controller;
use Think\Controller;
class CategoryController extends Controller {
public function lists(){
$mod = D('Category')->catTree();
$this -> assign('mod',$mod);
$this->display();
} public function add(){
$cmod = D('Category');
if(IS_POST){
$data['cate_name'] = I('cate_name');
$data['cate_ename'] = I('cate_ename');
$data['cate_keywords'] = I('cate_keywords');
$data['cate_desc'] = I('cate_desc');
$data['cate_type'] = I('cate_type');
$data['cate_pid'] = I('cate_pid');
$data['cate_content'] = I('cate_content');
if($_FILES['cate_pic']['tmp_name']!=''){
$upload = new \Think\Upload();// 实例化上传类
$upload->maxSize = 3145728 ;// 设置附件上传大小
$upload->exts = array('jpg', 'gif', 'png', 'jpeg');// 设置附件上传类型
$upload->rootPath = './'; //这个一定要加否则很容易中招
$upload->savePath = 'Public/Uploads/'; // 设置附件上传目录
$info = $upload->uploadOne($_FILES['cate_pic']);
if($info){
//这里组装sql语句,让图片融入$data['pic']里面
$data['cate_pic'] = $info['savepath'].$info['savename'];
}else{
$this->error($upload->getError());
}
}
//dump($_FILES); if($cmod->create($data)){
if($cmod->add()){
$this->success('添加栏目成功',U('Category/lists'));
}else{
$this ->error('添加栏目失败');
}
}else{
$this -> error($cmod->getError());
} return;
} //因为我们在上面用了大D已经实例化对象了,所以直接以这种方式进行取出
$cateres = D('Category')->catTree();
$this -> assign('cateres',$cateres);
$this -> display();
} public function edit(){
$id = I('cate_id');
$vo = M('Category')->find($id);
$this -> assign('vo',$vo);
//栏目列表的遍历 开始
$cat = D('Category')->catTree();
$this -> assign('cat',$cat);
//栏目列表的遍历 结束
//dump($cat); //主要作用是用来查取下级分类的 开始
$catemod = D('Category');
//取出当前分类所有子分类的id
$cates = $catemod->getSubIds($id);
//将当前分类和子分类放到一起
$cates[] = $id;
$this -> assign('cates',$cates);
//下级分类查取 结束 //dump($cates);
if(IS_POST){
$data['cate_id'] = I('cate_id');
$data['cate_name'] = I('cate_name');
$data['cate_ename'] = I('cate_ename');
$data['cate_keywords'] = I('cate_keywords');
$data['cate_desc'] = I('cate_desc');
$data['cate_type'] = I('cate_type');
$data['cate_pid'] = I('cate_pid');
$data['cate_content'] = I('cate_content');
if($_FILES['cate_pic']['tmp_name']!=''){
$upload = new \Think\Upload();// 实例化上传类
$upload->maxSize = 3145728 ;// 设置附件上传大小
$upload->exts = array('jpg', 'gif', 'png', 'jpeg');// 设置附件上传类型
$upload->rootPath = './'; //这个一定要加否则很容易中招
$upload->savePath = 'Public/Uploads/'; // 设置附件上传目录
$info = $upload->uploadOne($_FILES['cate_pic']);
if($info){
//删除原来的图片
$cp = M('Category')->find($id);
unlink($cp['cate_pic']);
// 上传成功 获取上传文件信息
//这里组装sql语句,让图片融入$data['pic']里面
$data['cate_pic'] = $info['savepath'].$info['savename'];
}else{
$this->error($upload->getError());
}
} $mod =D("Category");
if($mod-> create($data)){
if($mod->save()){
$this->success('修改栏目成功',U('Category/lists'));
}else{
$this ->error('修改栏目失败');
}
}else{
$this->error($brandModel->getError());
}
}
$this->display();
} public function del(){
$mod = D("Category");
if($mod->delete(I('get.cate_id',0)) !== false){
$this -> success("删除成功",U('Category/lists'));
}else{
$this -> error($mod->getError());
}
}
}
视图那就简单多啦,只需要在删除那里发送yigecate_id过来即可:
<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<title>后台管理</title>
<link rel="stylesheet" type="text/css" href="__PUBLIC__/Admin/css/common.css"/>
<link rel="stylesheet" type="text/css" href="__PUBLIC__/Admin/css/main.css"/>
<script type="text/javascript" src="__PUBLIC__/Admin/js/libs/modernizr.min.js"></script>
<script type="text/javascript" src="__PUBLIC__/Admin/js/jq18m.js"></script>
<script type="text/javascript" src="__PUBLIC__/Admin/js/hileft.js"></script>
</head>
<body> <include file="Public/header" /> <div class="container clearfix">
<include file="Public/left" />
<!--/sidebar-->
<div class="main-wrap"> <div class="crumb-wrap">
<div class="crumb-list"><i class="icon-font"></i><a href="/jscss/admin">首页</a><span class="crumb-step">></span><span class="crumb-name">作品管理</span></div>
</div>
<div class="search-wrap">
<div class="search-content">
<form action="/jscss/admin/design/index" method="post">
<table class="search-tab">
<tr>
<th width="120">选择分类:</th>
<td>
<select name="search-sort" id="">
<option value="">全部</option>
<option value="19">精品界面</option><option value="20">推荐界面</option>
</select>
</td>
<th width="70">关键字:</th>
<td><input class="common-text" placeholder="关键字" name="keywords" value="" id="" type="text"></td>
<td><input class="btn btn-primary btn2" name="sub" value="查询" type="submit"></td>
</tr>
</table>
</form>
</div>
</div>
<div class="result-wrap">
<form name="myform" id="myform" method="post" action="__CONTROLLER__/">
<div class="result-title">
<div class="result-list">
<a href="insert.html"><i class="icon-font"></i>新增作品</a>
<a id="batchDel" href="javascript:void(0)"><i class="icon-font"></i>批量删除</a>
<a id="updateOrd" href="javascript:void(0)"><i class="icon-font"></i>更新排序</a>
</div>
</div>
<div class="result-content">
<table class="result-tab" width="100%">
<tr> <th>栏目id</th>
<th>栏目中文名称</th>
<th>栏目英文名称</th>
<th>栏目图片</th>
<th>上级栏目</th>
<th>栏目类型</th>
<th>操作</th>
</tr>
<volist name="mod" id="vo">
<tr> <td>{$vo['cate_id']}</td>
<td>{$vo['level']|str_repeat="▲ ",###} {$vo['cate_name']}</td>
<td>{$vo['cate_ename']}</td>
<if condition="$vo['cate_pic'] eq ''">
<td>抱歉目前没有图片数据</td>
<else />
<td><img src="/{$vo['cate_pic']}" width="100" height="60"></td>
</if>
<td>{$vo['cate_pid']}</td>
<if condition="$vo['cate_type'] eq 0">
<td>封面栏目</td>
<elseif condition="$vo['cate_type'] eq 1" />
<td>列表栏目</td>
<elseif condition="$vo['cate_type'] eq 2" />
<td>产品栏目</td>
</if>
<td>
<a class="link-update" href="__MODULE__/Category/edit/cate_id/{$vo['cate_id']}">修改</a>
<a class="link-del" href="__MODULE__/Category/del/cate_id/{$vo['cate_id']}"
onclick="return confirm('您确定要删除该栏目么?');" >删除</a>
</td>
</tr>
</volist>
</table>
<input type="submit" name="" value="删除" style="margin-left: 45px; margin-top: 10px;">
<div class="list-page"> 2 条 1/1 页</div>
</div>
</form>
</div>
</div>
<!--/main-->
<script>
//在 jq 1.8.3测试成功
$("#selall").click(function(){
if($(this).attr("checked")){
$('.selall').attr("checked","checked");
}else{
$('.selall').removeAttr("checked");
}
});
</script>
</div>
</body>
</html>
夺命雷公狗ThinkPHP项目之----企业网站11之栏目的删除完成的更多相关文章
- 夺命雷公狗ThinkPHP项目之----企业网站16之文章批量删除的完成
我们在做一个网站时候经常会遇到批量删除这个选项,其实也很简单,我们之需要用用jq实现出来效果然后通过表单post过去后端即可实现: 我们做这个功能前必须要先引入jq,我的jq版本是1.8.3,方法如下 ...
- 夺命雷公狗ThinkPHP项目之----企业网站10之栏目的编辑完善(无限极分类的完成)
我们编辑首先就要考虑将下拉框效果实现出来,然后再进行下一步操作: 我们用到了Model层的操作,在第8讲里面其实已经写好了catTree方法,控制器如下所示: 然后在列表页然他变量进行输出 然后开始通 ...
- 夺命雷公狗ThinkPHP项目之----企业网站9之栏目的列表完善(无限极分类的完成)
我们刚才已经写好model了,那么这里直接来调用下他即可: public function lists(){ $mod = D('Category')->catTree(); $this -&g ...
- 夺命雷公狗ThinkPHP项目之----企业网站8之栏目的添加完善(无限极分类的完成)
我们刚才只是完成了添加的一部分,但是我们的上级分类也不能永远都是只有一个死的嘛,所以我们需要对她进行修改: 我们先将add方法里面的数据查出来再说: 然后在模板页进行遍历: 展示效果如下所示: 虽然是 ...
- 夺命雷公狗ThinkPHP项目之----企业网站7之栏目的修改(主要用模型来验证字段)
我们照老,在控制器里面先查出我们所需要用到的数据: 然后直接遍历到模版上即可: 然后再开始写提交过来的数据处理问题(注意一定要接收修改页面通过隐藏域)而且我们刚才已经写好我们的model层了,所以直接 ...
- 夺命雷公狗ThinkPHP项目之----企业网站6之栏目的添加(主要用模型来验证字段)
我们刚才的控制器已经写好了,那么我们现在就来完成我们的模型, 首先我们在Model目录下创建一个CategoryModel.class.php 代码如下: <?php namespace Adm ...
- 夺命雷公狗ThinkPHP项目之----企业网站5之栏目的添加(主要是图片上传)
我们照老,先老搞定控CategoryController.class.php制器,代码如下所示: <?php namespace Admin\Controller; use Think\Cont ...
- 夺命雷公狗ThinkPHP项目之----企业网站1之快速搭建后台
我们还是老规矩照老方法,将框架里面多余的东西都干掉,然后在index.php里面将框架搭建起来 <?php //定义项目目录 define('APP_PATH','./WEB/'); //开启调 ...
- 夺命雷公狗ThinkPHP项目之----企业网站28之网站前台左侧导航的实现
我们基于刚才在model层的找顶级分类的代码在进行修改即可: <?php namespace Home\Controller; use Think\Controller; class Commo ...
随机推荐
- 设计模式:迭代器模式(Iterator)
定 义:提供一种方法顺序访问一个集合对象中的各个元素,而又不暴露该对象的内部元素. C#中实现,foreach 遍历
- AX中四种库存ABC分析法原理研究
库存ABC分类,简单的说就是抓大放小,是为了让我们抓住重点,用最大精力来管理最重要的物料,而对于不太重要的物料则可以用较少的精力进行管理.它和我们平常说的八二法则有异曲同工之妙. 既然要应用库存ABC ...
- Magento修改邮件模板内容
Magento 默认邮件模板 都是带着官方的标志和一些官方的基本信息.为了建立品牌形象我们需要把邮件模板中的所有官方信息换成自己的信息.修改步骤如下: 1.找到Magento的邮件模板文件(这里以 e ...
- Bone Collector
if(j>=w[i]) dp[i][j] = max(dp[i-1][j-w[i]]+v[i], dp[i-1][j]); else dp[i][j]=dp[i-1][j]; i 1 2 3 4 ...
- Linq世界走一走(LINQ TO XML)
前言:Linq to xml是一种使用XML的新方法.从本质上来说,它采用了多种当前使用的XML处理技术,如DOM和XPath,并直接在.NET Framework内将它们组合为一个单一的编程接口.L ...
- PySe-001-基础环境配置(MacOX)
Python 是一种面向对象.解释型计算机程序设计语言,其源代码同样遵循 GPL(GNU General Public License)协议.Python语法简洁而清晰,具有丰富和强大的类库.由于Py ...
- Linux内核socket优化项
Linux内核socket优化项 vi /etc/sysctl.confnet.core.netdev_max_backlog = 30000 每个网络接口接收数据包的速率比内核处理这些包的速率快时 ...
- vsUnit单元测试
在自定义的方法名上[右键]然后选择[创建单元测试],之后在项目中就添加了一个单元测试的项目,找到对应的单元测试的方法[TestMethod()]特性修饰,将单元测试的方法中最后一句:Assert.In ...
- 2.TCP_IP互联线缆_TCP_UDP报文抓包详解
TCP_IP互联线缆_TCP_UDP报文抓包详解 2.1网线标准 直通线 交叉线 异种设备互联使用直通线 同种设备互联使用交叉线 TCP和UDP 端口寻址 TCP数据格式 TCP三次握手 UDP数据格 ...
- Android 关于ListView中adapter调用notifyDataSetChanged无效的原因
话说这个问题已经困扰我很久了,一直找不到原因,我以为只要数据变了,调用adapter的notifyDataSetChanged就会更新列表,最近在做微博帐号管理这一块,想着动态更新列表,数据是变了,但 ...