ecshop开发详解功能了解介绍安装后台管理程序分析重要表执行流程底层库js库分析练手功能去除标题[PHP]去除版权标志[js]最新评论[PHP+模板]二次开发自定义title[php]email登陆[php]多商品倒计时[js]模板开发1.1ecshop介绍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_commonecshop各页面都用到的函数,如拼接sql,获取栏目列表,构造面包屑导航.lib_main.phpecshop常用的函数,主要是用户和模板赋值函数多一些.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.phpRequire(Init.php)........业务逻辑functionxxx();functionyyy();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是商品操作最频繁函数.小试牛刀:以商城标题中,去除poweredbyEcshop为例打开任意一个页面,看其模板,以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.jsajax操作库Ajax.call()//发送ajax查询showdiv.js漂浮层的库showdiv()显示漂浮层hidendiv()隐藏漂浮层lefttime.js显示剩余时间的库便于做抢购时用.三练手功能3.1去除标题中的”poweredByEcshop”大思路:库函数--被调用---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字段.altertableecs_goodsaddseotitlevarchar(60)notnulldefault''aftergoods_name;2:在后台修改商品发布时的表单项,增加自定义title表单项./admin/templates/goods_info.htm40行左右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的程序,又是面向过程,调用函数,赋值