ecshop代码详解之init.php,ecshopinit.php
在includes/init.php目录下
因为工作原因,需要对ecshop二次开发,顺便记录一下对ecshop源代码的一些分析:
首先是init.php文件,这个文件在ecshop每个页面都会 调用到,习惯就先分析它:
<br /><?<span>php </span><span>/*</span><span>* * ECSHOP 前台公用文件 </span><span>*/</span> <span>//</span><span>防止非法调用 defined-判断常量是否已定义,如果没返回false</span> <span>if</span> (!<span>defined</span>('IN_ECS'<span>)) { </span><span>die</span>('Hacking attempt');<span>//</span><span>die-直接终止程序并输出</span> <span>} </span><span>//</span><span>报告所有错误</span> <span>error_reporting</span>(<span>E_ALL</span><span>); </span><span>//</span><span>如果获取不到本文件</span> <span>if</span> (<span>__FILE__</span> == ''<span>) { </span><span>die</span>('Fatal error code: 0'<span>); } </span><span>/*</span><span>预定义常量 __LINE__ 文件中的当前行号。 __FILE__ 文件的完整路径和文件名。 __FUNCTION__ 函数名称(这是 PHP 4.3.0 新加的)。 __CLASS__ 类的名称(这是 PHP 4.3.0 新加的)。 __METHOD__ 类的方法名(这是 PHP 5.0.0 新加的)。 </span><span>*/</span> <span>/*</span><span> 取得当前商城所在的根目录 </span><span>*/</span> <span>define</span>('ROOT_PATH', <span>str_replace</span>('includes/init.php', '', <span>str_replace</span>('\\', '/', <span>__FILE__</span><span>))); </span><span>//</span><span>检测是否已安装</span> <span>if</span> (!<span>file_exists</span>(ROOT_PATH . 'data/install.lock') && !<span>file_exists</span>(ROOT_PATH . 'includes/install.lock'<span>) </span>&& !<span>defined</span>('NO_CHECK_INSTALL'<span>)) { </span><span>header</span>("Location: ./install/index.php\n"<span>); </span><span>exit</span><span>; } </span><span>/*</span><span> 初始化设置 </span><span>*/</span><span> @</span><span>ini_set</span>('memory_limit', '64M');<span>//</span><span>ini_set设置php.ini中的设置,memory_limit设定一个脚本所能够申请到的最大内存字节数</span> @<span>ini_set</span>('session.cache_expire', 180);<span>//</span><span>指定会话页面在客户端cache中的有效期限(分钟),单位为分钟。</span> @<span>ini_set</span>('session.use_trans_sid', 0);<span>//</span><span>关闭自动把session id嵌入到web的URL中</span> @<span>ini_set</span>('session.use_cookies', 1);<span>//</span><span>允许使用cookie在客户端保存会话ID</span> @<span>ini_set</span>('session.auto_start', 0);<span>//</span><span>在客户访问任何页面时都自动初始化会话,0-禁止</span> @<span>ini_set</span>('display_errors', 1);<span>//</span><span>是否显示错误</span> <span>if</span> (DIRECTORY_SEPARATOR == '\\')<span>//</span><span>如果装在windows上(DIRECTORY_SEPARATOR路径分隔符,linux上就是’/’ windows上是’\’)</span> <span>{ @</span><span>ini_set</span>('include_path', '.;' . ROOT_PATH);<span>//</span><span>include目录为当前目录和网站根目录,windows下用';'分隔</span> <span>} </span><span>else</span><span> { @</span><span>ini_set</span>('include_path', '.:' . ROOT_PATH);<span>//</span><span>include目录为当前目录和网站根目录,linux下用':'分隔</span> <span>} </span><span>require</span>(ROOT_PATH . 'data/config.php');<span>//</span><span>包含配置文件(数据库相关)</span> <span>if</span> (<span>defined</span>('DEBUG_MODE') == <span>false</span>)<span>//</span><span>如果常量DEBUG_MODE没有定义则定义为0,DEBUG_MODE用于设置ecshp的使用模式</span> <span>{ </span><span>define</span>('DEBUG_MODE', 0<span>); } </span><span>//</span><span>设定用于所有日期时间函数的默认时区</span> <span>if</span> (<span>PHP_VERSION</span> >= '5.1' && !<span>empty</span>(<span>$timezone</span><span>)) { date_default_timezone_set(</span><span>$timezone</span>);<span>//</span><span>date_default_timezone_set 设置时区</span> <span>} </span><span>//</span><span>$_SERVER['PHP_SELF']返回当前页面,获取$_SERVER['PHP_SELF']最好用htmlspecialchars过滤一下,存在XSS漏洞</span> <span>$php_self</span> = <span>isset</span>(<span>$_SERVER</span>['PHP_SELF']) ? <span>$_SERVER</span>['PHP_SELF'] : <span>$_SERVER</span>['SCRIPT_NAME'<span>]; </span><span>if</span> ('/' == <span>substr</span>(<span>$php_self</span>, -1))<span>//</span><span>如果是"/"结尾,则加上index.php</span> <span>{ </span><span>$php_self</span> .= 'index.php'<span>; } </span><span>define</span>('PHP_SELF', <span>$php_self</span>);<span>//</span><span>放入常量</span> <span>require</span>(ROOT_PATH . 'includes/inc_constant.php');<span>//</span><span>包含预定义常量文件</span> <span>require</span>(ROOT_PATH . 'includes/cls_ecshop.php');<span>//</span><span>基础类 文件</span> <span>require</span>(ROOT_PATH . 'includes/cls_error.php');<span>//</span><span>错误类 文件</span> <span>require</span>(ROOT_PATH . 'includes/lib_time.php');<span>//</span><span>时间函数</span> <span>require</span>(ROOT_PATH . 'includes/lib_base.php');<span>//</span><span>基础函数库</span> <span>require</span>(ROOT_PATH . 'includes/lib_common.php');<span>//</span><span>基础函数库</span> <span>require</span>(ROOT_PATH . 'includes/lib_main.php');<span>//</span><span>公用函数库</span> <span>require</span>(ROOT_PATH . 'includes/lib_insert.php');<span>//</span><span>动态内容函数库</span> <span>require</span>(ROOT_PATH . 'includes/lib_goods.php');<span>//</span><span>商品相关函数库</span> <span>require</span>(ROOT_PATH . 'includes/lib_article.php');<span>//</span><span>文章及文章分类相关函数库</span> <span>/*</span><span> 对用户传入的变量进行转义操作。</span><span>*/</span> <span>if</span> (!<span>get_magic_quotes_gpc</span><span>()) { </span><span>if</span> (!<span>empty</span>(<span>$_GET</span><span>)) { </span><span>$_GET</span> = addslashes_deep(<span>$_GET</span><span>); } </span><span>if</span> (!<span>empty</span>(<span>$_POST</span><span>)) { </span><span>$_POST</span> = addslashes_deep(<span>$_POST</span><span>); } </span><span>$_COOKIE</span> = addslashes_deep(<span>$_COOKIE</span><span>); </span><span>$_REQUEST</span> = addslashes_deep(<span>$_REQUEST</span><span>); } </span><span>/*</span><span> 创建 ECSHOP 对象 </span><span>*/</span> <span>$ecs</span> = <span>new</span> ECS(<span>$db_name</span>, <span>$prefix</span>);<span>//</span><span>参数说明:数据库名 表前缀</span> <span>define</span>('DATA_DIR', <span>$ecs</span>->data_dir());<span>//</span><span>数据目录</span> <span>define</span>('IMAGE_DIR', <span>$ecs</span>->image_dir());<span>//</span><span>图片目录</span> <span>/*</span><span> 初始化数据库类 </span><span>*/</span> <span>require</span>(ROOT_PATH . 'includes/cls_mysql.php'<span>); </span><span>$db</span> = <span>new</span> cls_mysql(<span>$db_host</span>, <span>$db_user</span>, <span>$db_pass</span>, <span>$db_name</span><span>); </span><span>/*</span><span> 设置不允许进行缓存的表 </span><span>*/</span> <span>$db</span>->set_disable_cache_tables(<span>array</span>(<span>$ecs</span>->table('sessions'), <span>$ecs</span>->table('sessions_data'), <span>$ecs</span>->table('cart'<span>))); </span><span>$db_host</span> = <span>$db_user</span> = <span>$db_pass</span> = <span>$db_name</span> = <span>NULL</span><span>; </span><span>/*</span><span> 创建错误处理对象 </span><span>*/</span> <span>$err</span> = <span>new</span> ecs_error('message.dwt'<span>); </span><span>/*</span><span> 载入系统参数 </span><span>*/</span> <span>$_CFG</span> = load_config(); <span>//</span><span>载入配置信息函数在lib_common.php</span> <span>/*</span><span> 载入语言文件 </span><span>*/</span> <span>require</span>(ROOT_PATH . 'languages/' . <span>$_CFG</span>['lang'] . '/common.php'<span>); </span><span>if</span> (<span>$_CFG</span>['shop_closed'] == 1<span>) { </span><span>/*</span><span> 商店关闭了,输出关闭的消息 </span><span>*/</span> <span>header</span>('Content-type: text/html; charset='.<span>EC_CHARSET); </span><span>die</span>('<div>$_LANG</span>['shop_closed'] . '</p><p>' . <span>$_CFG</span>['close_comment'] . '</p></div>'<span>); } </span><span>//</span><span>判断是否为搜索引擎蜘蛛 函数在lib_main.php</span> <span>if</span><span> (is_spider()) { </span><span>/*</span><span> 如果是蜘蛛的访问,那么默认为访客方式,并且不记录到日志中 </span><span>*/</span> <span>if</span> (!<span>defined</span>('INIT_NO_USERS'<span>)) { </span><span>define</span>('INIT_NO_USERS', <span>true</span><span>); </span><span>/*</span><span> 整合UC后,如果是蜘蛛访问,初始化UC需要的常量 </span><span>*/</span> <span>if</span>(<span>$_CFG</span>['integrate_code'] == 'ucenter'<span>) { </span><span>$user</span> = &<span> init_users(); } } </span><span>$_SESSION</span> = <span>array</span><span>(); </span><span>$_SESSION</span>['user_id'] = 0<span>; </span><span>$_SESSION</span>['user_name'] = ''<span>; </span><span>$_SESSION</span>['email'] = ''<span>; </span><span>$_SESSION</span>['user_rank'] = 0<span>; </span><span>$_SESSION</span>['discount'] = 1.00<span>; } </span><span>//</span><span>非搜索引擎蜘蛛,记录session</span> <span>if</span> (!<span>defined</span>('INIT_NO_USERS'<span>)) { </span><span>/*</span><span> 初始化session </span><span>*/</span> <span>include</span>(ROOT_PATH . 'includes/cls_session.php'<span>); </span><span>$sess</span> = <span>new</span> cls_session(<span>$db</span>, <span>$ecs</span>->table('sessions'), <span>$ecs</span>->table('sessions_data'<span>)); </span><span>define</span>('SESS_ID', <span>$sess</span>-><span>get_session_id()); } </span><span>//</span><span>如果使用Smarty</span> <span>if</span> (!<span>defined</span>('INIT_NO_SMARTY'<span>)) { </span><span>header</span>('Cache-control: private'<span>); </span><span>header</span>('Content-type: text/html; charset='.<span>EC_CHARSET); </span><span>/*</span><span> 创建 Smarty 对象。</span><span>*/</span> <span>require</span>(ROOT_PATH . 'includes/cls_template.php'<span>); </span><span>$smarty</span> = <span>new</span><span> cls_template; </span><span>$smarty</span>->cache_lifetime = <span>$_CFG</span>['cache_time'];<span>//</span><span>缓存时间</span> <span>$smarty</span>->template_dir = ROOT_PATH . 'themes/' . <span>$_CFG</span>['template'];<span>//</span><span>模板所在</span> <span>$smarty</span>->cache_dir = ROOT_PATH . 'temp/caches';<span>//</span><span>缓存所在</span> <span>$smarty</span>->compile_dir = ROOT_PATH . 'temp/compiled';<span>//</span><span>模板编译后的文件所在</span> <span>if</span> ((DEBUG_MODE & 2) == 2)<span>//</span><span>如果常量DEBUG_MODE值为 2、3、6、7.时</span> <span> { </span><span>$smarty</span>->direct_output = <span>true</span>; <span>//</span><span>不使用缓存直接输出</span> <span>$smarty</span>->force_compile = <span>true</span>; <span>//</span><span>强行编译</span> <span> } </span><span>else</span><span> { </span><span>$smarty</span>->direct_output = <span>false</span><span>; </span><span>$smarty</span>->force_compile = <span>false</span><span>; } </span><span>$smarty</span>->assign('lang', <span>$_LANG</span><span>); </span><span>$smarty</span>->assign('ecs_charset',<span> EC_CHARSET); </span><span>if</span> (!<span>empty</span>(<span>$_CFG</span>['stylename']))<span>//</span><span>如果自己定义样式文件就用自己的</span> <span> { </span><span>$smarty</span>->assign('ecs_css_path', 'themes/' . <span>$_CFG</span>['template'] . '/style_' . <span>$_CFG</span>['stylename'] . '.css'<span>); } </span><span>else</span><span> { </span><span>$smarty</span>->assign('ecs_css_path', 'themes/' . <span>$_CFG</span>['template'] . '/style.css'<span>); } } </span><span>//</span><span>非搜索引擎爬虫,记录用户信息</span> <span>if</span> (!<span>defined</span>('INIT_NO_USERS'<span>)) { </span><span>/*</span><span> 会员信息 初始化会员数据 lib_common.php </span><span>*/</span> <span>$user</span> =&<span> init_users(); </span><span>if</span> (!<span>isset</span>(<span>$_SESSION</span>['user_id'<span>])) { </span><span>/*</span><span> 获取投放站点的名称 </span><span>*/</span> <span>$site_name</span> = <span>isset</span>(<span>$_GET</span>['from']) ? <span>$_GET</span>['from'] : <span>addslashes</span>(<span>$_LANG</span>['self_site'<span>]); </span><span>$from_ad</span> = !<span>empty</span>(<span>$_GET</span>['ad_id']) ? <span>intval</span>(<span>$_GET</span>['ad_id']) : 0<span>; </span><span>$_SESSION</span>['from_ad'] = <span>$from_ad</span>; <span>//</span><span> 用户点击的广告ID</span> <span>$_SESSION</span>['referer'] = <span>stripslashes</span>(<span>$site_name</span>); <span>//</span><span> 用户来源</span> <span>unset</span>(<span>$site_name</span><span>); </span><span>if</span> (!<span>defined</span>('INGORE_VISIT_STATS'<span>)) { visit_stats(); } } </span><span>if</span> (<span>empty</span>(<span>$_SESSION</span>['user_id'<span>])) { </span><span>if</span> (<span>$user</span>-><span>get_cookie()) { </span><span>/*</span><span> 如果会员已经登录并且还没有获得会员的帐户余额、积分以及优惠券 </span><span>*/</span> <span>if</span> (<span>$_SESSION</span>['user_id'] > 0<span>) { update_user_info(); } } </span><span>else</span><span> { </span><span>$_SESSION</span>['user_id'] = 0<span>; </span><span>$_SESSION</span>['user_name'] = ''<span>; </span><span>$_SESSION</span>['email'] = ''<span>; </span><span>$_SESSION</span>['user_rank'] = 0<span>; </span><span>$_SESSION</span>['discount'] = 1.00<span>; </span><span>if</span> (!<span>isset</span>(<span>$_SESSION</span>['login_fail'<span>])) { </span><span>$_SESSION</span>['login_fail'] = 0<span>; } } } </span><span>/*</span><span> 设置推荐会员 </span><span>*/</span> <span>if</span> (<span>isset</span>(<span>$_GET</span>['u'<span>])) { set_affiliate(); } </span><span>if</span> (<span>isset</span>(<span>$smarty</span><span>)) { </span><span>$smarty</span>->assign('ecs_session', <span>$_SESSION</span><span>); } } </span><span>if</span> ((DEBUG_MODE & 1) == 1)<span>//</span><span>如果常量DEBUG_MODE值为 1、3、5、7.时</span> <span>{ </span><span>error_reporting</span>(<span>E_ALL</span>);<span>//</span><span>报告全部错误</span> <span>} </span><span>else</span><span> { </span><span>error_reporting</span>(<span>E_ALL</span> ^ <span>E_NOTICE</span>); <span>//</span><span>报告除E_NOTICE以外的所有错误</span> <span>} </span><span>if</span> ((DEBUG_MODE & 4) == 4)<span>//</span><span>如果常量DEBUG_MODE值为 4、5、6、7.时,调试程序</span> <span>{ </span><span>include</span>(ROOT_PATH . 'includes/lib.debug.php');<span>// </span><span>} </span><span>/*</span><span> 判断是否支持 Gzip 模式 如果使用SMARTY同时设置了网页压缩,则启用压缩 </span><span>*/</span> <span>if</span> (!<span>defined</span>('INIT_NO_SMARTY') &&<span> gzip_enabled()) { </span><span>ob_start</span>('ob_gzhandler');<span>//</span><span>压缩后放入缓冲区</span> <span>} </span><span>else</span><span> { </span><span>ob_start</span>();<span>//</span><span>打开缓冲区,把下面要显示的内容先缓在服务器</span> <span>} </span><span>/*</span><span> ob_start相关函数了解: 1、Flush:刷新缓冲区的内容,输出。 函数格式:flush() 说明:这个函数经常使用,效率很高。 2、ob_start :打开输出缓冲区 函数格式:void ob_start(void) 说明:当缓冲区激活时,所有来自PHP程序的非文件头信息均不会发送,而是保存在内部缓冲区。为了输出缓冲区的内容,可以使用ob_end_flush()或flush()输出缓冲区的内容。 、ob_get_contents :返回内部缓冲区的内容。 使用方法:string ob_get_contents(void) 说明:这个函数会返回当前缓冲区中的内容,如果输出缓冲区没有激活,则返回 FALSE 。 4、ob_get_length:返回内部缓冲区的长度。 使用方法:int ob_get_length(void) 说明:这个函数会返回当前缓冲区中的长度;和ob_get_contents一样,如果输出缓冲区没有激活。则返回 FALSE。 5、ob_end_flush :发送内部缓冲区的内容到浏览器,并且关闭输出缓冲区。 使用方法:void ob_end_flush(void) 说明:这个函数发送输出缓冲区的内容(如果有的话)。 6、ob_end_clean:删除内部缓冲区的内容,并且关闭内部缓冲区 使用方法:void ob_end_clean(void) 说明:这个函数不会输出内部缓冲区的内容而是把它删除! 7、ob_implicit_flush:打开或关闭绝对刷新 使用方法:void ob_implicit_flush ([int flag]) 说明:使用过Perl的人都知道$|=x的意义,这个字符串可以打开/关闭缓冲区,而ob_implicit_flush函数也和那个一样,默认为关闭缓冲区,打开绝对输出后,每个脚本输出都直接发送到浏览器,不再需要调用 flush() </span><span>*/</span> ?>

