第一步 形象化思考从视图开始考虑,因为比较容易看到,所以搭建一个视图的搜索页如图所示:
思路如下:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>ECSHOP 管理中心 - 添加新商品 </title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link href="__PUBLIC__/Admin/Styles/general.css" rel="stylesheet" type="text/css" />
<link href="__PUBLIC__/Admin/Styles/main.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div class="form-div">
<form action="__ACTION__" method="GET" name="searchForm">
<P>
商品名称:
<input value="<?php echo I('get.gn'); ?>" type="text" name="gn" size="60" />
</P>
<P>
价 格:
从<input value="<?php echo I('get.fp'); ?>" type="text" name="fp" size="8" />
到<input value="<?php echo I('get.tp'); ?>" type="text" name="tp" size="8" />
</P>
<P>
是否上架:
<?php $ios = I('get.ios'); ?>
<input type="radio" name="ios" value="" <?php if($ios == '') echo 'checked="checked"'; ?> /> 全部
<input type="radio" name="ios" value="是" <?php if($ios == '是') echo 'checked="checked"'; ?> /> 上架
<input type="radio" name="ios" value="否" <?php if($ios == '否') echo 'checked="checked"'; ?> /> 下架
</P>
<P>
添加时间:
从<input type="text" id="fa" name="fa" value="<?php echo I('get.fa'); ?>" size="20" />
到<input type="text" id="ta" name="ta" value="<?php echo I('get.ta'); ?>" size="20" />
</P>
<p>
排序方式:
<?php $obdy = I('get.odby', 'id_desc'); // 如果odby为空,那么默认是id_desc ?>
<input onclick="this.parentNode.parentNode.submit();" type="radio" name="odby" value="id_desc" <?php if($obdy == 'id_desc') echo 'checked="checked"'; ?> /> 以添加时间降序
<input onclick="this.parentNode.parentNode.submit();" type="radio" name="odby" value="id_asc" <?php if($obdy == 'id_asc') echo 'checked="checked"'; ?> /> 以添加时间升序
<input onclick="this.parentNode.parentNode.submit();" type="radio" name="odby" value="price_desc" <?php if($obdy == 'price_desc') echo 'checked="checked"'; ?> /> 以价格降序
<input onclick="this.parentNode.parentNode.submit();" type="radio" name="odby" value="price_asc" <?php if($obdy == 'price_asc') echo 'checked="checked"'; ?> /> 以价格升序
</p>
<P>
<input type="submit" value="搜索" />
</P>
</form>
</div>
<div class="tab-div">
<form method="post" action="" name="listForm" onsubmit="">
<div class="list-div" id="listDiv">
<table cellpadding="3" cellspacing="1">
<tr>
<th>编号</th>
<th>商品名称</th>
<th>logo</th>
<th>市场价格</th>
<th>本店价格</th>
<th>上架</th>
<th>添加时间</th>
<th>操作</th>
</tr>
<?php foreach ($data as $k => $v): ?>
<tr class="tron">
<td align="center"><?php echo $v['id']; ?></td>
<td align="center" class="first-cell"><span><?php echo $v['goods_name']; ?></span></td>
<td align="center"><img src="/Public/Uploads/<?php echo $v['sm_logo'];?>"/></td>
<td align="center"><?php echo $v['market_price']; ?></td>
<td align="center"><?php echo $v['shop_price']; ?></td>
<td align="center"><?php echo $v['is_on_sale']; ?></td>
<td align="center"><?php echo $v['addtime']; ?></td>
<td align="center">
<a href="<?php echo U('edit?id='.$v['id']); ?>">修改</a>
<a onclick="return confirm('确定要删除吗?');" href="<?php echo U('delete?id='.$v['id']); ?>">删除</a>
</td>
</tr>
<?php endforeach; ?>
</table>
<!-- 分页开始 -->
<table id="page-table" cellspacing="0">
<tr>
<td width="80%"> </td>
<td align="center" nowrap="true">
<?php echo $page; ?>
</td>
</tr>
</table>
<!-- 分页结束 -->
</div>
</form>
</div>
</body>
</html>
<!--导入在线编辑器 -->
<link href="__PUBLIC__/umeditor1_2_2-utf8-php/themes/default/css/umeditor.css" type="text/css" rel="stylesheet">
<script type="text/javascript" src="__PUBLIC__/umeditor1_2_2-utf8-php/third-party/jquery.min.js"></script>
<script type="text/javascript" charset="utf-8" src="__PUBLIC__/umeditor1_2_2-utf8-php/umeditor.config.js"></script>
<script type="text/javascript" charset="utf-8" src="__PUBLIC__/umeditor1_2_2-utf8-php/umeditor.min.js"></script>
<script type="text/javascript" src="__PUBLIC__/umeditor1_2_2-utf8-php/lang/zh-cn/zh-cn.js"></script>
<link href="__PUBLIC__/datetimepicker/jquery-ui-1.9.2.custom.min.css" rel="stylesheet" type="text/css" />
<script type="text/javascript" charset="utf-8" src="__PUBLIC__/datetimepicker/jquery-ui-1.9.2.custom.min.js"></script>
<script type="text/javascript" charset="utf-8" src="__PUBLIC__/datetimepicker/datepicker-zh_cn.js"></script>
<link rel="stylesheet" media="all" type="text/css" href="__PUBLIC__/datetimepicker/time/jquery-ui-timepicker-addon.min.css" />
<script type="text/javascript" src="__PUBLIC__/datetimepicker/time/jquery-ui-timepicker-addon.min.js"></script>
<script type="text/javascript" src="__PUBLIC__/datetimepicker/time/i18n/jquery-ui-timepicker-addon-i18n.min.js"></script>
细节我们就不深究,具体你可以参考ecshop的做法
第二步 我们先想像要再哪里可以展示视图,应该是在控制器,所以我们可以假定,有一个函数
命名为lst,说再控制器里展示
代码如下:
<?php
namespace Admin\Controller;
use Think\Controller;
class GoodsController extends Controller {
public function add(){
if(IS_POST){
$model =D('goods');
/*
评:
这就好像《芙蓉镇》里的干部站队是一个道理,
例如把控制器看做是下级执行干部,上级的指示则是模型,视图则是我们看到穷苦百姓的日子,
如果下级站到商品经济一队,则为打为资本主义尾巴,百姓的日子就是扫大街
如果下级站到阶级斗争模型一边,则是社会主义接班人,百姓的日子搞批斗。*/
if( $model->create(I('post.'),1)) {
if($model->add()){
//插入到数据库
$this->success('操作成功',U('lst'));
exit;
//http://localhost:8989/php/TpShop/Admin/goods/add
}
}
$error=$model->getError();
$this->error($error);
}
//显示表单
$this->display();
}
public function lst(){
//商品列表页
$model=D('goods');
$data=$model->search();
/*这个方法只是我们假定它执行了,但具体落实,我们还需在模型中定义*/
$this->assign($data);
$this->display();
}
}
第三步 考虑模型中函数
<?php
namespace Admin\Model;
use Think\Model;
class GoodsModel extends Model{
protected $insertFields='goods_name,market_price,shop_price,is_on_sale,goods_desc';
//定义验证规则
/*
评:我们发现,抗日神剧里面有个桥段,就是日本人为检验你是不是中共特务,第一句台词:哟西哟西,你的,大大叫什么?其实程序上验证规则也是这样,验证这商品名称是不是空,验证市场价格是不是人民币?(最近看郭富城的《无双》造假币的故事)
*/
protected $_validate=array(
array('goods_name', 'require', '商品名称不能为空',1),
array('market_price','currency','市场价格必须为货币类型',1),
array('shop_price','currency','本店价格必须为货币类型',1),
);
//钩子方法:添加之前会自动调用
protected function _before_insert(&$data, $options) {
//获取当前时间
$data['addtime']= date('Y-m-d H:i:s', time());
$data['goods_desc']= removeXSS($_POST['goods_desc']);
if($_FILES['logo']['error']==0){
$upload=new \Think\Upload();//
$upload->maxsize=1024*1024;
$upload->exts=array('jpg','gif','png','jpeg');
$upload->rootPath='./Public/Uploads/';
$upload->savePath='Goods/';
$info=$upload->upload();
if(!$info){
$this->error($upload->getError());
return FALSE;
}else{
/**************** 生成缩略图 *****************/
// 先拼成原图上的路径
$logo = $info['logo']['savepath'] . $info['logo']['savename'];
// 拼出缩略图的路径和名称
$mbiglogo = $info['logo']['savepath'] .'mbig_'. $info['logo']['savename'];
$biglogo = $info['logo']['savepath'] .'big_'. $info['logo']['savename'];
$midlogo = $info['logo']['savepath'] .'mid_'. $info['logo']['savename'];
$smlogo = $info['logo']['savepath'] .'sm_'. $info['logo']['savename'];
$image = new \Think\Image();
// 打开要生成缩略图的图片
$image->open('./Public/Uploads/'.$logo);
// 生成缩略图
$image->thumb(700, 700)->save('./Public/Uploads/'.$mbiglogo);
$image->thumb(350, 350)->save('./Public/Uploads/'.$biglogo);
$image->thumb(130, 130)->save('./Public/Uploads/'.$midlogo);
$image->thumb(50, 50)->save('./Public/Uploads/'.$smlogo);
/**************** 把路径放到表单中 *****************/
$data['logo'] = $logo;
$data['mbig_logo'] = $mbiglogo;
$data['big_logo'] = $biglogo;
$data['mid_logo'] = $midlogo;
$data['sm_logo'] = $smlogo;
}
}
}
public function search($perPage=7){
/**你可能问我为什么要设置$perPage=7这样一个参数,他意思其实就是,就像《大江大河》里面的公布榜单,你不能说,我们把所有高考过的学生都往榜单上贴,而是考上的,而且可以贴得下的,都贴上去,可能是7个,也可能是5个所以就这意思,与我们在飞机场看航班就是一个道理**/
//取出总的记录数
//echo 1;
//echo "<br/>";
$count=$this->where($where)->count();
//echo $count;
////搜索页
$where=array();
$gn=I('get.gn');
/*这就好比我们面试要填公司表格是一个道理
例如你要填姓名,所以你要在脑子获取你姓名的信息*/
if($gn) {
$where['goods_name']=array('like',"%$gn%");}//
$fp=I('get.fp');
$tp=I('get.tp');
if($fp&&$tp){
/*期望薪资*/
$where['shop_price']=array('between',array($fp,$tp));
}
elseif ($fp) {
$where['shop_price']=array('egt',$fp);
}elseif ($tp) {
$where['shop_price']=array('elt',$tp);
}
//添加时间
/*入职时间*/
$fa=I('get.fa');
$ta=I('get.ta');
if($fa && $ta){
$where['addtime']=array('between',array($fa,$ta));
}
elseif ($fa) {
$where['addtime']=array('egt',$fa);
}elseif ($ta) {
$where['addtime']=array('elt',$ta);
}
//是否上架
$ios=I('get.ios');
if($ios){
$where['is_on_sale']=array('eq',$ios);
}
//生成翻页类的对象
$pageObj=new \Think\Page($count,$perPage);
$pageObj->setConfig('next','下一页');
$pageObj->setConfig('prev','上一页');
//生成页面显示的上一页,下一页的字符串
$pageString=$pageObj->show();
/***************** 排序 *****************/
$orderby = 'id'; // 默认的排序字段
$orderway = 'desc'; // 默认的排序方式
$odby = I('get.odby');
if($odby)
{
if($odby == 'id_asc')
$orderway = 'asc';
elseif ($odby == 'price_desc')
$orderby = 'shop_price';
elseif ($odby == 'price_asc')
{
$orderby = 'shop_price';
$orderway = 'asc';
}
}
//取数据
/*
为什么?
原因是,我取出的数据要在我的表格里进行渲染
怎么取?
$data=$this->order("$orderby $orderway")->where($where)->limit($pageObj->firstRow.','.$pageObj->listRows)->select();
评:这就好像,赵丽颖一部剧的桥段在填完她的入职表之后,我会用她给我的信息来评定她适合哪种岗位,只不过那部剧说得太神了。
*/
$data=$this->order("$orderby $orderway")->where($where)->limit($pageObj->firstRow.','.$pageObj->listRows)->select();
// print_r($data);
return array(
'data'=>$data,
'page'=>$pageString,
);
}
}
?>