ecshop开发详解功能了解介绍安装后台管理程序分析重要表执行流程底层库js库分析练手功能去除标题[PHP]去除版权标志[js]最新评论[PHP+模板]二次开发自定义title [php]email登陆[php]多商品倒计时[js]模板开发1.1 ecshop介绍ecshop是一款b2c的商城程序.目前(2014年1月11日) 最新程序是ecshop-2.7.3版本.已被上海商派(shopex)购买,更新缓慢.程序特点: 面向过程,通过函数库与函数调用,来获取数据,并能过smarty模板来展示数据. 学习难度小,二次开发比较直观.1.2 安装下载最新的ecshop-2.7.3为例,解压得到如下3个目录,其中upload就是需要上传的主程序.把upload解压到web目录下,并改名,如ecshop, 并用浏览器打开,即可进入自动安装过程.1.3 后台管理常用选项:商品管理栏目管理会员注册项导航配置模板选择注意: 在使用一些比较成熟的程序时,尽量通过后台配置选项,来达到目的,而不要直接修改代码.因为后台配置效率更高, 更重要的,如果直接修改代码,后续程序的升级将带来麻烦.2.1 重要的表分析Ecs_goods表:商品表Ecs_category :栏目表Ecs_brand:品牌表Order_info 订单表Order_goods 订单对应的商品表.order_action 订单操作的原始记录User 用户表User_account 用户账户表Account_log:用户的账户变动流水表Collect_goods: 用户收藏商品表Feedback表:留言表,不针对商品,直接针对店家留的言. Comment:是针对商品做的评论.Nav 表导航链接表,可以定制页面上的导航信息.2.2 执行流程1:Ecshop 属于面向过程+函数调用为主, 而且没用单入口模式具体的功能对应具体的页面. 2:用的模板引擎是简化的smarty 模板.以goods.php 为例在init 中包含的页面,基本都是声明函数.(因为ec 是面向过程+函数来编程的)inc_constants 系统常量cls_ecshop 用来获取网站的域名,ec 版本,图片目录,表前缀等基础信息cls_error.php 获取和输出错误信息.lib_time 获取和格式化时间的相关函数lib_base 计划字符串长度,获取客户IP,发邮件等,几乎所有网站都能用到的基础函数 lib_common ecshop 各页面都用到的函数,如拼接sql,获取栏目列表,构造面包屑导航. lib_main.php ecshop 常用的函数,主要是用户和模板赋值函数多一些.lib_insert.php 是为了用smarty 模板时,有些局部不缓存的地方,需要调用函数,都在这儿 lib_goods.php 是商品操作的相关函数lib_article.php 文章操作的相关函数注: 更详细的函数说明在”ECSHOP 函数.doc ”里Lib_base.php : base 基地基础,此文件声明的是全网站甚至任何网站,都常用用到的函数,Sub_str : 截取中文无乱码的文件.Real_ip: 读取客户端IP, 从$_SERVER 来读的.Str_len: 计算字符串在视觉效果上的长度, 一个中文按2个字符算(因为多数情况下,一个中文的宽度是一个字母的2倍宽.)Get_crlf: 获取当前用户的换行符. Windows->\r\n, *nix->\n , mac->\rSend_mail : 发送邮件.Get_version:获得服务器环境的gd 库版本File_mode_info:获取文件的权限信息.Goods.php Require (Init.php) .... .... 业务逻辑function xxx();function yyy();inc_constants.phpcls_ecshop.phpcls_error.phplib_base.phplib_common.phplib_main.phplib_insert.phplib_goods.phpLog_write: 记录日志到文件Mk_dir: 递归创建目录addslashes_deep:递归的对数组进行转义.addslashes_deep_obj: 递归对对象的属性进行转义.stripslashes_deep :递归反转义make_semiangle: 全角字符转半角check_file_type :检查文件后缀,一般检查后缀,直接通过截取文件名来实现.A.php==> a.jpg,伪装上传,带来攻击. Ngnix+PHP某个版本,就有此漏洞.而check_file_type是通过分析文件的头信息域来实现的.mysql_like_quote:对sql语句扣like条件进行转义,防止注入.real_server_ip:获取服务器端IP地址ecs_geoip: 把IP地址转为"省市地址".trim_right:中英文混杂时,去除右侧可能的乱码.read_static_cache:读文件缓存(把数组等信息序列化,放在文本里存储) write_static_cache:写文件缓存.Lib_common.php主要放置本网站要实现的一些功能的主要函数比如:Get_brand_list 获取品牌列表get_children:获取指定栏目的子孙栏目.本文件下的函数比较多,用到的再来讲解.Lib_main.php主要放置前台功能的函数库比如:update_user_info :更新用户的session信息get_user_info:获取用户的详细信息assign_ur_here:计算面包屑导航路径.assign_articles:获取文章列表并赋给smartyLib_insert.php放置的是在模板中局部不缓存时,调用的insert_开头的函数.Lib_goods.php是商品操作最频繁函数.小试牛刀:以商城标题中, 去除"powered by Ecshop"为例打开任意一个页面, 看其模板,以goods.php为例Goods.php->找模板->goods.dwt,分析模板的标签, 找到相应的{$page_title}标签回到goods.php里,必须推出--> assing('page_title',xxx)这个过程,再找到,===> $page_tile=>$position['title']=>$position==>assign_ur_here()函数留一下问题:在开发的过程中,有时需要清缓存才能看到效果如何彻底禁用缓存,方便开发时的调试.js函数追踪utils.js 底层兼容库common.js 购物逻辑相关的函数addToCart() 把商品添加到购物车collect() 添加商品到收藏夹gotoPage() ajax评论翻页gotoPage() 格式化价格addPackageToCart() 添加礼包到购物车shopping_flow.js 处理购物车过程中相关的函数selectShipping() 改变配送方式selectPayment() 改变支付方式changeSurplus() 改变余额transport.js ajax操作库Ajax.call() // 发送ajax查询showdiv.js 漂浮层的库showdiv() 显示漂浮层hidendiv() 隐藏漂浮层lefttime.js 显示剩余时间的库便于做抢购时用.三练手功能 3.1 去除标题中的”powered By Ecshop”大思路: 库函数--被调用--->goods.php->assign()赋值--->display到模板倒过来寻找,从模板找变量,再找assgin过程,再找相关函数.把{$page_title}随便改成其他内容,刷新页面,看到效果.--->到goods.php, 查看page_title的assign过程,看到如下追踪assign_ur_here()函数,先在本页面(goods.php)寻找,没找到.在lib_main.php里.追踪到lib_main.php里3.2 去除版权打开index.dwt模板,观察底部发现引入了page_footer.lbi,追踪page_footer.lbi清除此行,并刷新发现---- 底部指定位置已经去除了版权标志,但是, 每刷新,版本的文字,就随机在底部漂浮. 跟踪js的页面自动加载的函数,在js中找到相关函数3.3 最新评论index.php---调用函数--获取最新评论---->assign()赋值给模板---->display--->index.dwt分析:最新评论的函数,优先找系统函数,没有没有,则自己写.assign()修改模板注意:在indew.dwt里, 增加如下代码四: 二次开发二次开发的大原则1:能后台配置,不去修改.2:能用js,css实现,不改模板(比如来一个隔行换色) 3:能改模板的,不要改PHP4:能改PHP完成的,不要改数据库一部话概括------逻辑要前移1)自定义title[php+模板]2)用户名/email都可以登陆[php]3)团购倒计时js4.1 自定义商品title商品页面自定义title,便于SEO功能讲解:商品页面的title信息是"商品名->栏目名->上级栏目名->网店名"这个规则来自动生成. 对于title,是SEO一个很重要的数据,自动生成的title很可能不符合SEO的需要.步骤:我们如何自定义title?答:首先在商品表增加title字段,然后在商品页面的.php文件中,读取此字段并赋给smarty然后再展示到模板上.从后台管理角度看:发布商品时,表单中应有自定义title表单项,并能提交入库.修改商品时,表单中也应有自定义title表单项,并能提交入库.实施:1:给ecs_goods商品表增加seotitle字段.alter table ecs_goods add seotitle varchar(60) not null default '' after goods_name;2:在后台修改商品发布时的表单项,增加"自定义title"表单项./admin/templates/goods_info.htm 40行左右3:admin/goods.php中的insert ,update代码段,800行左右,分别接收$_POST[seotitle],并拼接在insert语句或update语句中4:在模板中,goods.dwt中, 做逻辑判断,展示seotitle或page_title4.2 用户名和email 都可以登陆ecshop 的登陆原理ecshop 允许集成其他的网站,如dede,discuz 等, 并共用会员信息.ec 的登陆做了一个统一的登陆接口,满足接口,即可开发出与dede,discuz 共用的登陆功能. 达到整合目的.跟踪user.php 找act_login 代码段,找到如下:调用的是$user 这个对象, 继续跟踪$user 这个类在哪儿---->$user---返回自---->init_user()----定义在-->lib_common.php找到如下函数看到: 登陆时用的类,是根据配置文件定义的.有很多类,如下: 这些类,分别是phpbb,discuz 的登陆接口,用来整合用的. 我们当前用是 ecshop 登陆接口登陆 用户名:[] 密码:[]user.php?act=act_login在登陆接口父类中,增加一个方法,根据email来获取用户名.再在login方法里,做判断如果传来email,则先把email转换为username,然后再登陆4.3 商品团购倒计时php修改: group_buy.php目的: 得到页面内的每个团购的id及结束时间,并形成json格式,输入在模板中. 模板修改: group_buy_list.dwt把每个团购的剩余时间,包在一个span里,并取一个独特的id.接下来,在模板的末尾,showtime()根据gb_json_list循环修改每个团购的剩余时间formattime()负责格式剩余时间.再用定时器每秒执行1下.注意: 这个程序中, 老师写的formattime()函数不够精确, 请同学们自己修正完善.模板开发ecshop的模板用的精简型的smarty模板,语法和smarty绝大部分通用.而ec的程序,又是面向过程,调用函数,赋值给smarty, 然后展示到模板.因此模板的开发比较直观.1:我们把模板的目录放置ecshop/themes/下面2: 后台管理,查看模板,并没有出现我们新增的模板供选择.这是因为,ec识别模板,要靠css和缩略图做标识,来识别ec要求在模板的目录下,直接放置style.css, 且首段的注释理解为模板的说明信息.如:/*Template Name: ECSHOP DefaultTemplate URI: /Description: 默认升级版.Version: 2.7.2Author: ECSHOP TeamAuthor URI: /Logo filename: logo.gifTemplate Type: type_0*/3: 完成第2步后,可以看到模板,但是模板没有缩略图.ec的模板缩略图是自动去寻找ecshop/themes/images/screenshot.png,因此需要做好缩略图, 并且命名为screenshot.png,并放置在images目录下.4: 把css文件直接放在ecshop/themes/xxx皮肤下面这一步可能导致,css与图片目录的相对位置发生变化,有一些背景图会失效,注意,修正css中背景图的路径.5: 把模板的首页命名为index.dwt (因为ecshop寻找模板的后缀为dwt)至此,模板的建立就完成了.接下的工作,即是各个页面的标签的嵌套.(smarty的知识)首页开发index.dwt把导航处的Html标签单取出,放在library/page_header.lbi里lbi里的foreach from=xxx ,xxx部分是系统定义的,我们直接使用. $nav.opennew 代表是否新窗口打开$nav.active 代表当前导航块是否处于选中状态.左侧的导航栏新建library/category_tree.lbi栏目页面category.dwt1:面包屑导航搜索自带模板的category.dwt “ur_here”关键词跟踪到/library/ur_here.lbi ,找到$ur_here标签, 把ur_here标签放到适合位置2: 商品列表跟踪到goods_listl.l.bi商品标签的关键,在于下面这个标签我们的模板根据实际情况代码如下:并在后台设置, 栏目列表页显示9条商品后台-->商店设置-->显示设置但是出了一个奇怪的问题, 前台的goods_list循环10次,且最后一次得到空的数组, 导致多出一个空的商品出来.观察category.php , 下面这句话把商品数量补成偶数个,屏蔽掉即可.用户信息, 和其他标签不一样,前面有一个insert这个是----局部不缓存的一个标签, 这个标签的信息来自于”insert_member_info”函数的返回值.在smarty中的insert_xxx 1个原理.作业: 同学们利用insert标签, 调用购物车信息,并显示在模板上。