做分类管理 新建控制器 CateController.class.php
我们把对数据库操作的公共部分 写在模型类里面 模型类是在Model文件夹下面 声明方式 CateModel.class.php 需要继承Model类 手册
在模型类里面写你的数据库操作,在控制器里面采用D('Cate')实例化一个模型对象,采用对象调取你封装的数据库操作
在CateModel.class.php 中
namespace Admin\Model;
use Think\Model;
class CateModel extends Model{
/**
* 字段验证的规则
* @var array
*/
protected $_validate = array(
array('name','require','分类名字必须存在并且不能重复',1,'unique',1), //默认情况下用正则进行验证
array('p_id','number','父级id错误',1), //默认情况下用正则进行验证
);
/**
* 查询分类的方法
* @param int $p_id 父级分类id 如果不传 表示查询1级分类
* @return mixed 返回查询到的数组
*/
public function get_list($p_id=0){
$cate = M("cate");
$data = $cate->where("p_id=".$p_id)->select();
return $data;
}
}
在CateController.class.php 中
class CateController extends BackController{
/**
* 进入分类列表
*/
public function index(){
//先查询出一级分类
$cate = D("Cate"); 实例化Cate类
$data = $cate->get_list();
//然后分别查询每个一级分类下面的子分类
foreach($data as $key=>$val){
//$val['id']
$data1 = $cate->get_list($val['id']);
$data[$key]['son'] = $data1;//把查询到的子分类放入到当前循环的变量里面
}
$this->assign("data",$data);
$this->display();
}
<volist name="data" id="vo">
<tr id="tr{$vo.id}">
<td align="left" style="padding-left: 20px;">{$vo.name}</td>
<td align="center"><img src="{$vo.img}" style="max-height: 50px;"></td>
<td align="center">{$vo.info}</td>
<td align="center">
<a href="{:U('Cate/edit',array('id'=>$vo['id']))}" class="J_showdialog">编辑</a>
|<a href="javascript:del({$vo.id})">删除</a></td>
</tr>
<volist name="vo['son']" id="v">
<tr id="tr{$v.id}">
<td align="center">{$v.name}</td>
<td align="center"><img src="{$v.img}" style="max-height: 50px;"></td>
<td align="center">{$v.info}</td>
<td align="center">
<a href="{:U('Cate/edit',array('id'=>$v['id']))}" class="J_showdialog">编辑</a>
|<a href="javascript:del({$v.id})">删除</a></td>
</tr>
</volist>
</volist>
/**
* 新增分类的方法
*/
public function add(){
if(IS_POST){ 判断是否是post提交
/*
I('post.name','','addslashes');
I('post.p_id',0,'int');
I('post.img','','addslashes');
I('post.info','','addslashes');
*/ 用I方法接收post穿过来的每个值,如果post提交的数据很多,就很麻烦,而且每个都要接收,要写很多次,所以tp框架有个create方法,用来自动创建数据(前提是form表单里面的name值和数据库里面的字段相同)
/*
$cate = M('cate');
$cate->create();//自动根据$_POST创建数据(创建成数组) 创建失败会自动返回错误
$cate->getError();//这个可以获取创建失败时的错误信息
自动验证 查找手册 然后将找到的数组放在 model里面 (属性) 看上面
*/
$cate = D("cate"); //如果有字段验证,那么实例化表就要用D方法 会自动去验证
if($cate->create()){//自动根据$_POST创建数据
if($cate->add()){
//add方法是新增方法,如果不传参数 它会默认把你创建后的数据做新增操作
$this->success("新增成功",U("Cate/index"));
}else{
$this->error("新增失败",U("Cate/index"));
}
}else{
$this->error($cate->getError(),U("Cate/index"));//这个可以获取创建失败时的错误信息
}
}else{
//我们新增分类之前 需要查询以前已有的一级分类 (先查询)
//先实例化一个model类
$cate = D("Cate");
$data = $cate->get_list();
$this->assign("data",$data);
$this->display();
}
}
将add.html放在Cate文件夹下面,然后将该删掉的删掉就可以了
<select class="J_cate_select mr10" name="p_id">
<option value="0" selected="selected">本身作为一级分类</option>
<foreach name="data" item="v">
<option value="{$v.id}">{$v.name}</option>
</foreach>
</select>
----------------
在添加分类图标的时候,将插件放在admin->common 里面, 找到文件上传插件mydemo->image-dialog.html
将里面head标签里面的js和css全部复制放在add.html里面 放在加载jquery的后面
由于jquery加载过了,所以不需要再次加载,将复制过来的加载jquery的删掉
然后修改路径
然后将mage-dialog.html 里面图片上传的 (只复制一个)
<img src="" style="max-width:100px;">
<input type="hidden" name="img1" value="" />
<input type="button" class="upload_img" value="选择图片1" />
放在
<tr>
<th>分类图标 :</th>
<td>
中
</td>
</tr>
然后改变name='img' --》测试就可以了
------------
最后是
<tr>
<th>分类描述 :</th>
<td>
<textarea name="info" placeholder="请输入分类的描述" style="width: 400px;height: 200px;"></textarea>
</td>
</tr>
---------------
<form action="{:U('Cate/add')}" method="post" id="info_form" οnsubmit="return check_form();">
function check_form(){
var name = $("input[name='name']").val();
if($.trim(name)==""){
alert("请填写分类的名字");
return false;
}
var img = $("input[name='img']").val();
if($.trim(img)==""){
alert("请上传分类的图标");
return false;
}
var info = $("textarea").val();
if($.trim(info)==""){
alert("请填写分类的描述");
return false;
}
}
然后就可以做添加功能了
分类的查询:
蔬菜
茎叶类蔬菜
瓜类
种子类蔬菜
水果
葡萄类
坚果类
/**
* ajax删除分类的方法
*/
<a href="javascript:del({$vo.id})">删除</a>
function del(id){
if(confirm("确认删除这个分类?")){
$.post("{:U('Cate/del')}",{id:id},function(data){
if(data == -3){
alert("该分类下面存在其他分类,请先删除其他分类");
}else if(data == -2){
alert("非法请求");
}else if(data == -1){
alert("该分类下面存在商品,请先修改商品分类再删除");
}else if(data == 0){
alert("删除失败,请刷新后重试");
window.location.reload();//刷新
}else if(data == 1){
$("#tr"+id).remove();//直接把删除的移除掉 给每个tr一个id
}
})
}
}
public function del(){
if(IS_AJAX){
$id = I("post.id",0,"int");
//先确认是否有商品在这个分类下面
$goods = M("goods");
$data1 = $goods->where("cate_id=".$id)->find();
if($data1){ //该分类下面有商品
echo -1;//表示该分类下面商品不能删除
}else{
//确认这个分类下面是否有其他小分类
$cate = M('cate');
$data2 = $cate->where("p_id=".$id)->find();
if($data2){ //该分类下面有小分类
echo -3;
}else{
if($cate->where("id=".$id)->delete()){
echo 1;
}else{
echo 0;
}
}
}
}else{
echo -2;//如果返回-2,表示请求方式错误
//$this->ajaxReturn($data); tp的ajax返回值(也可以用echo )
}
exit;
}
/**
* 修改分类的方法
*/
<a href="{:U('Cate/edit',array('id'=>$vo['id']))}" class="J_showdialog">编辑</a>
在U放里面传参
U('控制器/方法',array('键1'=>'值1','键2'=>'值2'))
public function edit(){
if(IS_POST){
$id = I("post.id",0,"int"); //因为id后面要使用,所以不能放在create里面去自动创建
$cate = D("cate");
if($cate->create()){//自动根据$_POST创建数据
if($cate->where("id=".$id)->save()!==false){ //save()是保存方法
//save()是保存方法 成功的话返回的是受影响的行数 失败的话返回的是false
$this->success("修改成功",U("Cate/index"));
}else{
//$cate->getLastSql(); exit; //获取最后一次的sql语句
$this->error("修改失败",U("Cate/index"));
}
}else{ $this->error($cate->getError(),U("Cate/index"));//这个可以获取创建失败时的错误信息
}
}else{
//先查询以前的数据
$id = I("get.id",0,"int");
$cate = D("cate");
$data = $cate->where("id=".$id)->find(); //查询当前
$cate_data = $cate->get_list(); //查询顶级
$this->assign("data",$data);
$this->assign("cate_data",$cate_data);
$this->display();
}
}
}
<select class="J_cate_select mr10" name="p_id">
<option value="0" selected="selected">本身作为一级分类</option>
<foreach name="cate_data" item="v">
<option value="{$v.id}"
<if condition="$data['p_id'] eq $v['id'] "> selected="selected"
</if>
>{$v.name}</option>
</foreach>
</select>
<if condition="条件">
<else />
</if>
条件 :eq 等于 lt 小于 gt 大于 neq 不等于
M和D方法的区别:
D方法实例化有模型的类 model下面的类文件
M方法直接实例化数据表
0==false 正确的
0 === false 错误的
0!=false 错误的
0!==false正确的
添加
$对象->create();如果不传参数,将会默认使用$_POST $对象->create($data);把$data根据对象数据表的字段自动创建键值对
$对象->add();
查询
$对象->find();查询一条符合条件的数据 返回一维数组
$对象->select();查询所有符合条件的数据 返回多维数组
删除
$对象->where(条件)->delete();
修改
$对象->create();如果不传参数,将会默认使用$_POST $对象->create($data);把$data根据对象数据表的字段自动创建键值对
$对象->save();
在修改的时候我们使用$对象->save()!==false 来进行判断