ecshop是“B2C”构架;ecshop是一款B2C独立网店系统,适合企业及个人快速构建个性化网上商店;该系统是基于PHP语言及MYSQL数据库构架开发的跨平台开源程序。

ecshop文章排序方法:1、按照发布时间排序,可以通过修改文章的发布时间来控制文章在列表中的排列顺序;2、按照点击量排序,可以通过安装“文章点击排行榜”插件来实现该排序功能,该插件可以统计文章的点击量;3、按照评论数排序,可以通过安装“文章评论排行榜”插件来实现该排序功能,该插件可以统计文章的评论数;4、按照相关度排序,可以通过安装“搜索排名”插件来实现该排序功能。

特点:1、开源系统,具有灵活性、可定制性和高拓展性;2、支持自主二次开发;3、丰富的模版、插件;4、行业适应能力强;5、避免被软件商束缚;6、更强的可靠性、稳定性;7、移动H5框架升级,基于VUE全面换代,更加灵活开放;8、多级返佣功能,支持二维码、海报等推广方式,无限裂变发展分销商;8、管理端视觉交互全面焕新,UI简洁美观,操作体验升级;9、支持PHP7.2,性能提升一倍。

ECShop是一款B2C独立网店系统,是基于PHP语言及MYSQL数据库构架开发的跨平台开源程序,适合企业及个人快速构建个性化网上商店。ecshop商城系统的特点:1、支持自主二次开发;2、丰富的模版、插件;3、行业适应能力强;4、避免被软件商束缚;5、更强的可靠性、稳定性。

