ShopNC学习笔记_第1页
ShopNC学习笔记_第2页
ShopNC学习笔记_第3页
ShopNC学习笔记_第4页
ShopNC学习笔记_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、ShopNC学习笔记一、 目录结构:1代码0012代码0012二、 核心文件及常量介绍:31) 主要类文件及简要说明42) 系统函数53) 系统常量参考5三、 表单数据验证:7四、 缓存设计9五、 二次开发代码规范的建议11六、 图片处理12七、 二次开发之地区开发141、 目录结构:/ 根目录/admin 后台目录(目录名可更改)/api  API文件目录,存放ucenter、PHPWind、QQ互联、新浪微博、支付方式(支付宝,财付通、预存款等)和商品等API文件/cache 缓存文件目录/control 控制器目录(C)/dat

2、a 常用公共数据(地区、发言表情等)/framework 核心框架目录/install 安装程序目录/language 语言包目录/model 模型文件目录(M)/resource 资源目录(字体、JS文件、HTML编辑器、验证码用字体图片、二维码依赖文件等)/templates 模板文件目录,视图文件(V)/templdate/default 默认的模板风格/upload 附件目录(商品图、店铺认证、会员头像、促销活动图等上传的所有图片)ShopNC商城系统采用MVC模式,控制器文件位于control目

3、录,模型文件位于model目录,视图文件位于templates目录,系统框架依据act和op参数(GET/POST过来的)完成控制器调度。控制器类文件名一般为业务名称,类名称一般为 “业务名称+Control”,例如品牌控制器(control/brand.php)类名为brandControl。模型类文件名一般为“表名称+.model”,类名称“表名+Model”,例如广告模型(model/adv.mode.php)类名称为advModel。跟据商城业务需要,系统内置三个控制器父级类,BaseHomeControl、BaseMemberControl和BaseMemberStoreC

4、ontrol分别适用于前台展示、会员中心、店铺中心三类控制器。代码001控制器:Language:read('home_brand_index');       /使用模型获得品牌列表       $model = Model();              $brand_list = $mo

5、del->table('brand')->select();              /向模板抛出内容              Tpl:output('brand_list',$brand_list);       

6、60;      /设置页面标题              Tpl:output('html_title',Language:get('brand_index_brand_list');              /输出SEO设置信息  

7、            Model('seo')->type('brand')->show();              /调用模板展示              Tpl:showpa

8、ge('brand');代码001模板代码view:<?php defined('InShopNC') or exit('Access Invalid!');?><!-上面是进行合法验证,在商城系统下的模板文件都需要进行该验证。-><?php include template('home/cur_local');?><!-上面是在品牌展示页面显示当前位置,实际输出内容为:当前位置:首页 > 所有品牌 -><h2><b><?php echo $lan

9、g'brand_index_brand_list'?></b></h2><!-上面是输出标题,实际内容为:品牌列表-><!-$lang 数组内容为Language:read() 得到的语言包信息,-><?php if(is_array($output'brand_list')?><!-使用Tpl:output抛出到模板的内容,保存到了$output数组中,保存下标名称为output方法的第一个参数值,-><?php foreach($output'brand_list&#

10、39; as $key=>$val)?><!-循环输出品牌内容-><div class="wrap"> <ul> <li> <a href="<?php echo ncUrl(array('act'=>'brand','op'=>'list','brand'=>$brand'brand_id');?>" ><!- 生成跳转URL(伪静态或动态)->

11、 <span><img src="<?php echo ATTACH_BRAND.'/'.$brand'brand_pic'?>" alt="<?php echo $brand'brand_name'?>" /></span> </a> </li> </ul> </div><?php ?><?php ?>2、 核心文件及常量介绍:ShopNC商城程序的框架文件主要由类文件和函数

12、文件组成。系统类库主要存放在framework下的libraries、cache、core和tpl目录中,librarites存放的是一些类库,cache下是存放多种缓存驱动类,core下存放的是核心基类和模型处理类,tpl只存放视图类Tpl。1) 主要类文件及简要说明libraries/email.php 邮件发送类libraries/ftp.php ftp处理类libraries/gdimage.php 水印类libraries/json.php json处理类libraries/language.php 语言包处理类libraries/log.php 日志类libraries/page.

13、php 分页类libraries/resizeimage.php 图片裁切类libraries/seccode.php 验证码处理类libraries/security.php 字符过滤类libraries/sphinx.php sphinx全文检索类libraries/upload.php 上传类libraries/validate.php php后端验证类cache/ cache.php 缓存统一处理类,它是每种缓存类的操作入口cache/cache.file.php 文件缓存类cache/ cache.apc.php apc缓存类cache/cache.xcache.php xcache

14、缓存类cache/cache.memcache.php memcache缓存类cache/ cache.eaccelerator.php eaccelerator缓存类cache/cache.table.php table缓存类 core/model.php 模型类 core/db.php 数据库操作中间层,界于模型和数据驱动中间的中间处理类 db/mysql.php mysql扩展MySQL数据库驱动 db/mysqli.php mysqli扩展MySQL数据库驱动 db/pdo_mysql.php pdo_mysql扩展MySQL数据库驱动 db/oci8.php oci8扩展ORACLE

15、数据库驱动 tpl/nc.php 模板类(视图类)2) 系统函数均存放在framework/function目录中,考虑到以后的扩展,系统跟据功能将函数拆分进入不同的文件中,core.php 存放系统的通用函数goods.php 存放处理商品、订单、店铺相关的信息的函数ftp.php 存放ftp操作的相关函数seccode.php 存放验证码操作的函数build.php 存放框架压缩的函数系统引用的第三方开源程序放在了/resource目录中,主要包含以下子目录avatar 存放头像上传组件clickswf 存放点击量统计FLASH组件font 存放字体js 存放js文件kindeditor

