首先,这是我在博客园的第一篇文章!看着一些厉害的大牛们,写的那么好的文章!真是羡慕不已。
今天就利用这次机会好好的也发挥下自己哈!希望各位可以多多指教。有不好之处记得评论哦,本人正处于学习中哈。
临近期末了,也正好给自己复习复习,回顾一下整个学期来所学的东西。
第一:要先明确一下需求。
1、用户注册登陆
2、后台分类添加
3、后台商品添加
4、前台显示分类,例如格式为:手机(3) 数量为改分类下的所有商品数量。
5、前台显示商品列表
6、商品显示分页显示,例如格式为:<Prev 1 2 3 4 5 Next> 当前页面显示在中间,自动补齐功能
7、商品详细页,有难点是:一张主图,多张小图。
8、加入购物车(有修改数量功能,删除功能)
9、结算填写收获地址,结账数据提交到数据库
10、后台订单显示页
第二:需求明确后,我们就要开始设计数据库了。在设计数据库的前提下,我们又要搞定好各个表的各种关系。
1、用户表(id,username,userpwd,ctime)由于是简单的商城网站实现,故不考虑太多的权限以及另外的功能。所以用户表较为简单。
2、根据后台的分类添加 ----分类表(字段包括:id,pid,name,csort分别代表id,父id,分类名,排序)
3、商品表(id,name,title,details,prices,ctime,category) 在关系中与分类表是多对一的关系。一个分类可以存放多个商品
4、附件表(id,name,oname,type,size,extname,ctime,goods)也可称为是图片表,一个商品对应的多个图片。
5、订单表(id,code(订单编号),total,user,ctime,st_name,st_address,st_postcode(邮编),st_mobile,st_phone)
6、订单项表(id,goods,number,subtotal,orders) --该表由于考虑到在一个订单里面可能会存在多个不同的商品。
第三:有了需求,有了数据库,有了思路。就来赶紧完成最好完成的一块了。Model模型。当然在模型中,基本上的字段都是和数据库是一样,在这我就不一一打出来了,但是我会把我觉得需要考虑以及需要注意的重点位置给写出来。
model的话,其实也就是一个数据临时存放的对象。
对于商品表的model我觉得有一点是需要记住的,就是获取第一张图片。下面是商品表的model
class Goods{
......
private $firstimg;
private $attachs=array();
下面的get,set就不一一列出来了。就列个取出第一张图片的get,set就可以了。
public function getFirstimg(){
if(count($this->attachs)>0)
{
$this->firstimg=$this->attachs[0];
}else{
$defaultimg=new Attach();
$defaultimg->setName("noimg.jpg"); //如果没有图片就给他初始个图片。
$this->firstimg=$defaultimg;
}
return $this->firstimg;
}
......
}
第二个是订单项的model,在这个model里面,主要是有个小计的功能。当你存进来的时候就要事先把小计给计算出来。
所以需要一个构造函数:
function __construct($id,$goods,$number)
{
$this->id=$id;
$this->goods=$goods;
$this->number=$number;
$this->subtotal=$goods->getPrice()*$number;
}
这样就实现了小计的功能了。
第三是订单model 在当你把所有订单项放在同个订单的时候要取出总计,故当存入订单项后就要计算出总计。
public function setOrderitems($orderitems){
$this->orderitems=$orderitems;
$total=0;
for($i=0;$i<count($this->orderitems);$i++)
{
$total+=$this->orderitems[$i]->getSubtotal();
}
$this->total=$total;
}
public function getTotal(){
$total=0;
for($i=0;$i<count($this->orderitems);$i++)
{
$total+=$this->orderitems[$i]->getSubtotal();
}
$this->total=$total;
return $this->total;
}
好了,前期功能终于做好了。剩下的就是DAO(我们所说的与数据库操作的文件_增删查改等),和程序的控制器了。
今天就到期为止了。期待下篇文章的诞生吧哈。也希望自己能够在考试之前,整体的过一遍。
下一篇我将会继续DAO的完善。
希望大家可以多多点评。学生一名,写的不好,请谅解。
本文链接
编译式模板与解析式模板
编译式模板是提前生成html页面,而解析式模板则是在执行时逐个语句解析,这里解释的对象是标签。两者在解释原理上有不同,在语法上、表达能上几乎相同,但也略有区别。现在编译式模板还较少,但将来编译式模板会逐步取代解析式模板
这篇文章主要讨论编译式模板与解析式模板运作的基本原理,以及如何自定义标签。这对使用好标签有一定意义。
1编译式模板
先来写个程序(以后root代表根目录)
root/code.php
//利用dedecms写php时,基本都要引入common.inc.php
require_once (dirname(__FILE__) . '/include/common.inc.php');
//利用编译式模板所需的文件
require_once (DEDEINC.'/dedetemplate.class.php');
//生成编译模板引擎类对象
$tpl = new DedeTemplate(dirname(__file__));
//装载网页模板
$tpl->LoadTemplate('code.tpl.htm');
//把php值传到html
$title = 'Hello World 网页';
$tpl->SetVar('title',$title);
$tpl->Display();
//把编译好的模板缓存做成code.html,就可以直接调用
$tpl->SaveTo(dirname(__FILE__).'/code.html');
?>
root/code.tpl.htm
<html>
<head>
<!— var标签 -->
<title> {dede:var.title/} </title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
</body>
</html>
打开http://localhost/code.php查看网页
由上面的例子可以看出编译式模板运作的套路:
1php文件调用网页模板,并显示。
2htm文件提供网页的大体框架,等待数据来完善网页的具体内容,称为网页模板。
之后可以看一下具体语法文件夹中的编译式标签语法 手册
会发现编译式模板中有四种“势力”
在include/dedetemplate.class.php中定义的编译引擎类,负责操作编译,它提供负责非自定义标签的编译。
标签翻译需要一些转换规则,一般标签的定义在dedetemplate.class.php中实现,自定义标签则在include/tpllib中。(编译式模板的标签就仅有文件夹里为数不多的几个,可见编译式标签现在还不好用),上面的例子中的SetVar就属于这部分。
待显示的php创建编译引擎类对象,对模板进行编译,在Display时,产生缓存,并显示(include)缓存文件。
htm模板,调用标签,用html的形式写出动态网页的效果,属于被翻译的部分。利用标签封装内部处理。
理论上有了这四种元素,就能写出网页。但由于现在的标签以解析式居多,所以还是以解析式的这四种组分(解析式中同样也有这几种组分)为主框架构造网页(换句话说,现在的编译式模板还派不上用场)。
编译式Display时,只是把编译好,放在cache中的结果给include一下而已。
之后就是自定义标签。
具体做法,在include/tpllib中找一个文件来仿制。如plus_ask
root/include/tpllib/plus_hello
if(!defined('DEDEINC')) exit('Request Error!');
/**
* 动态模板hello标签
*
* @version $Id: plus_ask.php 1 13:58 2010年7月5日Z tianya $
* @package DedeCMS.Tpllib
* @copyright Copyright (c) 2007 - 2010, DesDev, Inc.
* @license http://help.dedecms.com/usersguide/license.html
* @link http://www.dedecms.com
*/
function plus_hello(&$atts,&$refObj,&$fields)
{
global $dsql,$_vars;
//给出标签的属性默认参数值列表,以’,’分隔,即使不设置默认参数也要给出属性名
$attlist = "name=";
FillAtts($atts,$attlist);
FillFields($atts,$fields,$refObj);
extract($atts, EXTR_OVERWRITE);
//返回处理结果,以替换标签
return '你好!'.$name;
}
?>
在刚才的root/code.tpl.htm 加入这个标签
{dede:hello name='Erik' rstype='string'/}<br/>
打开http://localhost/code.php查看网页
以上是短标签,对于块标签如下
root/include/tpllib/plus_hello
if(!defined('DEDEINC')) exit('Request Error!');
PHP分页器制作,自动生成分面页码,JS调用函数
class PageView{
/**页码**/
public $pageNo = 1;
/**页大小**/
public $pageSize = 20;
/**共多少页**/
public $pageCount = 0;
/**总记录数**/
public $totalNum = 0;
/**偏移量,当前页起始行**/
public $offSet = 0;
/**每页数据**/
public $pageData = array();
/**是否有上一页**/
public $hasPrePage = true;
/**是否有下一页**/
public $hasNextPage = true;
public $pageNoList = array();
public $jsFunction ='jsFunction';
/**
*
* @param unknown_type $count 总行数
* @param unknown_type $size 分页大小
* @param unknown_type $string
*/
public function __construct($count=0, $size=20,$pageNo=1,$pageData =array(),$jsFunction='jsFunction'){
$this->totalNum = $count;//总记录数
$this->pageSize = $size;//每页大小
$this->pageNo = $pageNo;
//计算总页数
$this->pageCount = ceil($this->totalNum/$this->pageSize);
$this->pageCount = ($this->pageCount<=0)?1:$this->pageCount;
//检查pageNo
$this->pageNo = $this->pageNo == 0 ? 1 : $this->pageNo;
$this->pageNo = $this->pageNo > $this->pageCount? $this->pageCount : $this->pageNo;
//计算偏移
$this->offset = ( $this->pageNo - 1 ) * $this->pageSize;
//计算是否有上一页下一页
$this->hasPrePage = $this->pageNo == 1 ?false:true;
$this->hasNextPage = $this->pageNo >= $this->pageCount ?false:true;
$this->pageData = $pageData;
$this->jsFunction = $jsFunction;
}
/**
* 分页算法
* @return
*/
private function generatePageList(){
$pageList = array();
if($this->pageCount <= 9){
for($i=0;$i<$this->pageCount;$i++){
array_push($pageList,$i+1);
}
}else{
if($this->pageNo <= 4){
for($i=0;$i<5;$i++){
array_push($pageList,$i+1);
}
array_push($pageList,-1);
array_push($pageList,$this->pageCount);
}else if($this->pageNo > $this->pageCount - 4){
array_push($pageList,1);
array_push($pageList,-1);
for($i=5;$i>0;$i--){