ecshop是B2C模式。ECShop是一款B2C独立网店系统,适合企业及个人快速构建个性化网上商店。B2C是指电子商务的一种模式,也是直接面向消费者销售产品和服务商业的零售模式;B2C电子商务的付款方式是货到付款与网上支付相结合,而大多数企业的配送选择物流外包方式以节约运营成本。

Ecshop商品管理进阶:学习如何增加字段,需要具体代码示例在使用Ecshop进行商品管理时,经常会遇到需要增加一些自定义字段的情况,以满足特定的需求。通过增加字段,可以实现更加精确的商品管理和更好的用户体验。本文将介绍如何在Ecshop中增加字段,并提供具体的代码示例。首先,我们需要明确增加字段的需求。例如,我们需要在商品详情页增加一个“生产日期”字段,以

去掉ecshop底部版权的方法:1、修改模板文件,具体位置为:themes/your_theme目录,在该目录下找到footer.html文件,用文本编辑器打开,找到包含版权信息的代码段,将其删除或注释掉。保存文件并关闭即可;2、使用插件,登录后台,点击插件管理,搜索底部版权等相关关键词,选择一个适合的插件安装并启用它即可;3、购买主题,在ECShop的官方网站购买等等。

ecshop取消配送方式的方法:1、找到并打开“flow.dwt”文件,然后删除“<!--{if $total.real_goods_count neq 0}-->...<!-- {/if} -->”代码;2、将”js/shopping_flow.js“中的”checkOrderForm(frm)“改为”if (document.getElementById(...)“即可。


핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

SublimeText3 Linux 새 버전
SublimeText3 Linux 최신 버전

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

드림위버 CS6
시각적 웹 개발 도구
