我们刚才只是完成了添加的一部分,但是我们的上级分类也不能永远都是只有一个死的嘛,所以我们需要对她进行修改:

我们先将add方法里面的数据查出来再说:

然后在模板页进行遍历:

展示效果如下所示:

虽然是出现了,但是没有向我们平常时候见到的无限极分类一样噢,一般比如分类 多多,分类下面的 好多美女啊 是多多的下级分类,那么好多美女啊他前面是有几个空格之类的隔开,

那么我们就需要在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 = array();
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;
}
}

然后我们回到控制器:

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方法直接调用catTree 函数即可,然后我们回到视图里面:

<select name="cate_pid" id="catid" class="required">
<option value="">顶级分类</option>
<volist name="cateres" id="vo">
<option value="{$vo['cate_id']}">{$vo['level']|str_repeat="&nbsp;&nbsp;&nbsp;",###} {$vo['cate_name']}</option>
</volist> </select>

这样即可正常隔开, $vo['level'] 也就是我们从Model层里面定义的,不过让他出来用nbsp 来进行张位而已,最终显示效果如下所示:

夺命雷公狗ThinkPHP项目之----企业网站8之栏目的添加完善(无限极分类的完成)的更多相关文章

  1. 夺命雷公狗ThinkPHP项目之----企业网站10之栏目的编辑完善(无限极分类的完成)

    我们编辑首先就要考虑将下拉框效果实现出来,然后再进行下一步操作: 我们用到了Model层的操作,在第8讲里面其实已经写好了catTree方法,控制器如下所示: 然后在列表页然他变量进行输出 然后开始通 ...

  2. 夺命雷公狗ThinkPHP项目之----企业网站9之栏目的列表完善(无限极分类的完成)

    我们刚才已经写好model了,那么这里直接来调用下他即可: public function lists(){ $mod = D('Category')->catTree(); $this -&g ...

  3. 夺命雷公狗ThinkPHP项目之----企业网站6之栏目的添加(主要用模型来验证字段)

    我们刚才的控制器已经写好了,那么我们现在就来完成我们的模型, 首先我们在Model目录下创建一个CategoryModel.class.php 代码如下: <?php namespace Adm ...

  4. 夺命雷公狗ThinkPHP项目之----企业网站5之栏目的添加(主要是图片上传)

    我们照老,先老搞定控CategoryController.class.php制器,代码如下所示: <?php namespace Admin\Controller; use Think\Cont ...

  5. 夺命雷公狗ThinkPHP项目之----企业网站11之栏目的删除完成

    我们删除要在分类模型中添加一个_before_delete的钩子函数,而且在删除一个分类时候,如果这个分类有子分类就不允许删除 model层代码如下所示: <?php namespace Adm ...

  6. 夺命雷公狗ThinkPHP项目之----企业网站7之栏目的修改(主要用模型来验证字段)

    我们照老,在控制器里面先查出我们所需要用到的数据: 然后直接遍历到模版上即可: 然后再开始写提交过来的数据处理问题(注意一定要接收修改页面通过隐藏域)而且我们刚才已经写好我们的model层了,所以直接 ...

  7. 夺命雷公狗ThinkPHP项目之----企业网站1之快速搭建后台

    我们还是老规矩照老方法,将框架里面多余的东西都干掉,然后在index.php里面将框架搭建起来 <?php //定义项目目录 define('APP_PATH','./WEB/'); //开启调 ...

  8. 夺命雷公狗ThinkPHP项目之----企业网站28之网站前台左侧导航的实现

    我们基于刚才在model层的找顶级分类的代码在进行修改即可: <?php namespace Home\Controller; use Think\Controller; class Commo ...

  9. 夺命雷公狗ThinkPHP项目之----企业网站27之网站前台单页的完成(从百度编辑器里面取出文章数据)

    我们的单页面里主要是为了可以取出文章分类表的栏目内容,废话先不说, 我们的实现要点: 1...获取get过来的栏目cate_id 2...然后用条件查询栏目表 <?php namespace H ...

随机推荐

  1. 【Android开发学习笔记】【第四课】基础控件的学习

    通过一个简单的例子来学习下面几种控件: 1.TextView:简单的文本显示控件 2.EditText:可以编辑的文本框 3.Button:按钮 4.Menu:这里指的是系统的Menu 5.Toast ...

  2. zepto源码--filtered, contains,funcArg,setAttribute,className,deserializeVale--学习笔记

    几个方法 1.filtered 目标是对节点按照一定的选择器进行过滤. 如果传入了过滤选择器,则在nodes节点下,选择符合选择器的节点: 如果没有传入选择器,则返回节点本身,转化为zepto节点. ...

  3. 关于android获得设备宽高

    传统的办法: DisplayMetrics dm = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(d ...

  4. 自动换行的矢量文字(android demo)

    由于矢量字体的宽度不同,自测android字体,发现当中文字体大小为100像素时,字母s等 宽度大概在52,字母l等 宽度大概在26,这样自动换行就不可以按字符的个数计算截取每行显示的字串. 直接上代 ...

  5. SMART Goals

    Once you have planned your project, turn your attention to developing several goals that will enable ...

  6. pickle 数据对象的序列化和反序列化

    python的pickle模块实现了基本的数据序列和反序列化.通过pickle模块的序列化操作我们能够将程序中运行的对象信息保存到文件中去,永久存储:通过pickle模块的反序列化操作,我们能够从文件 ...

  7. webApi中参数传递

    webApi中参数传递 一:无参数的get方法: 前端:    function GetNoParam() { //为了统一:我们都采用$.ajax({}) 方法; $.ajax({ url: '/a ...

  8. box_shadow

    .tip{width:485px; height:260px; position:absolute;top:10%; left:30%;background:#fcfdfd; box-shadow:1 ...

  9. php 如何进入mysql数据库

    我是初学者,有两台电脑,进入数据库通用的方法直接找mysql.exe,如下例: F:\Program Files\wamp\bin\mysql\mysql5.5.20\bin

  10. JavaScript:复选框事件的处理

    复选框事件的处理 复选框本身也是多个组件的名字相同.所以在定义复选框的同事依然要使用document.all()取得全部的内容. 范例:操作复选框,要求是可以一个个去选择选项,也可以直接全选,全选按钮 ...