在cate里面的edit.html加上返回按钮
<input οnclick="window.history.back(-1);" type="button" value="返 回" class="btn">
window.history.back(-1); js返回上一页的操作
---------------------------------------------
新建GoodsController.class.php
public function index(){
$this->display();
}
先做添加
public function add(){
if(IS_POST){
看后面
}
}else{
//添加商品之前我需要知道什么东西 先知道有哪些分类
$cate = D("Cate");
$cate_data = $cate->get_list();//查询一级分类
foreach($cate_data as $key=>$val){
$data1 = $cate->get_list($val['id']);
$cate_data[$key]['son'] = $data1;//把查询到的子分类放入到当前循环的变量里面
}
$this->assign("cate_data",$cate_data);
$this->display();
}
}
用ajax形式显示分类
<tr>
<th width="120">商品分类 :</th>
<td>
<select class="J_cate_select mr10" οnchange="change_cate(this)">
<foreach name="cate_data" item="v">
<option value="{$v.id}">{$v.name}</option>
</foreach>
</select>
<select class="J_cate_select mr10" name="cate_id">
<foreach name="cate_data.0.son" item="v">
<option value="{$v.id}">{$v.name}</option>
</foreach>
</select>
</td>
</tr>
function change_cate(o){
var p_id = $(o).val();
$.post("{:U('Goods/change_cate')}",{cate_id:p_id},function(data){
if(data.error==-2){
alert(data.msg);
}else{
var str = '';
$.each(data,function(k,v){
str += '<option value="'+ v.id+'">'+ v.name+'</option>';
})
$("select[name='cate_id']").html(str);
}
},"json")
}
/**
* ajax获取分类的方法
*/
public function change_cate(){
if(IS_AJAX){
$id = I("post.cate_id",0,"int");
$cate = D("Cate");
$data = $cate->get_list($id);
}else{
$data = array('error'=>-2,'msg'=>'错误的请求类型');
}
echo json_encode($data);
exit;
}
根据数据表在goods下面的add.html添加input框,可以把cate下面的add拿过来
然后有个商品描述,要可以添加图片的文本域,使用插件 mydome->default.html
将css和js拿过去,由于之前使用过插件,所以拿过的就不要拿了。
然后复制一个 <textarea name="content" style="width:800px;height:400px;visibility:hidden;"></textarea>
放在
<tr>
<th>商品描述 :</th>
<td>
中
</td>
</tr>
到给予生鲜网站去抠图
回顾事务
事务:
要么全部实现,要么全部不实现 停电 断网 ...
事务的话 表引擎必须是innodb
begin 开启事务 开启之后 begin后面的sql将不会真正对数据产生影响
sql语句集
rollback 回滚,begin后面的所有sql操作全部取消
commit 提交,让begin后面的所有sql操作对数据产生真正的影响
eg:
mysql_query("begin");//开启事务
if(mysql_query(A+7000的sql)){
if(mysql_query(B-7000的sql)){
mysql_query("commit"); A加钱成功 B扣钱成功 提交
}else{
mysql_query("rollback"); A加钱成功 B扣钱失败 回滚
}
}else{
mysql_query("rollback"); A加钱失败 回滚
}
数据表提交之后
先在GoodsModel.class.php中 写上自动验证
protected $_validate = array(
array('name','require','商品名字必须存在并且不能重复',1,'unique',1), //默认情况下用正则进行验证
);
然后再GoodsController.class.php 的add中判断if(IS_POST)之后
$goods = D("Goods");
if($goods->create()){ 去手册查找query (事务) 这是要用到两张表(要么同时存入成功,要么都失败)
$model = new Model();//实例化一个空的模型类
$model->startTrans();//开启事务
if($goods->add()){
$data['goods_id'] = $goods->getLastInsID();//得到上一次这个表的新增id
$data['content'] = I("post.content","","");
$goods_detail = M("goods_detail");
//因为add方法要求传入的是数组,所有我们上面把两个变量都放入$data这个数组
if($goods_detail->add($data)){
$model->commit();//都执行城的时候 我们直接提交数据
$this->success("新增成功",U('Goods/index'));
}else{
$model->rollback();//如果失败回滚
$this->error("新增失败",U('Goods/index'));
}
}else{
$model->rollback();//如果失败回滚
$this->error("新增失败",U('Goods/index'));
}
}else{
$this->error($goods->getError());
tp框架事务:
$model = new Model();//实例化一个空的模型类
$model->startTrans();//开启事务]
$model->commit();//都执行城的时候 我们直接提交数据
$model->rollback();//如果失败回滚
查询:
分类由于数据量少 不存在分页 商品数据量大 需要分页 查找手册 page
namespace Admin\Model; 查询手册ViewModel
use Think\Model\ViewModel;
class GoodsViewModel extends ViewModel{
public $viewFields = array( 'goods'=>array('id','name','info','cate_id','img','shop_price',"market_price"),//主表以及要查询的字段 现在查询的表 'cate'=>array('name(字段)'=>'cate_name(从表和主表字段又冲突起别名)','p_id(不冲突就不起别名)','_on'=>'goods.cate_id=cate.id'),
//从表(其他表以及其他表的字段),_on表示两张表的联系关系 'goods_detail'=>array('content','_on'=>'goods_detail.goods_id=goods.id'), 从表
);
}
多表联查的解决方法:
视图模型 命名 GoodsViewModel 必须继承 ViewModel
通过定义$viewFields属性来规范多表之间的关系
记住调用视图模型 使用D("GoodsView");
public function index(){
//先去得到总条数
//要使用视图模型的话 不能直接使用M实例化
$goods = D("GoodsView");
先试用M方法 M('goods'),写了GoodsViewModel 之后改为D("GoodsView");
$nums = $goods->count();//得到最条数
$per_num = 1;//每页条数
$pages = ceil($nums/$per_num);//通过先上取整得到总页数
if($pages == 0){
$pages = 1;//我们默认的最少要有一页
}
//我们假设通过get的p参数来传递页码 也就是说我们可以通过$_GET['p']的到当前页
$p = I("get.p",1,"int");
if($p<1){
$p = 1;
}else if($p>$pages){
$p = $pages;
}
$data = $goods->page($p.','.$per_num)->select();
//echo $goods->getLastSql();
$this->assign("data",$data);
$this->assign("pages",$pages+1);
$this->assign("p",$p);
$this->display();
}
<for start="1" end="100">{$i}</for>
等价于
for ($i=1;$i<100;$i+=1){ echo $i;}
注意:页码的时候会把页码+1然后再传递
<div class="pager">
<for start="1" end="$pages">
<if condition="$p eq $i">
<span>{$i}</span>
<else />
<a href="{:U('Goods/index',array('p'=>$i))}">{$i}</a>
</if>
</for>
</div>
价格 goods下面的index.html
<td align="center">
{$vo.shop_price}元
<font style="text-decoration:line-through">{$vo.market_price}元</font>
</td>
<input οnclick="window.history.back(-1);" type="button" value="返 回" class="btn">
window.history.back(-1); js返回上一页的操作
---------------------------------------------
新建GoodsController.class.php
public function index(){
$this->display();
}
先做添加
public function add(){
if(IS_POST){
看后面
}
}else{
//添加商品之前我需要知道什么东西 先知道有哪些分类
$cate = D("Cate");
$cate_data = $cate->get_list();//查询一级分类
foreach($cate_data as $key=>$val){
$data1 = $cate->get_list($val['id']);
$cate_data[$key]['son'] = $data1;//把查询到的子分类放入到当前循环的变量里面
}
$this->assign("cate_data",$cate_data);
$this->display();
}
}
用ajax形式显示分类
<tr>
<th width="120">商品分类 :</th>
<td>
<select class="J_cate_select mr10" οnchange="change_cate(this)">
<foreach name="cate_data" item="v">
<option value="{$v.id}">{$v.name}</option>
</foreach>
</select>
<select class="J_cate_select mr10" name="cate_id">
<foreach name="cate_data.0.son" item="v">
<option value="{$v.id}">{$v.name}</option>
</foreach>
</select>
</td>
</tr>
function change_cate(o){
var p_id = $(o).val();
$.post("{:U('Goods/change_cate')}",{cate_id:p_id},function(data){
if(data.error==-2){
alert(data.msg);
}else{
var str = '';
$.each(data,function(k,v){
str += '<option value="'+ v.id+'">'+ v.name+'</option>';
})
$("select[name='cate_id']").html(str);
}
},"json")
}
/**
* ajax获取分类的方法
*/
public function change_cate(){
if(IS_AJAX){
$id = I("post.cate_id",0,"int");
$cate = D("Cate");
$data = $cate->get_list($id);
}else{
$data = array('error'=>-2,'msg'=>'错误的请求类型');
}
echo json_encode($data);
exit;
}
根据数据表在goods下面的add.html添加input框,可以把cate下面的add拿过来
然后有个商品描述,要可以添加图片的文本域,使用插件 mydome->default.html
将css和js拿过去,由于之前使用过插件,所以拿过的就不要拿了。
然后复制一个 <textarea name="content" style="width:800px;height:400px;visibility:hidden;"></textarea>
放在
<tr>
<th>商品描述 :</th>
<td>
中
</td>
</tr>
到给予生鲜网站去抠图
回顾事务
事务:
要么全部实现,要么全部不实现 停电 断网 ...
事务的话 表引擎必须是innodb
begin 开启事务 开启之后 begin后面的sql将不会真正对数据产生影响
sql语句集
rollback 回滚,begin后面的所有sql操作全部取消
commit 提交,让begin后面的所有sql操作对数据产生真正的影响
eg:
mysql_query("begin");//开启事务
if(mysql_query(A+7000的sql)){
if(mysql_query(B-7000的sql)){
mysql_query("commit"); A加钱成功 B扣钱成功 提交
}else{
mysql_query("rollback"); A加钱成功 B扣钱失败 回滚
}
}else{
mysql_query("rollback"); A加钱失败 回滚
}
数据表提交之后
先在GoodsModel.class.php中 写上自动验证
protected $_validate = array(
array('name','require','商品名字必须存在并且不能重复',1,'unique',1), //默认情况下用正则进行验证
);
然后再GoodsController.class.php 的add中判断if(IS_POST)之后
$goods = D("Goods");
if($goods->create()){ 去手册查找query (事务) 这是要用到两张表(要么同时存入成功,要么都失败)
$model = new Model();//实例化一个空的模型类
$model->startTrans();//开启事务
if($goods->add()){
$data['goods_id'] = $goods->getLastInsID();//得到上一次这个表的新增id
$data['content'] = I("post.content","","");
$goods_detail = M("goods_detail");
//因为add方法要求传入的是数组,所有我们上面把两个变量都放入$data这个数组
if($goods_detail->add($data)){
$model->commit();//都执行城的时候 我们直接提交数据
$this->success("新增成功",U('Goods/index'));
}else{
$model->rollback();//如果失败回滚
$this->error("新增失败",U('Goods/index'));
}
}else{
$model->rollback();//如果失败回滚
$this->error("新增失败",U('Goods/index'));
}
}else{
$this->error($goods->getError());
tp框架事务:
$model = new Model();//实例化一个空的模型类
$model->startTrans();//开启事务]
$model->commit();//都执行城的时候 我们直接提交数据
$model->rollback();//如果失败回滚
查询:
分类由于数据量少 不存在分页 商品数据量大 需要分页 查找手册 page
namespace Admin\Model; 查询手册ViewModel
use Think\Model\ViewModel;
class GoodsViewModel extends ViewModel{
public $viewFields = array( 'goods'=>array('id','name','info','cate_id','img','shop_price',"market_price"),//主表以及要查询的字段 现在查询的表 'cate'=>array('name(字段)'=>'cate_name(从表和主表字段又冲突起别名)','p_id(不冲突就不起别名)','_on'=>'goods.cate_id=cate.id'),
//从表(其他表以及其他表的字段),_on表示两张表的联系关系 'goods_detail'=>array('content','_on'=>'goods_detail.goods_id=goods.id'), 从表
);
}
多表联查的解决方法:
视图模型 命名 GoodsViewModel 必须继承 ViewModel
通过定义$viewFields属性来规范多表之间的关系
记住调用视图模型 使用D("GoodsView");
public function index(){
//先去得到总条数
//要使用视图模型的话 不能直接使用M实例化
$goods = D("GoodsView");
先试用M方法 M('goods'),写了GoodsViewModel 之后改为D("GoodsView");
$nums = $goods->count();//得到最条数
$per_num = 1;//每页条数
$pages = ceil($nums/$per_num);//通过先上取整得到总页数
if($pages == 0){
$pages = 1;//我们默认的最少要有一页
}
//我们假设通过get的p参数来传递页码 也就是说我们可以通过$_GET['p']的到当前页
$p = I("get.p",1,"int");
if($p<1){
$p = 1;
}else if($p>$pages){
$p = $pages;
}
$data = $goods->page($p.','.$per_num)->select();
//echo $goods->getLastSql();
$this->assign("data",$data);
$this->assign("pages",$pages+1);
$this->assign("p",$p);
$this->display();
}
<for start="1" end="100">{$i}</for>
等价于
for ($i=1;$i<100;$i+=1){ echo $i;}
注意:页码的时候会把页码+1然后再传递
<div class="pager">
<for start="1" end="$pages">
<if condition="$p eq $i">
<span>{$i}</span>
<else />
<a href="{:U('Goods/index',array('p'=>$i))}">{$i}</a>
</if>
</for>
</div>
价格 goods下面的index.html
<td align="center">
{$vo.shop_price}元
<font style="text-decoration:line-through">{$vo.market_price}元</font>
</td>