16、存放kindeditor编辑器phpqrcode 存放二维码组件seccode 存放验证所需要元素web_config 存放首编辑模块编辑所需要组件3) 系统常量参考ProjectName=> 项目名称BUILDCORE=> 是否压缩框架(true/false)BasePath=> 系统所在基准目录(如 /var/www/shopnc)DS => 目录分隔符 /InShopNC=> 合法调用判断标志StartTime=> 系统开始运行时间(如1350096132.6587)TIMESTAMP=> 系统当前时间(如1350096132)RUNCOREPA

17、TH=>压缩后的框架所在目录 (如 /var/www/shopnc/cache/shopnc.php)SiteUrl=> 商城URL地址()CHARSET=> 系统编码(UTF-8/GBK)DBDRIVER=> 数据库访问驱动(mysqli、mysql、pdo_mysql、oci8)SESSION_EXPIRE=> 缓存周期,单位(秒)LANG_TYPE=> 语言包,默认简体中文zh_cnCOOKIE_PRE=> cookie前缀,系统自动生成CORE_PATH=> 框架所在目录(如 /var/www/shopnc /framework)TPL_

18、NAME=> 模板风格,默认defaultBASE_TPL_PATH=> 模板文件目录(如 /var/www/shopnc /templates/default)RESOURCE_PATH=> 外部资源目录地址(如 DBPRE =>数据库表前缀 默认shopnc_ATTACH_PATH=> 附件目录,默认uploadATTACH_COMMON=> 通用附件目录 默认upload/commonATTACH_AVATAR=> 头像目录 默认 upload/avatarATTACH_STORE=> 店铺信息目录 默认 upload/storeATTAC

19、H_GOODS=> 店铺产品目录 默认 upload/store/goodsATTACH_AUTH=> 店铺证件目录 默认 upload/authATTACH_MOBILE=> 手机客户端内容目录 默认upload/mobileATTACH_LINK=> 友情链接logo目录 默认upload/linkATTACH_ARTICLE=> 文章附件目录 默认 upload/articleATTACH_BRAND=> 品牌附件目录 默认 upload/brandATTACH_ADV=> 广告图片目录 默认 upload/advATTACH_ACTIVITY=

20、> 促销活动目录 默认 upload/activityATTACH_COUPON=> 优惠券目录 默认 upload/couponATTACH_WATERMARK=> 水印图片目录 默认 upload/watermarkATTACH_POINTPROD=> 积分商品图片目录 默认 upload/pointprodATTACH_SPEC=> 自定义规格图片目录 默认 upload/specATTACH_GROUPBUY=> 团购图片目录 默认 upload/groupbuyATTACH_SLIDE=> 店铺二维码目录 默认 upload/store/sl

21、ideATTACH_VOUCHER=> 代金券模板目录 默认upload/voucherTEMPLATES_PATH=> 模板URL访问地址(如MD5_KEY=> MD5_KEY值 系统自动生成3、 表单数据验证:数据安全是程序开发中至关重要一点,特别是对商城程序而言,一般对表单数据验证都是采用前端JS与后端PHP验证相结合的方式,ShopNC商城系统在表单数据验证上也是如此, ShopNC系统的后台PHP验证分为两部分:控制器层验证和框架底层验证,Validate验证类的作用就是完成在控制器里的验证。下面是登录时的一段使用Validate类验证程序:if (chksubmi

22、t() $obj_validate = new Validate(); $obj_validate->validateparam = array( array("input"=>$_POST"username", "require"=>"true", "message"=>"请输入用户名"), array("input"=>$_POST"password", "require"=>

23、"true", "message"=>"请输入密码"), array("input"=>$_POST"captcha", "require"=>(C('captcha_status_login') ? "true" : "false"), "message"=>"请输入验证码"), ); $error = $obj_validate->validate

24、(); if ($error != '')/输入信息有误,验证失败! showValidateError($error); else /* * 程序继续向下执行 */ 代码分析:首先由chksubmit函数判断表单提交是否合法,令牌是否正确,判断通过后,使用Validate类进行数据验证,Validate类的validateparam属性数组存放待验证的信息,其中,input为待验证的数据,require为是否为必填项(true/false),message为如果验证未通过,返回的提示信息。可以看出上例的用户名和密码均为必填项,验证码视系统开关captcha_status_lo

25、gin的值而定。C函数作用是取得系统配置项。准备工作都完后成,开始调用类的validate方法进行验证,如果验证未过通,返回错误信息,否则返回空。错误信息的输出由showValidateError函数完成,该函数跟据是否是异步提交返回不同的提示形式。除可以验证是否为必填外,Validate类还可以完成一些常用的数据类型验证。如验证邮件、电话、网址、货币、邮编、QQ、数字、英文、汉字、两数值比较等。如:$obj_validate = new Validate();$obj_validate->validateparam = array( array("input"=&g

26、t;$_POST"password1", "require"=>"true", "validator"=>"compare", "operator"=>"=", "to"=>$_POST"password2", "message"=>"两次密码输入要一致"),array("input"=>$_POST"input

27、0", "require"=>"true", "validator"=>"email", "message"=>'邮件验证'),array("input"=>$_POST"input1", "require"=>"true", "validator"=>"phone", "message"=>

28、;'固话验证'),array("input"=>$_POST"input2", "require"=>"true", "validator"=>"mobile", "message"=>'手机验证'),array("input"=>$_POST"input3", "require"=>"true", "

29、;validator"=>"url", "message"=>'网址验证'),array("input"=>$_POST"input4", "require"=>"true", "validator"=>"currency", "message"=>'价格验证'),array("input"=>$_POST&quo

30、t;input5", "require"=>"true", "validator"=>"number", "message"=>'数字验证'),array("input"=>$_POST"input6", "require"=>"true", "validator"=>"zip", "message&quo

31、t;=>'邮编验证'),array("input"=>$_POST"input6", "require"=>"true", "validator"=>"qq", "message"=>'QQ验证'),array("input"=>$_POST"input6", "require"=>"true", &qu

32、ot;validator"=>"english", "message"=>'英文字母验证'),array("input"=>$_POST"input6", "require"=>"true", "validator"=>"chinese", "message"=>'中文验证'),);$error = $obj_validate->va

33、lidate();4、 缓存设计系统可以对数据进行多种形式缓存,包括文件方式、共享内存方式和数据库方式。目前已支持的缓存方式包括:file、apc 、eAccelerator 、memcache 和 xcache,开发者也可以开发更加适合自己的缓存。系统由Cache缓存类进行缓存操作,由Cache:getInstance方法完成缓存类型实例化: /取得memcache缓存实例$obj_cache = Cache:getInstance('memcache');/缓存赋值$obj_cache->set('uid',1000);/读取缓存$obj_cache-

34、>get('uid');/删除缓存$obj_cache->rm('uid');系统需要将部分常用表信息(如基本配置表、商品分类表、快递表、SEO表等)生成缓存,为了便于操作,系统对这些表的缓存处理封装到专有的cache模型中,使用Model('cache')->call(表名) 即可得到符合缓存格式的表信息。为了方便对缓存的操作,系统新增了H和F方法,H方法对缓存类操作再次进行封装。如取得系统cache/setting.php缓存信息:H('setting');内部执行过程为:首先取得file缓存实例$obj_c

35、ache = Cache:getInstance('file')判断操作类型(删除缓存?、缓存赋值?缓存读取?),然后执行$obj_cache->get('setting');取得缓存内容,至此执行完毕。使用H方法将setting表信息生成到文件缓存:H('setting',true,'file');内部执行过程为:首先取得file类型缓存实例,$obj_cache = Cache:getInstance('file')判断操作类型(删除缓存?、缓存赋值?缓存读取?),然后执行$obj_cache->r

36、m('setting');删除原有setting缓存,实例化cache模型并执行_setting方法来取得setting表中的内容,$list = Model('cache')->call($key); 使用set方法写入缓存 $obj_cache->set($key, $list, null, $expire); 最后返回true,至此缓存生成成功。 F 方法也可以操作缓存,但它与H方法不同,F只是一种快速度读、写文件缓存的方法,不可用于内存缓存的操作,F方法不能直接将数据表内容生成缓存,只可将PHP中已经存的内容(如数组、字符串等)生成到文件缓存

37、,在读取文件缓存时,推荐使用效率更高的F方法。F('setting'); /取得setting缓存F('setting',$data); /将$data数组生成到setting文件缓存5、 二次开发代码规范的建议关于PHP书写:1. 代码标记建议使用标准形式(<?php ?>),不建议使用简写形式(<? ?>),如果服务器未开启对短标记的支持(short_open_tag = Off),将会有暴露源码的危险。2. 模板中输出变量使用“echo” 输出,以分号结尾,不建议使用“=”输出。3. 对于函数级、类类及文件头注释使用C样式的注释“/

38、* */”,对于代码行(段)的注释可使用标准C+注释”/”。4. 建议使用缩进保持代码的层级关系,每个缩进的单位约定是一个TAB(4个空白字符宽度),开发工具建议使用Zend Studio、UltraEdit、EditPlus等编辑器。5. 关于PHP变量的命名规则,建议以英文拼写为蓝本,遵循简洁和可读性原则,至于采用C风格还是Java风格还是其它,可跟据自己习惯,本人不做强制建议。6. 全局常量的定义要统一使用大写,单词之间使用下划线连接。7. 开发时,代码的error_reporting报错级别建议设置为E_ALL & E_NOTICE。8. Include,require包含文件

39、时建议使用绝对路径,框架底层引入文件可使用Include,require(不带once效率高一些),在业务逻辑层引入文件时可使用Include_once,require_once。关于数据库:1. 表和字段命名同样应以英文拼写为蓝本,遵循简洁和可读性原则,长度适中,建议长度在30个字符内,否则跨库迁移可能会存在麻烦。2. 字段类型设置应遵循足够用不浪费的原则。3. SQL语句中,除了表名、字段名称以外,全部语句和函数均应大写。4. 尽可能避免直接编写SQL语句去执行,提倡使用系统数据库操作层相应入口来完成。5. 索引可以加快检索速度,但不易过多,单个表建议不超过5个索引。关于目录的安全:1.

40、文件与目录命名均使用小写字母,php文件后缀均为“.php”,2. 请在敏感目录中放置一个1字节的index.html文件,内容为一个空格,以避免当http服务器的Directory Listing打开时,服务器文件被索引和列表。3. 根目录创建一个空格为内容的robots.txt文件,防止搜索蜘蛛抓取时,因找不到该文件而产生一个error信息而产生大量的无效WEB日志。6、 图片处理首先实例化上传类$upload = new UploadFile();然后设置上传商品图片上传目录$upload->set('default_dir',ATTACH_GOODS.DS.$up

41、load->getSysSetPath();设置上传图片宽高最大尺寸,多出部分将被按比例裁切$upload->set('max_size',C('image_max_filesize');跟据业务需要,系统将图片裁剪为4张缩略图,4张图的最大宽度设置从配置文件中取得$thumb_width =sprintf('%s,%s,%s,%s',C('thumb_tiny_width'),C('thumb_small_width'),C('thumb_mid_width'),C('thum

42、b_max_width');设置最大高度$thumb_height =sprintf('%s,%s,%s,%s',C('thumb_tiny_height'),C('thumb_small_height'),C('thumb_mid_height'),C('thumb_max_height');$upload->set('thumb_width', $thumb_width);$upload->set('thumb_height',$thumb_height);设

43、置4张图片的名称后缀$upload->set('thumb_ext', '_tiny,_small,_mid,_max');系统还支持设置文件名称前缀$upload->set('fprefix',$store_id);系统允许上传哪些类型的图片$upload->set('allow_type',array('gif','jpg','jpeg','png');调用upfile方法开始上传操作$result = $upload->upfile($_

44、POST'product_thumb');如果上传错误,输出json格式的错误信息if (!$result) 如果系统是GBK格式,则转成utf-8编码,再输出json信息 if(strtoupper(CHARSET) = 'GBK') $error= Language:getUTF8($upload->error); $output= json_encode(array('error'=>$error); 输出json信息,(商品图片上传是异步上传) exit($output);如果上传无误,返回图片新路径$img_path =$u

45、pload->getSysSetPath().$upload->file_name;以上是商品图片上传处理的主要代码(裁剪由uploadfile类内部完成),得到商品图片新路径后,保存入库即可。保存到商品表的商品图片只是缩略图一种尺寸,商城使用封装的图片调用函数来满足不同页面对不同尺寸图片的要求,这些函数位于framework/function/goods.php中,分别为thumb ,cthumb,gthumb,这些函数的具体使用可查看官方手册。系统支持多种图片存储方式配置,打开商城根目录下的config.ini.php,找到$config'thumb''save_type'项,默认为$config'thumb''save_type' = 1;表示本地存储,使用商城域名访问。$config'thumb''save_type'= 2;表示图片存储目录不变,但支持使用图片域名指向存储目录,如指向upload目录(也适用于CDN加速的情况)。7、 二次开发之地区开发最近碰到一个基

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论