Ecshop文件结构

EcShop开发手册_使用教程EcShop开发手册_php_02
ecshop文件架构说明 

ECShop 结构图及各文件相应功能介绍 
ECShop upload 的目录 
┣ activity.php 活动列表 
┣ affiche.php 广告处理文件 
┣ affiliate.php 生成商品列表 
┣ article.php 文章内容 
┣ article_cat.php文章分类 
┣ auction.php 拍卖前台文件 
┣ brand.php 品牌列表 
┣ captcha.php 生成验证码 
┣ catalog.php 列出所以分类及品牌 
┣ category.php 商品分类 
┣ comment.php 提交用户评论 
┣ compare.php 商品比较程序 
┣ cycle_image.php 轮播图片程序 
┣ feed.php RSS Feed 生成程序 
┣ flow.php 购物流程 
┣ gallery.php 商品相册 
┣ goods.php 商品详情 
┣ goods_script.php 生成商品列表 
┣ group_buy.php 团购商品前台文件 
┣ index.php 首页文件 
┣ myship.php 支付配送DEMO 
┣ pick_out.php 选购中心 
┣ receive.php 处理收回确认的页面 
┣ region.php 地区切换程序 
┣ respond.php 支付响应页面 
┣ robots.txt 
┣ search.php 搜索程序 
┣ sitemaps.php google sitemap 文件 
┣ snatch.php 夺宝奇兵前台页面 
┣ tag_cloud.php 标签云 
┣ topic.php 专题前台 
┣ user.php 会员中心 
┣ vote.php 调查程序 
┣ wholesale.php 批发前台文件 
┣ admin文件夹 
┃ ┣ account_log.php 管理中心帐户变动记录 
┃ ┣ admin_logs.php 记录管理员操作日志 
┃ ┣ ads.php 广告管理程序 
┃ ┣ adsense.php 站外JS投放的统计程序 
┃ ┣ ad_position.php广告位置管理程序 
┃ ┣ affiliate.php 程序说明 
┃ ┣ affiliate_ck.php 程序说明 
┃ ┣ agency.php 管理中心办事处管理 
┃ ┣ area_manage.php 地区列表管理文件 
┃ ┣ article.php 管理中心文章处理程序文件 
┃ ┣ articlecat.php 文章分类管理程序 
┃ ┣ article_auto.php 
┃ ┣ attention_list.php 
┃ ┣ attribute.php 属性规格管理 
┃ ┣ auction.php 管理中心拍卖活动管理 
┃ ┣ bonus.php 红包类型的处理 
┃ ┣ brand.php管理中心品牌管理 
┃ ┣ captcha_manage.php 
┃ ┣ card.php 贺卡管理程序 
┃ ┣ category.php 商品分类管理程序 
┃ ┣ check_file_priv.php 系统文件检测 
┃ ┣ comment_manage.php 用户评论管理程序 
┃ ┣ convert.php 转换程序 
┃ ┣ cron.php 计划任务 
┃ ┣ database.php 数据库管理 
┃ ┣ ebao_commend.php 易宝推荐 
┃ ┣ edit_languages.php 管理中心语言项编辑(前台语言项) 
┃ ┣ email_list.php 邮件列表管理 
┃ ┣ favourable.php 管理中心优惠活动管理 
┃ ┣ flashplay.php 
┃ ┣ flow_stats.php 综合流量统计 
┃ ┣ friend_link.php 友情链接管理 
┃ ┣ gen_goods_script.php 生成显示商品的js代码 
┃ ┣ get_password.php 找回管理员密码 
┃ ┣ goods.php 商品管理程序 
┃ ┣ goods_auto.php 
┃ ┣ goods_batch.php 商品批量上传、修改 
┃ ┣ goods_booking.php 缺货处理管理程序 
┃ ┣ goods_export.php 
┃ ┣ goods_type.php 商品类型管理程序 
┃ ┣ group_buy.php 管理中心团购商品管理 
┃ ┣ guest_stats.php 客户统计 
┃ ┣ index.php 控制台首页 
┃ ┣ integrate.php 第三方程序会员数据整合插件管理程序 
┃ ┣ magazine_list.php 
┃ ┣ mail_template.php 管理中心模版管理程序 
┃ ┣ message.php 管理中心管理员留言程序 
┃ ┣ navigator.php 

┃ ┣ order.php 订单管理 
┃ ┣ order_stats.php 订单统计 
┃ ┣ pack.php 包装管理程序 
┃ ┣ payment.php 支付方式管理程序 
┃ ┣ picture_batch.php 图片批量处理程序 
┃ ┣ privilege.php 管理员信息以及权限管理程序 
┃ ┣ sale_general.php 销售概况 
┃ ┣ sale_list.php 销售明细列表程序 
┃ ┣ sale_order.php 商品销售排行 
┃ ┣ searchengine_stats.php 搜索引擎关键字统计 
┃ ┣ search_log.php 
┃ ┣ shipping.php 配送方式管理程序 
┃ ┣ shipping_area.php 配送区域管理程序 
┃ ┣ shophelp.php 帮助信息管理程序 
┃ ┣ shopinfo.php 网店信息管理页面 
┃ ┣ shop_config.php 管理中心商店设置 
┃ ┣ sitemap.php 站点地图生成程序 
┃ ┣ sms.php 短信模块 之 控制器 
┃ ┣ snatch.php 夺宝奇兵管理程序 
┃ ┣ sql.php sql管理程序 
┃ ┣ tag_manage.php 后台标签管理 
┃ ┣ template.php 管理中心模版管理程序 
┃ ┣ topic.php 专题管理 
┃ ┣ users.php 会员管理程序 
┃ ┣ users_order.php 会员排行统计程序 
┃ ┣ user_account.php 会员帐目管理(包括预付款,余额) 
┃ ┣ user_msg.php 客户留言 
┃ ┣ user_rank.php 会员等级管理程序 
┃ ┣ view_sendlist.php 
┃ ┣ virtual_card.php 虚拟卡商品管理程序 
┃ ┣ visit_sold.php 访问购买比例 
┃ ┣ vote.php 调查管理程序 
┃ ┣ wholesale.php 管理中心批发管理 
┃ ┣ help 的目录 后台操作帮助文件 
┃ ┣ images 的目录 
┃ ┣ includes 的目录 
┃ ┃ ┣ cls_exchange.php 后台自动操作数据库的类文件 
┃ ┃ ┣ cls_google_sitemap.php Google sitemap 类 
┃ ┃ ┣ cls_phpzip.php ZIP 处理类 
┃ ┃ ┣ cls_sql_dump.php 数据库导出类 
┃ ┃ ┣ inc_menu.php 管理中心菜单数组 
┃ ┃ ┣ init.php 管理中心公用文件 
┃ ┃ ┣ lib_goods.php 管理中心商品相关函数 
┃ ┃ ┣ lib_main.php 管理中心公用函数库 
┃ ┃ ┗ lib_template.php 管理中心模版相关公用函数库 
┃ ┣ styles 的目录 
┃ ┣ templates 的目录 
┃ ┗ js 的目录 
┃ ┣ colorselector.js 
┃ ┣ common.js 
┃ ┣ listtable.js 
┃ ┣ md5.js 
┃ ┣ selectzone.js 
┃ ┣ tab.js 
┃ ┣ todolist.js 
┃ ┣ topbar.js 
┃ ┗ validator.js 表单验证类 
┣ api 的目录 
┃ ┣ checkorder.php 检查订单 API 
┃ ┣ cron.php 
┃ ┗ init.php API 公用初始化文件 
┣ cert 的目录 
┣ data 的目录 
┃ ┣ ffiliate.html 
┃ ┣ goods_script.html 
┃ ┣ order_print.html 
┃ ┣ afficheimg 的目录 
┃ ┣ brandlogo 的目录 
┃ ┣ captcha 的目录 验证码背景图片存放位置 
┃ ┣ cardimg 的目录 
┃ ┣ feedbackimg 的目录 
┃ ┣ images 的目录 
┃ ┣ packimg 的目录 
┃ ┗ sqldata 的目录 
┣ images 的目录 
┃ ┗ upload 的目录 
┃ ┣ File 文件上传存放处 
┃ ┣ Flash flash上传存放处 
┃ ┣ Image 图片上传存放处 
┃ ┗ Media 视频上传存放处 
┣ includes 的目录 
┃ ┣ cls_captcha.php 验证码图片类 
┃ ┣ cls_ecshop.php 基础类 
┃ ┣ cls_error.php 用户级错误处理类 
┃ ┣ cls_iconv.php 字符集转换类 
┃ ┣ cls_image.php 后台对上传文件的处理类(实现图片上传,图片缩小, 增加水印) 
┃ ┣ cls_json.php JSON 类 
┃ ┣ cls_mysql.php MYSQL 公用类库 
┃ ┣ cls_rss.php RSS 类 
┃ ┣ cls_session.php SESSION 公用类库 
┃ ┣ cls_sms.php 短信模块 之 模型(类库) 
┃ ┣ cls_smtp.php SMTP 邮件类 
┃ ┣ cls_sql_executor.php SQL语句执行类。 
┃ ┣ cls_template.php 模版类 
┃ ┣ cls_transport.php 服务器之间数据传输器 
┃ ┣ inc_constant.php 常量 
┃ ┣ init.php 前台公用文件 
┃ ┣ lib.debug.php 
┃ ┣ lib_article.php 文章及文章分类相关函数库 
┃ ┣ lib_clips.php ECSHOP 用户相关函数库 
┃ ┣ lib_code.php 加密解密类 
┃ ┣ lib_common.php 公用函数库 
┃ ┣ lib_goods.php 商品相关函数库 
┃ ┣ lib_insert.php 动态内容函数库 
┃ ┣ lib_main.php 前台公用函数库 
┃ ┣ lib_order.php 购物流程函数库 
┃ ┣ lib_passport.php 用户帐号相关函数库 
┃ ┣ lib_payment.php 支付接口函数库 
┃ ┣ lib_time.php 时间函数 
┃ ┣ lib_transaction.php ECSHOP 用户交易相关函数库 
┃ ┣ codetable 的目录 
┃ ┃ ┣ big5-gb.table 
┃ ┃ ┣ big5_utf8.php 
┃ ┃ ┣ gb-big5.table 
┃ ┃ ┣ gb_utf8.php 
┃ ┃ ┗ ipdata.dat 
┃ ┣ fckeditor 的目录 fckeditor编辑器目录 
┃ ┗ modules 的目录 
┃ ┣ convert 的目录 
┃ ┃ ┣ shopex46.php vshopex4.6转换程序插件 
┃ ┃ ┗ shopex47.php shopex4.7转换程序插件 
┃ ┣ cron 的目录 
┃ ┃ ┣ auto_manage.php 自动上下架管理 
┃ ┃ ┗ ipdel.php 定期删除 
┃ ┣ integrates 的目录 
┃ ┃ ┣ bmforum.php 会员数据处理类 
┃ ┃ ┣ discuz.php 
┃ ┃ ┣ discuz55.php 
┃ ┃ ┣ dvbbs.php 
┃ ┃ ┣ ecshop.php 
┃ ┃ ┣ integrate.php 
┃ ┃ ┣ ipb.php 
┃ ┃ ┣ molyx.php 
┃ ┃ ┣ phpbb.php 
┃ ┃ ┣ phpwind.php 
┃ ┃ ┣ phpwind5.php 
┃ ┃ ┗ vbb.php 
┃ ┣ payment 的目录 
┃ ┃ ┣ alipay.php 支付宝插件 
┃ ┃ ┣ balance.php 余额支付插件 
┃ ┃ ┣ bank.php 银行汇款(转帐)插件 
┃ ┃ ┣ cappay.php 首信易支付插件 
┃ ┃ ┣ chinabank.php 网银在线插件 
┃ ┃ ┣ cncard.php 云网支付插件 
┃ ┃ ┣ cod.php 货到付款插件 
┃ ┃ ┣ ctopay.php Ctopay 支付插件 
┃ ┃ ┣ express.php express支付系统插件 
┃ ┃ ┣ ips.php ips支付系统插件 
┃ ┃ ┣ kuaiqian.php 快钱插件 
┃ ┃ ┣ nps.php NPS支付插件 
┃ ┃ ┣ pay800.php 800pay 支付宝插件 
┃ ┃ ┣ paypal.php 贝宝插件 
┃ ┃ ┣ paypalcn.php 贝宝中国插件 
┃ ┃ ┣ post.php 邮局汇款插件 
┃ ┃ ┣ tenpay.php 财付通插件 
┃ ┃ ┣ udpay.php 网汇通插件 
┃ ┃ ┣ xpay.php 易付通插件 
┃ ┃ ┗ yeepay.php YeePay易宝插件 
┃ ┗ shipping 的目录 
┃ ┣ cac.php 上门取货插件 
┃ ┣ city_express.php 城际快递插件 
┃ ┣ ems.php EMS插件 
┃ ┣ flat.php 邮政包裹插件 
┃ ┣ fpd.php 到付运费插件 
┃ ┣ post_express.php 邮政包裹插件 
┃ ┣ post_mail.php 邮局平邮插件 
┃ ┣ presswork.php 挂号印刷品插件 
┃ ┣ sf_express.php 顺丰速运 配送方式插件 
┃ ┣ sto_express.php 申通快递 配送方式插件 
┃ ┣ yto.php 圆通速递插件 
┃ ┗ zto.php 中通速递插件 
┣ install 的目录 安装文件目录 
┣ js 的目录 
┃ ┣ auto_complete.js 
┃ ┣ calendar.php 
┃ ┣ common.js 
┃ ┣ compare.js 
┃ ┣ global.js 
┃ ┣ lefttime.js 
┃ ┣ myship.js 
┃ ┣ region.js 
┃ ┣ shopping_flow.js 
┃ ┣ transport.js 
┃ ┣ user.js 
┃ ┣ utils.js 
┃ ┗ calendar 的目录 
┣ languages 的目录 语言风格文件 
┃ ┣ zh_cn 的目录 
┃ ┃ ┣ 
┃ ┃ ┣ admin 的目录 
┃ ┃ ┣ convert 的目录 
┃ ┃ ┣ cron 的目录 
┃ ┃ ┣ payment 的目录 
┃ ┃ ┗ shipping 的目录 
┃ ┗ zh_tw 的目录 
┃ ┣ admin 的目录 
┃ ┣ convert 的目录 
┃ ┣ cron 的目录 
┃ ┣ payment 的目录 
┃ ┗ shipping 的目录 
┣ plugins 的目录 
┣ templates 的目录 
┃ ┣ backup 的目录 
┃ ┃ ┗ ibrary 的目录 
┃ ┣ caches 的目录 
┃ ┗ compiled 的目录 
┃ ┗ admin 的目录 

┣ themes 的目录 
┃ ┣ default 的目录 
┃ ┃ ┣ images 的目录 
┃ ┃ ┗ library 的目录 
┃ ┗ sport 的目录 
┣ wap 的目录 
┃ ┣ article.php 
┃ ┣ brands.php 
┃ ┣ buy.php 
┃ ┣ category.php 
┃ ┣ comment.php 
┃ ┣ goods.php 
┃ ┣ goods_list.php 
┃ ┣ index.php 
┃ ┣ user.php 
┃ ┣ includes 的目录 
┃ ┃ ┣ init.php 
┃ ┃ ┣ lib_main.php 
┃ ┗ templates 的目录 
┃ ┣ article.wml 
┃ ┣ article_list.wml 
┃ ┣ brands.wml 
┃ ┣ buy.wml 
┃ ┣ category.wml 
┃ ┣ comment.wml 
┃ ┣ goods.wml 
┃ ┣ goods_img.wml 
┃ ┣ goods_list.wml 
┃ ┣ index.wml 
┃ ┣ login.wml 
┃ ┣ order_list.wml 
┃ ┗ user.wml 
┗ widget 的目录 
┣ blog_sohu.php 
┣ blog_sohu.xhtml 
┗ images 的目录
View Code

ECShop的库项目功能

EcShop开发手册_使用教程EcShop开发手册_php_02
认识一下ECShop的库项目功能。

一、认识ECShop模板管理。
1.进入EC的后台,进入“模板管理”–>“设置模板”,如图

ecshop 增加“库项目”并且添加到模板中-》非可编辑区改为可编辑区 - pepsl - Pepsl的心情

 可以看到模板编辑页面在此我可以编辑不用页面的区块(库项目)是否显示、显示位置、甚至是显示商品的数量,如图
ecshop 增加“库项目”并且添加到模板中-》非可编辑区改为可编辑区 - pepsl - Pepsl的心情

在此对模板进行的修改都会显示在页面。(EC好强大呀~~^3^)

二、认识库项目
1.一个库项目眷涨个库文件。
打开ECShop的装置目录,进入 themes/default/library文件夹。你会看到许多以 “.lbi”(扩展名)结尾的文件。如图:

ecshop 增加“库项目”并且添加到模板中-》非可编辑区改为可编辑区 - pepsl - Pepsl的心情

ad_position?广告位吗?
category_tree?分类树吗?
recommend_new?新品推荐吗?

对了,这里放的眷涨页面上一块一块可以编辑的库项目的文件了。没错,如果你想加一个自己的显示库项目,就在此添加。

其实ECShop提供了编辑库文件编辑的地方,就在管理后台的“模板管理”–>“库文件管理”。

那么这些库项目是如何显示在页面上的呢?让我们以“新品推荐”为例。往下看。

2.库项目的页面添加。

进入themes/default文件夹,用编辑器(文本打开也可以)打开index.dwt文件。ctrl + f ,查找recommend_new

会找到一行代码:

对,眷涨这个“东西”把recommend_new.lbi里的内容加宰出来并成为页面的一部分的。

但是这只是他的开始部分,完整的应该是:

有开始,有结束。
而这个: 和这个
将页面划分为几个不同的大区域,这样后台就可以把那些库项目在这些区域里排序了。

所以如果你仅仅想添加一块自己的定义的库文件显示,那么仅需要在library里添加了自己的lbi文件后,用加到页面合适位置就可以了。如果想以后在后台的“模板管理”里编辑它,那还需要做下面的工作。
三、为后台添加可配置(设置)的库项目

1.在根目录/themes/default/library 中添加一个”test.lbi” 空文件。

然后开打 根目录/languages/zh_cn/admin/template.php(注意大宇用的语言包是简体中文,所以是zh_cn),找到 $_LANG['template_libs'],在此上面添加一行“$_LANG['template_libs']['test'] = ‘test测试’;”。

好了,现在你可以打开你的管理后台,进入“模板管理”–>”库文件管理” 然后点开库文件列表的下拉菜单找找看,是不是有一个 “test.lbi – test测试”。哈哈,我们给它加点内容吧:


我眷涨测试一下下

ps:第一行是设置编码用的。不明白没关系。继续…

2.打开 根目录/admin/includes/lib_template.php。

大致看一下这个文件,你会发现,原来后台的“设置模板”的初始配置都是在这里声明的。

在这里可以编辑 “可以设置内容的模板”,还可以编辑“每个模板允卷设置的库项目”。也眷涨说,这里声明了哪个模板里可以设置哪些库项目。相关数组都有注释,相当方便。

下面我们要把自己定义的“test.lbi”添加到到index.dwt里。

找到 “’index’ => array(” 这一行,一般在文件的120行。这里是个数组。往数组里添加一行:

“’/library/test.lbi’ => 4”,如图:

ecshop 增加“库项目”并且添加到模板中-》非可编辑区改为可编辑区 - pepsl - Pepsl的心情

我们给它设置的默认显示数量为4。

好了,现在点开 “模板管理” –> “设置模板”,可以在首页的编辑模板里看到我们的库项目了。如图

ecshop 增加“库项目”并且添加到模板中-》非可编辑区改为可编辑区 - pepsl - Pepsl的心情

但是,它的“显示”框式灰色的,不能选中,而且“区域”里也不能设置显示区域。

该怎么办呢?

这么办:

打开 根目录/themes/default/libs.xml

查找“”,在region标签里添加一行“test”,如图:

ecshop 增加“库项目”并且添加到模板中-》非可编辑区改为可编辑区 - pepsl - Pepsl的心情


保存后,再次进入“模板管理” –> “设置模板”,看看我们的test库项目是不是可以编辑了。呵呵

编辑好看看效果吧~~~如图

ecshop 增加“库项目”并且添加到模板中-》非可编辑区改为可编辑区 - pepsl - Pepsl的心情
View Code

 

ecshop 实现全站调用购物车功能

EcShop开发手册_使用教程EcShop开发手册_php_02
此功能是根据网友提供的方法,然后自己实际操作后发现了一些问题,更改了部分代码,完美了一些,下面的代码都贴出来了
今天给一朋友解决一个问题,需要在商城每个页面中的购物车处都显示购物车详情!其实,这个功能很简单,现在很多商城都在用(PS:虽然我的成都零食网现在还没有使用这个功能,并且以后暂时也没有打算使用这个功能,今天还是把这个写出来分享给大家。)。要实现并不是难事,就是在订单模板中加几个关于订单详情的显示嘛。如果需要在这里面加入删除或更新也只需要结合JS进行调用就行了。现在将我实现这个功能的方法公布如下:
可以从图中看出,我主要是添加了购物车详单和删除操作。其它都是一样的。以下是具体实现方法和简单原理:
要实现,首先要知道这一块是怎么出来的,做过ECSHOP二次开发的朋友对这个肯定不陌生了,模板文件在模板文件夹中的库文件夹的cart_info.lbi(找不到的同志可以搜索一下),原来这个模板里的东西很简单,就是添显示了“购物车里有X个商品,去结算”这类的信息。今天,我们要将其全部显示。
其次,我们要显示详情,肯定需要将这个详情使用弹出的方式来显示,不能直接显示,直接显示谁都会,那样有打开订单结算页有什么区别呢?占有太多地方了,这里就要用到css和js的一些基础知识了。
我的代码和注释如下:
<!--{if $goods11}-->
                <ul id="mcart-mz">   
                  {foreach from=$goods11 item=goods11 name=goods11}             
                   <li>
                    <div class="p-img fl">
                       <a href="{$goods11.url}" target="_blank">
                         <img src="{$goods11.goods_thumb}" alt="" height="50" width="50">
                       </a>
                    </div>      
                    <div class="p-name fl">
                       <a href="{$goods11.url}" target="_blank">{$goods11.short_name}</a>
                    </div>      
                     <div class="p-detail fr ar">          
                        <span class="p-price"><strong>{$goods11.goods_price}</strong>×{$goods11.goods_number}</span><br>          
                        <span class="hl-green">小计:{$goods11.subtotal}</span><br>           
                         <a class="del" href="javascript:" onClick="deleteCartGoods({$goods11.rec_id})">[删除]</a> 
                     </div>   
                  </li>
                  <hr class="hr1"/>
                 <!--{/foreach}-->
                </ul>
                <div class="smb ar">共<b>{$goods_number}</b>件商品 共计<strong>¥:{$order_amount}</strong><br><a href="flow.php">
<img src="themes/chengrenyongpin/images/car1_14.jpg" width="120" alt="去结算">
</a></div>  
             <!--{else}-->
                您的购物车暂无商品
            <!--{/if}--> 


以上代码仅供参考。如需要使用,需要结合以下CSS代码,请同步复制到相应目录文件或嵌入相关文件中
.car_ul {
    background: none repeat scroll 0 0 #FFFFFF;
    border: 1px solid #F5859D;
    display: none;
    float: left;
    margin-top: 4px;
    padding: 5px;
    position: absolute;
    right: -1px;
    top: 20px;
    width: 270px;
}
.car_ul li {
    padding: 3px 0;
}
.car_ul li {
    line-height: 22px;
    width: 270px;
}
.car_ul .f_l {
    float: left;
    width: 177px;
}
.car_ul .f_r {
    float: right;
    padding-top: 2px;
    text-align: right;
    width: 90px;
}
car_ul .name {
    float: left;
    height: 46px;
    line-height: 23px;
    overflow: hidden;
    padding: 2px 0 0 5px;
    width: 117px;
}
.car_ul .f_r b {
    color: #FF0000;
}
.car_ul .f_r .del {
    color: #999999;
}
复制代码

当然。这里默认这个详单是display:none的。需要您通过js进行调用将期display:block。
接下来,就是要改程序了:
打开/include/lib_insert.php找到function insert_cart_info()。将其改成以下内容
function insert_cart_info1()
{
    $sql = 'SELECT c.*,g.goods_name,g.goods_thumb,g.goods_id,c.goods_number,c.goods_price' .
           ' FROM ' . $GLOBALS['ecs']->table('cart') ." AS c ".
                                         " LEFT JOIN ".$GLOBALS['ecs']->table('goods')." AS g ON g.goods_id=c.goods_id ".
           " WHERE session_id = '" . SESS_ID . "' AND rec_type = '" . CART_GENERAL_GOODS . "'";
    $row = $GLOBALS['db']->GetAll($sql);
                $arr = array();
                foreach($row AS $k=>$v)
                {
                                $arr[$k]['goods_thumb']  =get_image_path($v['goods_id'], $v['goods_thumb'], true);
        $arr[$k]['short_name']   = $GLOBALS['_CFG']['goods_name_length'] > 0 ?
                                               sub_str($v['goods_name'], $GLOBALS['_CFG']['goods_name_length']) : $v['goods_name'];
                                $arr[$k]['url']          = build_uri('goods', array('gid' => $v['goods_id']), $v['goods_name']);
                                $arr[$k]['goods_number'] = $v['goods_number'];
                                $arr[$k]['goods_name']   = $v['goods_name'];
                                $arr[$k]['goods_price']  = price_format($v['goods_price']);
                                $arr[$k]['rec_id']       = $v['rec_id'];
                }
    $sql = 'SELECT SUM(goods_number) AS number, SUM(goods_price * goods_number) AS amount' .
           ' FROM ' . $GLOBALS['ecs']->table('cart') .
           " WHERE session_id = '" . SESS_ID . "' AND rec_type = '" . CART_GENERAL_GOODS . "'";
    $row = $GLOBALS['db']->GetRow($sql);


    if ($row)
    {
        $number = intval($row['number']);
        $amount = floatval($row['amount']);
    }
    else
    {
        $number = 0;
        $amount = 0;
    }


    $GLOBALS['smarty']->assign('str',sprintf($GLOBALS['_LANG']['cart_info'], $number, price_format($amount, false)));
        $GLOBALS['smarty']->assign('goods11',$arr);
        $GLOBALS['smarty']->assign('goods_number',$number);
        $GLOBALS['smarty']->assign('order_amount',$amount);
    $output = $GLOBALS['smarty']->fetch('library/car_info.lbi');
    return $output;
}


这样,就大功告成了!!购物车详细内容会显示了。但关键的是购物车中的删除。这个就要我们重新写入相应程序了才行。
我们在网站根目录建一个文件为delete_cart_goods.php。它的作用,来专门负责购物车进行更新的那么一个程序(其实只用于删除购物车的订单)
<?php
define('IN_ECS', true);
require(dirname(__FILE__) . '/includes/init.php');
include_once('includes/cls_json.php');
$result = array('error' => 0, 'message' => '', 'content' => '', 'goods_id' => '');
$json  = new JSON;
if($_POST['id'])
{
$sql = 'DELETE FROM '.$GLOBALS['ecs']->table('cart')." WHERE rec_id=".$_POST['id'];
$GLOBALS['db']->query($sql);
}
$sql = 'SELECT c.*,g.goods_name,g.goods_thumb,g.goods_id,c.goods_number,c.goods_price' .
                         ' FROM ' . $GLOBALS['ecs']->table('cart') ." AS c ".
                         " LEFT JOIN ".$GLOBALS['ecs']->table('goods')." AS g ON g.goods_id=c.goods_id ".
                         " WHERE session_id = '" . SESS_ID . "' AND rec_type = '" . CART_GENERAL_GOODS . "'";
$row = $GLOBALS['db']->GetAll($sql);
$arr = array();
foreach($row AS $k=>$v)
{
                $arr[$k]['goods_thumb']  =get_image_path($v['goods_id'], $v['goods_thumb'], true);
                $arr[$k]['short_name']   = $GLOBALS['_CFG']['goods_name_length'] > 0 ?
                                                                                                                                                                         sub_str($v['goods_name'], $GLOBALS['_CFG']['goods_name_length']) : $v['goods_name'];
                $arr[$k]['url']          = build_uri('goods', array('gid' => $v['goods_id']), $v['goods_name']);
                $arr[$k]['goods_number'] = $v['goods_number'];
                $arr[$k]['goods_name']   = $v['goods_name'];
                $arr[$k]['goods_price']  = price_format($v['goods_price']);
                $arr[$k]['rec_id']       = $v['rec_id'];
}
$sql = 'SELECT SUM(goods_number) AS number, SUM(goods_price * goods_number) AS amount' .
                         ' FROM ' . $GLOBALS['ecs']->table('cart') .
                         " WHERE session_id = '" . SESS_ID . "' AND rec_type = '" . CART_GENERAL_GOODS . "'";
$row = $GLOBALS['db']->GetRow($sql);
if ($row)
{
                $number = intval($row['number']);
                $amount = floatval($row['amount']);
}
else
{
                $number = 0;
                $amount = 0;
}
$GLOBALS['smarty']->assign('str',sprintf($GLOBALS['_LANG']['cart_info'], $number, price_format($amount, false)));
$GLOBALS['smarty']->assign('goods11',$arr);
$GLOBALS['smarty']->assign('goods_number',$number);
$GLOBALS['smarty']->assign('order_amount',$amount);
$result['content'] = $GLOBALS['smarty']->fetch('library/car_info.lbi');
die($json->encode($result));
?>


代码如上了,但细心的人看,这其实和lib_insert中的insert_cart_info函数是一样的,只是最后一行不一样,一个是输出到json数据组,一个直接返回。
这样有了这些以后就只差模板中的JS调用了。我们给删除链接添加了代码<a class="del" href="javascript:">[删除]</a>
插入deleteCartGoods这个js就行了。在这里提示一下,使用Jquery和使用EC自带的JS写法是有一定区别的,JQuery 我在这里就不写了,因为我火柴网的确没有使用,我也就懒得写了。
<script type="text/javascript">
function deleteCartGoods(rec_id)
{
Ajax.call('delete_cart_goods.php', 'id='+rec_id, deleteCartGoodsResp**e, 'POST', 'JSON');
}
/**
* 接收删除后返回的信息
*/
function deleteCartGoodsResp**e(res)
{
  if (res.error)
  {
    alert(res.err_msg);
  }
  else
  {
      document.getElementById('ECS_CARTINFO').innerHTML = res.content;//这里的ID需要改一下
  }
}
</script>
复制代码


原理很简单,先发送删除指令,然后将返回的json数据重新加载到ECS_CARTINFO中的代码中就行了。

到此,大功告成!!
View Code

ECSHOP换KindEditor编辑器

EcShop开发手册_使用教程EcShop开发手册_php_02
ECSHOP一直用的FCK,这个不解释,太多杯具太多纠结。

---------------------
KindEdito主要特点
快速:体积小,加载速度快
开源:开放源代码,高水平,高品质
底层:内置自定义 DOM 类库,精确操作 DOM
扩展:基于插件的设计,所有功能都是插件,可根据需求增减功能
风格:修改编辑器风格非常容易,只需修改一个 CSS 文件
兼容:支持大部分主流浏览器,比如 IE、Firefox、Safari、Chrome、Opera
---------------------
官方下载最新版,解压直接扔在根目录算了,现在拿编辑产品信息开刀,模板页面?这个不用说了吧(admin/templates/goods_info.html).
1.在head部分添加:

<script charset=”utf-8″ src=”../kindeditor/kindeditor.js”></script>
<script>
KE.show({
id : ‘editor_id’,
allowFileManager : true

});
</script>

2.修改产品描述所调用的FCK编辑器 {$FCKeditor} 为
<textarea id=”editor_id” name=”goods_desc” style=”width:90%;height:300px;”>
{$goods.goods_desc}
</textarea>

OK,至此结束,看看效果吧!
View Code

ECSHOP所有页面分类树显示全部的方法,所有页面分类树显示全部的方法

EcShop开发手册_使用教程EcShop开发手册_php_02
ECSHOP所有页面分类树显示全部的方法,所有页面分类树显示全部的方法
 
修改方法如下:

打开includes/lib_goods.php,找到get_categories_tree()函数部分,找到这一段:
function get_categories_tree($cat_id = 0)
{
    if ($cat_id > 0)
    {
        $sql = 'SELECT parent_id FROM ' . $GLOBALS['ecs']->table('category') . " WHERE cat_id = '$cat_id'";
        $parent_id = $GLOBALS['db']->getOne($sql);
    }
    else
    {
        $parent_id = 0;
    }

修改成:

function get_categories_tree($cat_id = 0)
{
    if ($cat_id > 0)
    {
        $sql = 'SELECT parent_id FROM ' . $GLOBALS['ecs']->table('category') . " WHERE cat_id = '$cat_id'";
        
    }
View Code

Ecshop 团购列表增加市场价、团购价、为您节省、倒计时等!

EcShop开发手册_使用教程EcShop开发手册_php_02
曾经求助过此方法,结果运气很好,有一位高手加我无偿为我解决了此问题,非常感谢!经过我俩几天的调试,目前只有1个小问题,其它均完美实现。我整理了详细的教程,经过高手的同意,现在分享给大家,大家都装上后看一下是否都有我遇到的问题。先贴问题,再贴教程。

问题:在我本地和我的服务器上,都出现了团购价调用不出来的现象。而在那位高手兄弟的机子上却没有这个问题,这个问题我们搞了好几天都没解决。甚至他把他的网站程序备份后传给我安装,到我本地还是会出现此问题,奇了怪了。我对这个问题的看法是数据写不到数据库,可能是我俩的环境版本的问题。目前我的解决方法是去数据库字段里修改,没办法,手工修改。

看,团购价格应该是50元,在我这就是出不来,一直显示的是市场价格。

教程,共5步

1,网站后台-数据库管理-SQL查询-执行sql语句:
ALTER TABLE `ecs_goods_activity` ADD `tuan_price` DECIMAL( 10, 2 ) UNSIGNED NOT NULL DEFAULT '0.00'

2,admin/templates/group_buy_info.htm
找到“<a href="javascript:;"><strong>[+]</strong></a>”注释掉。
找到<a href="javascript:;"><strong>[-]</strong></a>    </td>
</tr>
  {/if}
  {/foreach}
在其下面添加
<tr>
    <td class="label">团购价格:</td>
    <td><input type="text" name="market_price" value="{$group_buy.market_price}" size="30" /> 该价格与价格阶梯价格相同,2个都不能少!</td>
  </tr>

3,admin/group_buy.php
找到'ext_info'   => serialize(array(
在其上面一行添加
'tuan_price'      => $tuan_price,

4,themes/default/group_buy_list.dwt大约61行 添加
   市场价格:{$group_buy.shop_price1}<br />
   团购价格:{$group_buy.tuan_price1}<br />
   为您节省:{$group_buy.js}<br />
   折扣:{$group_buy.zk}<br />
   倒计时:<font id="timeszc{$group_buy.i}" color="#717171"  size="2"></font><br />
例:我的是在“{$lang.gb_price_ladder}<br />”上一行添加的

搜索</body>,在其上面一行添加:
<SCRIPT LANGUAGE="JavaScript"> 
<!-- {foreach from=$gb_list item=val} --> 
function _fresh{$val.i}()  
{  
var endtime{$val.i}=new Date("{$val.end_timeno}");
var nowtime = new Date();  
var leftsecond=parseInt((endtime{$val.i}.getTime()-nowtime.getTime())/1000);  
__d=parseInt(leftsecond/3600/24);  
__h=parseInt((leftsecond/3600)%24);  
__m=parseInt((leftsecond/60)%60);  
__s=parseInt(leftsecond%60);  
var c=new Date();
var q=((c.getMilliseconds())%10);
if(leftsecond<=0){  
document.getElementById("timeszc{$val.i}").innerHTML="促销已结束";  
clearInterval(sh{$val.i});  
} 
else 
{ 
  if (__h<10) {__h="0"+__h} 
  //分数取两位,不足补0
  if (__m<10) {__m="0"+__m} 
  //秒数取两位,不足补0
  if (__s<10) {__s="0"+__s} 

  document.getElementById("timeszc{$val.i}").innerHTML=__d+" 天"+__h+" 时"+__m+" 分"+__s+" 秒";  
} 
}  
_fresh{$val.i}()  
var sh{$val.i};  
sh{$val.i}=setInterval(_fresh{$val.i},100);  
<!--{/foreach}-->
</SCRIPT>

5,根目录/group_buy.php
找到function group_buy_list($size, $page)
下面全部替换
{
    /* 取得团购活动 */
    $gb_list = array();
    $now = gmtime();
    $sql = "SELECT b.*, IFNULL(g.goods_thumb, '') AS goods_thumb, b.tuan_price, b.act_id AS group_buy_id, g.shop_price,".
                "b.start_time AS start_date, b.end_time AS end_date " .
            "FROM " . $GLOBALS['ecs']->table('goods_activity') . " AS b " .
                "LEFT JOIN " . $GLOBALS['ecs']->table('goods') . " AS g ON b.goods_id = g.goods_id " .
            "WHERE b.act_type = '" . GAT_GROUP_BUY . "' " .
            "AND b.start_time <= '$now' AND b.is_finished < 3 ORDER BY b.act_id DESC";
    $res = $GLOBALS['db']->selectLimit($sql, $size, ($page - 1) * $size);

$i = 1;
    while ($group_buy = $GLOBALS['db']->fetchRow($res))
    {
        $ext_info = unserialize($group_buy['ext_info']);
        $group_buy = array_merge($group_buy, $ext_info);
        /* 格式化时间 */
  $group_buy['i']          = $i ++;
        $group_buy['formated_start_date']   = local_date($GLOBALS['_CFG']['time_format'], $group_buy['start_date']);
        $group_buy['formated_end_date']     = local_date($GLOBALS['_CFG']['time_format'], $group_buy['end_date']);

  $group_buy['end_timeno']  = local_date('Y/m/d H:i:s', $group_buy['end_date']);
        /* 格式化保证金 */
        $group_buy['formated_deposit'] = price_format($group_buy['deposit'], false);
  $group_buy['shop_price1'] = price_format($group_buy['shop_price'], false);
        if ( $group_buy['tuan_price'] == 0)
        {
            $group_buy['tuan_price1'] = $group_buy['shop_price1'];
   $group_buy['js'] = 0;
   $group_buy['zk'] = 1;
        }
        else
        {
            $group_buy['tuan_price1'] = price_format($group_buy['tuan_price'], false);
   $group_buy['tuan_price'] = $group_buy['tuan_price'];
   $group_buy['js'] = $group_buy['shop_price']-$group_buy['tuan_price'];
   $group_buy['zk'] = round(($group_buy['tuan_price']/$group_buy['shop_price'])*10 ,2);
        }  

        /* 处理价格阶梯 */
        $price_ladder = $group_buy['price_ladder'];
        if (!is_array($price_ladder) || empty($price_ladder))
        {
            $price_ladder = array(array('amount' => 0, 'price' => 0));
        }
        else
        {
            foreach ($price_ladder as $key => $amount_price)
            {
                $price_ladder[$key]['formated_price'] = price_format($amount_price['price']);
            }
        }
        $group_buy['price_ladder'] = $price_ladder;
        /* 处理图片 */
        if (empty($group_buy['goods_thumb']))
        {
            $group_buy['goods_thumb'] = get_image_path($group_buy['goods_id'], $group_buy['goods_thumb'], true);
        }
        /* 处理链接 */
        $group_buy['url'] = build_uri('group_buy', array('gbid'=>$group_buy['group_buy_id']));
        /* 加入数组 */
        $gb_list[] = $group_buy;
    }
    return $gb_list;
}
?>
View Code

Ecshop后台fckeditor上传图片路径修改和重命名上传图片

EcShop开发手册_使用教程EcShop开发手册_php_02
Ecshop上传的图片都是放在images/upload/Image/下面的,图片多了就不爽了哦。Ecshop后台fckeditor上传图片路径修改和重命名上传图片

看了网上很多修改的地方,自己也测试了好几次,现在终于可以了。

Fckeditor上传图片路径修改后的路径是: 已年月日时分秒来区分

images/upload/Image/201303/05143045-6546.jpg
images/upload/Image/年月/日时分秒-四位随机数.上传图片后缀名

我只修改了Image的路径,File、Flash、Media可自己参考修改。

一、修改Ecshop fckeditor 图片上传路径只有一点改动:
找到includes/fckeditor/editor/filemanager/connectors/php/config.php

$Config['FileTypesPath']['Image']       = $Config['UserFilesPath'] . 'Image/' ;
$Config['FileTypesAbsolutePath']['Image']= ($Config['UserFilesAbsolutePath'] == '') ? '' : $Config['UserFilesAbsolutePath'].'Image/' ;
改为:
$Config['FileTypesPath']['Image']       = $Config['UserFilesPath'] . 'Image/'. date('Ym',time()+3600*8).'/' ;
$Config['FileTypesAbsolutePath']['Image']= ($Config['UserFilesAbsolutePath'] == '') ? '' : $Config['UserFilesAbsolutePath'].'Image/'. date('Ym',time()+3600*8).'/' ;

就是在后面加了date函数,因为我这里用的UTC时区,所以加了8小时。

二、修改Ecshop fckeditor 上传图片的名字,重命名上传的图片的名字:
找到includes/fckeditor/editor/filemanager/connectors/php/io.php
找到SanitizeFileName函数,
//$sNewFileName = preg_replace( '/\\\\|\\/|\\||\\:|\\?|\\*|"|<|>|[[:cntrl:]]/', '_', $sNewFileName ) ;
把这一行注释掉,替换为:

$sExtension = substr( $sNewFileName, (strrpos($sNewFileName,'.') + 1 ) ) ;  //获取扩展名
$sNewFileName = date('dHis-',time()+3600*8).rand(0,9999).'.'.$sExtension;

替换之后的SanitizeFileName函数如下:
function SanitizeFileName( $sNewFileName )
{
    global $Config ;

    $sNewFileName = stripslashes( $sNewFileName ) ;

    // Replace dots in the name with underscores (only one dot can be there... security issue).
    if ( $Config['ForceSingleExtension'] )
        $sNewFileName = preg_replace( '/\\.(?![^.]*$)/', '_', $sNewFileName ) ;

    // Remove \ / | : ? * " < >
    //$sNewFileName = preg_replace( '/\\\\|\\/|\\||\\:|\\?|\\*|"|<|>|[[:cntrl:]]/', '_', $sNewFileName ) ;
    $sExtension = substr( $sNewFileName, (strrpos($sNewFileName,'.') + 1 ) ) ;
    $sNewFileName = date('dHis-',time()+3600*8).rand(0,9999).'.'.$sExtension;  //20130305
    return $sNewFileName ;
}
View Code

ecshop促销时间倒计时效果

EcShop开发手册_使用教程EcShop开发手册_php_02
ecshop促销时间倒计时效果的实现如下:
1、首先修改程序部分
打开includes/lib_goods.php
找到get_promote_goods()函数部分
在 $goods[$idx]['url']   = build_uri('goods', array('gid' => $row['goods_id']), $row['goods_name']);
下面增加代码

        $time = gmtime();
        if ($time >= $row['promote_start_date'] && $time <= $row['promote_end_date'])
        {
             $goods[$idx]['gmt_end_time'] = local_date('M d, Y H:i:s',$row['promote_end_date']);
        }
        else
        {
            $goods[$idx]['gmt_end_time'] = 0;
        }
2、
然后将 library/recommend_promotion.lbi
全部替换为下面代码:
<meta http-equiv="Content-Type" content="text/html; charset=gbk">
<!-- {if $promotion_goods} -->
<script >
var Tday = new Array();
var daysms = 24 * 60 * 60 * 1000
var hoursms = 60 * 60 * 1000
var Secondms = 60 * 1000
var microsecond = 1000
var DifferHour = -1
var DifferMinute = -1
var DifferSecond = -1
function clock(key)
{
   var time = new Date()
   var hour = time.getHours()
   var minute = time.getMinutes()
   var second = time.getSeconds()
   var timevalue = ""+((hour > 12) ? hour-12:hour)
   timevalue +=((minute < 10) ? ":0":":")+minute
   timevalue +=((second < 10) ? ":0":":")+second
   timevalue +=((hour >12 ) ? " PM":" AM")
   var convertHour = DifferHour
   var convertMinute = DifferMinute
   var convertSecond = DifferSecond
   var Diffms = Tday[key].getTime() - time.getTime()
   DifferHour = Math.floor(Diffms / daysms)
   Diffms -= DifferHour * daysms
   DifferMinute = Math.floor(Diffms / hoursms)
   Diffms -= DifferMinute * hoursms
   DifferSecond = Math.floor(Diffms / Secondms)
   Diffms -= DifferSecond * Secondms
   var dSecs = Math.floor(Diffms / microsecond)
  
   if(convertHour != DifferHour) a="<font color=red>"+DifferHour+"</font>天";
   if(convertMinute != DifferMinute) b="<font color=red>"+DifferMinute+"</font>时";
   if(convertSecond != DifferSecond) c="<font color=red>"+DifferSecond+"</font>分"
     d="<font color=red>"+dSecs+"</font>秒"
     if (DifferHour>0) {a=a}
     else {a=''}
   document.getElementByIdx_xx_x("leftTime"+key).innerHTML = a + b + c + d; //显示倒计时信息
}
</script>
<div id="sales" class="f_l clearfix">
      <h1><a href="../search.php?intro=promotion"><img src="images/more.gif" /></a></h1>
       <div class="clearfix goodBox">
         <!--{foreach from=$promotion_goods key=key item=goods name="promotion_foreach"}-->
         {if $smarty.foreach.promotion_foreach.index <= 3}
           <div class="goodList">
           <a href="{$goods.url}"><img src="{$goods.thumb}" border="0" alt="{$goods.name|escape:html}"/></a><br />
      <p><a href="{$goods.url}" title="{$goods.name|escape:html}">{$goods.short_name|escape:html}</a></p>
           {$lang.promote_price}<font class="f1">{$goods.promote_price}</font><br><font class="f4" id="leftTime{$key}">{$lang.please_waiting}</font>
           </div>
         {/if}
<script>
Tday[{$key}] = new Date("{$goods.gmt_end_time}");  
window.setInterval(function()    
{clock({$key});}, 1000);    
</script>
         <!--{/foreach}-->
       </div>
      </div>
    
<!-- {/if} -->
View Code

ecshop开发之如何实现团购网的倒计时功能 

EcShop开发手册_使用教程EcShop开发手册_php_02
首先,你需要在购买的时候,提示输入框,告诉用户,你必须购买多少.其次,购物车中需要修改购买数量的时候,你也需要控制。
   1:详细页面中控制.
   在flow.php里面addto_cart中,加入以下代码,控制购买.
   $gc = $db -> getOne("select gc from ".$ecs->table('goods')." where goods_id = ".$goods ->goods_id);
       if ($goods->number%$gc) {
      $result['error'] = 1;
      $result['message'] = "购买数量必须输入{$gc}的倍数";
       }
       2:在common.js中增加函数
       function addToCart1(goodsId, parentId)
{
   var goods        = new Object();
   var spec_arr     = new Array();
   var fittings_arr = new Array();
   var number    = 1;
   var t = "number"+goodsId;
   number = document.getElementByIdx_x("number"+goodsId).value;
   goods.spec     = spec_arr;
   goods.goods_id = goodsId;
   goods.number = number;
   goods.parent = (typeof(parentId) == "undefined") ? 0 : parseInt(parentId);
   Ajax.call('flow.php?step=add_to_cart', 'goods=' + goods.toJSONString(), addToCartResponse, 'POST', 'JSON');
}
2:控制列表页面的购买.
在列表页面中,增加一个框.
<form action="javascript:addToCart1({$goods.goods_id})" method="post" name="ECS_FORMBUY{$goods.goods_id}" id="ECS_FORMBUY{$goods.goods_id}" >
  
   购买数量:<input name="number{$goods.goods_id}" type="text" id="number{$goods.goods_id}" value="1" size="4"   class="formBorder"/><br />
  
  
   <a href="javascript:addToCart1({$goods.goods_id})"><img src="images/but_buy.jpg"></a>
   <a href="javascript:;" id="compareLink"quotes"}','{$goods.type}')"><img src="images/but_comp.jpg"></a></form>
调用addToCart1函数.
3:推荐页面
    在common.js中增加函数addToCart2
function addToCart2(goodsId, parentId)
{
   var goods        = new Object();
   var spec_arr     = new Array();
   var fittings_arr = new Array();
   var number    = 1;
   var t = "number"+goodsId;
   number = document.getElementByIdx_x("number_"+goodsId).value;
   goods.spec     = spec_arr;
   goods.goods_id = goodsId;
   goods.number = number;
   goods.parent = (typeof(parentId) == "undefined") ? 0 : parseInt(parentId);
   Ajax.call('flow.php?step=add_to_cart', 'goods=' + goods.toJSONString(), addToCartResponse, 'POST', 'JSON');
}
在recommend_new.lbi,recommend_best.lbi等页面中,需要增加输入框.调用次函数.
<form action="javascript:addToCart2({$goods.id})" method="post" name="ECS_FORMBUY_{$goods.id}" id="ECS_FORMBUY_{$goods.id}" >
  
   购买数量:<input name="number_{$goods.id}" type="text" id="number_{$goods.id}" value="1" size="4"   class="formBorder"/><br /><a href="javascript:addToCart2({$goods.id})"><img src="images/but_buy.jpg"></a></form>
最后完成了购买数量的控制。
View Code

ecshop首页促销商品倒计时效果

EcShop开发手册_使用教程EcShop开发手册_php_02
ecshop促销时间倒计时


1、首先修改程序部分
打开includes/lib_goods.php
找到get_promote_goods()函数部分
在 $goods[$idx]['url']   = build_uri('goods', array('gid' => $row['goods_id']), $row['goods_name']);


下面增加代码




        $time = gmtime();
        if ($time >= $row['promote_start_date'] && $time <= $row['promote_end_date'])
        {
             $goods[$idx]['gmt_end_time'] = local_date('M d, Y H:i:s',$row['promote_end_date']);
        }
        else
        {
            $goods[$idx]['gmt_end_time'] = 0;
        }


2、
然后将 library/recommend_promotion.lbi
全部替换为下面代码:


<meta http-equiv="Content-Type" content="text/html; charset=gbk">
<!-- {if $promotion_goods} -->
<script >
var Tday = new Array();
var daysms = 24 * 60 * 60 * 1000
var hoursms = 60 * 60 * 1000
var Secondms = 60 * 1000
var microsecond = 1000
var DifferHour = -1
var DifferMinute = -1
var DifferSecond = -1
function clock(key)
{
   var time = new Date()
   var hour = time.getHours()
   var minute = time.getMinutes()
   var second = time.getSeconds()
   var timevalue = ""+((hour > 12) ? hour-12:hour)
   timevalue +=((minute < 10) ? ":0":":")+minute
   timevalue +=((second < 10) ? ":0":":")+second
   timevalue +=((hour >12 ) ? " PM":" AM")
   var convertHour = DifferHour
   var convertMinute = DifferMinute
   var convertSecond = DifferSecond
   var Diffms = Tday[key].getTime() - time.getTime()
   DifferHour = Math.floor(Diffms / daysms)
   Diffms -= DifferHour * daysms
   DifferMinute = Math.floor(Diffms / hoursms)
   Diffms -= DifferMinute * hoursms
   DifferSecond = Math.floor(Diffms / Secondms)
   Diffms -= DifferSecond * Secondms
   var dSecs = Math.floor(Diffms / microsecond)
  
   if(convertHour != DifferHour) a="<font color=red>"+DifferHour+"</font>天";
   if(convertMinute != DifferMinute) b="<font color=red>"+DifferMinute+"</font>时";
   if(convertSecond != DifferSecond) c="<font color=red>"+DifferSecond+"</font>分"
     d="<font color=red>"+dSecs+"</font>秒"
     if (DifferHour>0) {a=a}
     else {a=''}
   document.getElementById("leftTime"+key).innerHTML = a + b + c + d; //显示倒计时信息


}
</script>
<div id="sales" class="f_l clearfix">
      <h1><a href="../search.php?intro=promotion"><img src="images/more.gif" /></a></h1>
       <div class="clearfix goodBox">
         <!--{foreach from=$promotion_goods key=key item=goods name="promotion_foreach"}-->
             <div class="goodList">
           <a href="{$goods.url}"><img src="{$goods.thumb}" border="0" alt="{$goods.name|escape:html}"/></a><br />
      <p><a href="{$goods.url}" title="{$goods.name|escape:html}">{$goods.short_name|escape:html}</a></p>
           {$lang.promote_price}<font class="f1">{$goods.promote_price}</font><br><font class="f4" id="leftTime{$key}">{$lang.please_waiting}</font>
           </div>
<script>
Tday[{$key}] = new Date("{$goods.gmt_end_time}");  
window.setInterval(function()    
{clock({$key});}, 1000);    
</script>
         <!--{/foreach}-->
       </div>
      </div>
    
<!-- {/if} -->
View Code

ecshop首页特价、团购商品显示倒计时  

EcShop开发手册_使用教程EcShop开发手册_php_02
虽然这在百度已经有很多了吧,可我还是花了很长时间才给弄出来。
1、打开includes/lib_goods.php
找到get_promote_goods()函数部分
在
$goods[$idx]['url']          = build_uri('goods', array('gid' => $row['goods_id']), $row['goods_name']);
下面增加代码
/* 促销时间倒计时 */ $time = gmtime();
if ($time >= $row['promote_start_date'] && $time <= $row['promote_end_date'])
{
    $goods[$idx]['gmt_end_time']  = local_date('M d, Y H:i:s',$row['promote_end_date']);
 }else{
    $goods[$idx]['gmt_end_time'] = 0;
 }

2、然后将 library/recommend_promotion.lbi
全部替换为下面代码:


<meta http-equiv="Content-Type" content="text/html; charset=gbk">
<!-- {if $promotion_goods} -->
<script >
var Tday = new Array();
var daysms = 24 * 60 * 60 * 1000
var hoursms = 60 * 60 * 1000
var Secondms = 60 * 1000
var microsecond = 1000
var DifferHour = -1
var DifferMinute = -1
var DifferSecond = -1
function clock(key)
{
 var time = new Date()
var hour = time.getHours()
 var minute = time.getMinutes()
var second = time.getSeconds()
var timevalue = ""+((hour > 12) ? hour-12:hour)
timevalue +=((minute < 10) ? ":0":":")+minute
timevalue +=((second < 10) ? ":0":":")+second
timevalue +=((hour >12 ) ? " PM":" AM")
var convertHour = DifferHour
var convertMinute = DifferMinute
var convertSecond = DifferSecond
var Diffms = Tday[key].getTime() - time.getTime()
DifferHour = Math.floor(Diffms / daysms)
Diffms -= DifferHour * daysms
DifferMinute = Math.floor(Diffms / hoursms)
Diffms -= DifferMinute * hoursms
DifferSecond = Math.floor(Diffms / Secondms)
Diffms -= DifferSecond * Secondms
var dSecs = Math.floor(Diffms / microsecond)
 if(convertHour != DifferHour) a="<font color=red>"+DifferHour+"</font>天";
if(convertMinute != DifferMinute) b="<font color=red>"+DifferMinute+"</font>时";
if(convertSecond != DifferSecond) c="<font color=red>"+DifferSecond+"</font>分"
d="<font color=red>"+dSecs+"</font>秒"
 if (DifferHour>0) {a=a}
else {a=''}
document.getElementById("leftTime"+key).innerHTML = a + b + c + d; //显示倒计时信息
}
</script>
..............省略div布局代码...............
<!--{foreach from=$promotion_goods key=key item=goods}-->
<!--这里一定要注意 不要忘了 上面foreach里 设置了 一个 key-->
         <br><font class="f4" id="leftTime{$key}">{$lang.please_waiting}</font>
...............省略div布局代码.................
<script>
     Tday[{$key}] = new Date("{$goods.gmt_end_time}");  
     window.setInterval(function(){clock({$key});}, 1000);    
</script>
<!--{/foreach}-->
</div>
</div>
<!-- {/if} -->
View Code

ecshop添加自定义导航

EcShop开发手册_使用教程EcShop开发手册_php_02
ecshop默认有顶部、中间和底部三种导航,如果我们想增加其他的导航怎么做呢?
工具/原料
ecsshop
方法/步骤
在languages/zh_cn/admin/navigator.php中添加一行
$_LANG['custom'] = '自定义';

编辑admin/templates/navigator_add.htm,在第42行(根据实际情况)后面追加
<option value='custom' {$rt.item_type_coustom}>{$lang.custom}</option>

后台“系统设置”-》“自定义导航栏”-》“添加导航”在位置下拉菜单中即可看到刚才添加的“自定义”选项。

在前台模板(比如index.dwt)中通过
 <!-- {foreach name=nav_top_list from=$navigator_list.custom item=nav} -->
 <!-- {/foreach} -->
显示导航内容。

前台效果
View Code

ecshop怎么得到商品属性的值

EcShop开发手册_使用教程EcShop开发手册_php_02
ECSHop的自定义属性很是好用,但是在前台输出的时候非常麻烦,只能循环输出所有的附加商品属性,不能输出制定的某个自定义的属性,本来它用的是Smarty模板,但是到2.5之后好像是把Smarty修改很多,里面好多东西不能用了。今天给朋友改东西,随便就写了下。

      我只在商品具体信息页面(goods.php)做了这个事情,可以的话可以写到每个页面去。

修改goods.php
在

PHP代码
$smarty->assign(‘properties’,          $properties['pro']);   
这句前添加:

PHP代码
//By Sharmy    
$pros = array();    
foreach($properties['pro']['商品属性'] as $k=>$pro){    
    $pros[$pro['name']]['specId'] = $k;    
    $pros[$pro['name']]['value'] = $pro['value'];    
}    
$smarty->assign(‘pros’,          $pros);    
然后在模板部分可以这样调用(例如调用自己在后台定义的"净重"的商品类别属性):

XML/HTML代码
<ul><li> 净重:{$pros.净重.value}</li></ul>   
接下来就可以修改它的其它页面了,最好是修改调用的function部分,例如修改lib_goods.php里的get_goods_propertiess。
View Code

ecshop增加pc扫描二维码微信支付功能代码

EcShop开发手册_使用教程EcShop开发手册_php_02
ecshop开发网站,如果没有手机版,又想通过微信支付,可以加入pc二维码扫描微信支付功能
工具/原料
ecshop商城系统,phpqrcode,WxPayPubHelper
公众号已申请微信支付
方法/步骤
使用PHP QR Code生成二维码,下载,在商品支付页面加入
include 'phpqrcode/phpqrcode.php';
$pay_url ='http://www.xxx.com/weixin/weixin.php?order_id='.$order['order_sn'];
    QRcode::png($pay_url, 'images/image.png', 'L', 8);
echo '<img src="images/image.png" />';
生成一个指向微信支付的手机连接二维码,手机扫描进入

打开申请到的微信支付代码,在上面加入weixin.php
define('IN_ECS', true);
require('../includes/init.php');
require('../includes/lib_order.php');
$order_id = isset($_GET['order_id']) ? intval($_GET['order_id']) : 0;
$order = order_info(0,$order_id);
获取订单信息

手机打开页面调用代码
<html>
<head>
    <meta http-equiv="content-type" content="text/html;charset=utf-8"/>
    <title>微信安全支付</title>
<script type="text/javascript">
//调用微信JS api 支付
function jsApiCall()
{
WeixinJSBridge.invoke(
'getBrandWCPayRequest',
<?php echo $jsApiParameters; ?>,
function(res){
WeixinJSBridge.log(res.err_msg);
//alert(res.err_code+res.err_desc+res.err_msg);
}
);
}
function callpay()
{
if (typeof WeixinJSBridge == "undefined"){
   if( document.addEventListener ){
       document.addEventListener('WeixinJSBridgeReady', jsApiCall, false);
   }else if (document.attachEvent){
       document.attachEvent('WeixinJSBridgeReady', jsApiCall); 
       document.attachEvent('onWeixinJSBridgeReady', jsApiCall);
   }
}else{
   jsApiCall();
}
}
callpay();
</script>
</head>
<body>
</br></br></br></br>
</body>
</html>

代码引用WxPayPubHelper,
WxPay.pub.config.php
配置文件
class WxPayConf_pub
{
//=======【基本信息设置】=====================================
//微信公众号身份的唯一标识。审核通过后,在微信发送的邮件中查看
const APPID = 'xxx';
//受理商ID,身份标识
const MCHID = 'xxx';
//商户支付密钥Key。审核通过后,在微信发送的邮件中查看
const KEY = 'xxx';
//JSAPI接口中获取openid,审核后在公众平台开启开发模式后可查看
const APPSECRET = 'xxx';
//=======【JSAPI路径设置】===================================
//获取access_token过程中的跳转uri,通过跳转将code传入jsapi支付页面
const JS_API_CALL_URL = 'http://www.xxx.com/weixin/js_api_call.php';
//=======【证书路径设置】=====================================
//证书路径,注意应该填写绝对路径
const SSLCERT_PATH = '/weixin/WxPayPubHelper/cacert/apiclient_cert.pem';
const SSLKEY_PATH = '/weixin/WxPayPubHelper/cacert/apiclient_key.pem';
//=======【异步通知url设置】===================================
//异步通知url,商户根据实际开发过程设定
const NOTIFY_URL = 'http://www.xxx.com/weixin/notify_url.php';
//=======【curl超时设置】===================================
//本例程通过curl使用HTTP POST方法,此处可修改其超时时间,默认为30秒
const CURL_TIMEOUT = 30;
}
?>
根据申请的信息填写

找到notify_url.php文件
上面添加
define('IN_ECS', true);
require('../includes/init.php');
require('../includes/lib_payment.php');
调用订单信息

notify_url.php添加支付后修改订单状态
if($notify->checkSign() == TRUE)
{
if ($notify->data["return_code"] == "FAIL") {
//此处应该更新一下订单状态,商户自行增删操作
//$log_->log_result($log_name,"【通信出错】:\n".$xml."\n");
}
elseif($notify->data["result_code"] == "FAIL"){
//此处应该更新一下订单状态,商户自行增删操作
//$log_->log_result($log_name,"【业务出错】:\n".$xml."\n");
}
else{
//此处应该更新一下订单状态,商户自行增删操作
//$log_->log_result($log_name,"【支付成功】:\n".$xml."\n");
$order = $notify->getData();
$log_id=get_order_id_by_sn($order["out_trade_no"]);
order_paid($log_id);
}
//商户自行增加处理流程,
//例如:更新订单状态
//例如:数据库操作
//例如:推送支付完成信息
}

7
更多安全信息和详细信息就不列举了
View Code

ecshop专题页面添加关键词_描述

EcShop开发手册_使用教程EcShop开发手册_php_02
ecshop专题页面添加关键词 描述 (红色为添加部分)
 
后台管理模板topic_edit.htm
      <table width="90%" border="0"  align="center" cellpadding="0" cellspacing="0" id="advanced-table" style="display:none;">
        <tr>
          <td class="label">关键词:</td>
          <td ><textarea name="topic_keywords" id="topic_keywords" cols="40" rows="3">{$topic.keywords}</textarea>
          </td>
        </tr>
        <tr>
          <td class="label">描述信息:</td>
          <td ><textarea name="topic_description" id="topic_description" cols="40" rows="5">{$topic.description}</textarea>
            <div> <a href="javascript:chanageSize(3,'topic_description');">[+]</a> <a href="javascript:chanageSize(-3,'topic_description');">[-]</a> </div></td>
          </td>
        </tr>
          <tr>
          <td class="label"><a href="javascript:showNotice('noticeTemplateFile');" title="{$lang.form_notice}"><img src="images/notice.gif" width="16" height="16" border="0" alt="{$lang.form_notice}"></a>{$lang.template_file}</td>
          <td ><input name="topic_template_file" type="text" id="topic_template_file" value="{$topic.template}" size="40" />
          <span class="notice-span" id="noticeTemplateFile">{$lang.notice_template_file}</span></td>
        </tr>
        <tr>
          <td class="label"><a href="javascript:showNotice('noticeCss');" title="{$lang.form_notice}"><img src="images/notice.gif" width="16" height="16" border="0" alt="{$lang.form_notice}"></a>{$lang.style_sheet}</td>
          <td ><textarea name="topic_css" id="topic_css" cols="40" rows="5">{$topic.css}</textarea>
            <span class="notice-span" id="noticeCss">{$lang.notice_css}</span>
            <div> <a href="javascript:chanageSize(3,'topic_css');">[+]</a> <a href="javascript:chanageSize(-3,'topic_css');">[-]</a> </div></td>
        </tr>
      </table>
后台管理PHP文件topic.php
    //echo $data;
    //exit;
    if ($is_insert)
    {
        $sql = "INSERT INTO " . $ecs->table('topic') . " (title,start_time,end_time,data,intro,template,css,keywords,description)" .
                "VALUES ('$_POST[topic_name]','$start_time','$end_time','$data','$_POST[topic_intro]','$_POST[topic_template_file]','$_POST[topic_css]','$_POST[topic_keywords]','$_POST[topic_description]')";
    }
    else
    {
        $sql = "UPDATE " . $ecs->table('topic') .
                "SET title='$_POST[topic_name]',start_time='$start_time',end_time='$end_time',data='$data',intro='$_POST[topic_intro]',template='$_POST[topic_template_file]',css='$_POST[topic_css]',keywords='$_POST[topic_keywords]',description='$_POST[topic_description]'" .
               " WHERE topic_id='$topic_id' LIMIT 1";
    }
 
数据库 _topic

 
根目录topic.php中找到“/* 模板赋值 */”在下面添加如下代码
$smarty->assign('keywords', htmlspecialchars($topic['keywords']));
$smarty->assign('description', htmlspecialchars($topic['description']));
 
 
 
 
 
View Code

分级显示会员价格

EcShop开发手册_使用教程EcShop开发手册_php_02
<!-- {foreach from=$rank_prices item=rank_price key=key} 会员等级对应的价格-->
    <!-- {if $key eq $smarty.session.user_rank} -->
        {$rank_price.rank_name}:</strong>
        <span class="vip">{$rank_price.price}</span>

        <!-- {/if} -->
    <!--{/foreach}-->
View Code

分析ecshop中ur_here.lbi的原理

EcShop开发手册_使用教程EcShop开发手册_php_02
cshop中,ur_here.lbi都是用来处理ecshop系统导航的.ecshop导航的所有规则,都是通过他来处理的。 ecshop中的导航栏目,都是通过id或者是url规则,来动态生成的。而ecshop模板中的ur_here.lb

    ecshop中,ur_here.lbi都是用来处理ecshop系统导航的.ecshop导航的所有规则,都是通过他来处理的。
 ecshop中的导航栏目,都是通过id或者是url规则,来动态生成的。而ecshop模板中的ur_here.lbi就是负责来显示该操作栏目的.
 打开includes/lib_main.php中的assign_ur_here(). $page_title = $GLOBALS['_CFG']['shop_title'] . ' - ' . 'Powered by ECShop';是用来处理ecshop页面标题的,而$ur_here    = '<a href=".">' . $GLOBALS['_LANG']['home'] . '</a>';却是用来处理操作栏目的。
  $cur_url = basename(PHP_SELF);
    if (intval($GLOBALS['_CFG']['rewrite']))
    {
        $filename = strpos($cur_url,'-') ? substr($cur_url, 0, strpos($cur_url,'-')) : substr($cur_url, 0, -4);
    }
    else
    {
        $filename = substr($cur_url, 0, -4);
    }
 作用是来取得文件名称的前缀的。比如index.php.则返回index.而通过他,可以取得对应语言好里面的语言文字信息,也可以灵活对他的url进行处理.如果是有分类的,他可以循环的读出他子类的url.
   if (!empty($cat_arr))
            {
                krsort($cat_arr);
                foreach ($cat_arr AS $val)
                {
                    $page_title = htmlspecialchars($val['cat_name']) . '_' . $page_title;
                    $args       = array($key => $val['cat_id']);
                    $ur_here   .= ' <code>&gt;</code> <a href="' . build_uri($type, $args, $val['cat_name']) . '">' .
                                    htmlspecialchars($val['cat_name']) . '</a>';
                }
            }
View Code

模板引擎实例

EcShop开发手册_使用教程EcShop开发手册_php_02
比如 程序里面引用的最新商品模块 对应的库文件是:recomment_new.lbi
在php文件中 通过smarty赋值 new_goods 后 在 对于的模板文件中 只需要应用对应的值即可
这是最新商品的 库文件 其实 我们去掉 div标签后 还原最简单的代码
{foreach from=$new_goods item=goods}
{$goods.url} ======== 商品的链接
{$goods.thumb} ======== 商品的缩略图
{$goods.short_style_name} ======== 商品的名称
{$goods.promote_price} ======== 商品促销价格
{$goods.shop_price} ======== 商品正式销售价格
{/foreach}
其实 简化的smarty模板引擎 比较简单 具体的 可以参考 smarty手册
View Code

判断用户是否登录

EcShop开发手册_使用教程EcShop开发手册_php_02
<!--如果会员登陆了{if $smarty.session.user_name}--

<!--{/if}-->
View Code

限定名称长度

truncate:10

在 ecshop 首页调用分类下面的商品属性

EcShop开发手册_使用教程EcShop开发手册_php_02
在index.php中添加
 $smarty->assign('filter_attr_list',  filter_attr_list(2,''));   //2为大分类ID

function filter_attr_list($cat_id,$filter_attr='')
{
$cat = get_cat_info($cat_id);
$cat_id=$cat[cat_id];
$children = get_children($cat_id);
// $cat['filter_attr']=$filter_attr;  ouyangyong
        $cat_filter_attr = explode(',', $cat['filter_attr']);       //提取出此分类的筛选属性
        $all_attr_list = array();


     foreach ($cat_filter_attr AS $key => $value)
        {      $sql = "SELECT a.attr_name,a.attr_id FROM " . $GLOBALS['ecs']->table('attribute') . " AS a, " . 
$GLOBALS['ecs']->table('goods_attr') . " AS ga, " . 
$GLOBALS['ecs']->table('goods') . " AS g WHERE ($children OR " . get_extension_goods($children) . ") AND a.attr_id = ga.attr_id AND g.goods_id = ga.goods_id AND g.is_delete = 0 AND g.is_on_sale = 1 AND g.is_alone_sale = 1 AND a.attr_id='$value'";
            if($temp_name = $GLOBALS['db']->getRow($sql))
            {
                $all_attr_list[$key]['filter_attr_name'] = $temp_name['attr_name'];
$all_attr_list[$key]['filter_attr_id'] = $temp_name['attr_id'];

                $sql = "SELECT a.attr_id, MIN(a.goods_attr_id ) AS goods_id, a.attr_value AS attr_value FROM " . $GLOBALS['ecs']->table('goods_attr') . " AS a, " . $GLOBALS['ecs']->table('goods') .
                       " AS g" .
                       " WHERE ($children OR " . get_extension_goods($children) . ') AND g.goods_id = a.goods_id AND g.is_delete = 0 AND g.is_on_sale = 1 AND g.is_alone_sale = 1 '.
                       " AND a.attr_id='$value' ".
                       " GROUP BY a.attr_value";

                $attr_list = $GLOBALS['db']->getAll($sql);
                $temp_arrt_url_arrcc = array();

                for ($i = 0; $i < count($cat_filter_attr); $i++)        //获取当前url中已选择属性的值,并保留在数组中
                {
                    $temp_arrt_url_arrc[$i] =  0;
                }

                $temp_arrt_url_arrc[$key] = 0;                           //“全部”的信息生成
                $temp_arrt_url = implode('.', $temp_arrt_url_arrc);
                $all_attr_list[$key]['attr_list'][0]['attr_value'] = '全部';  //$_LANG['all_attribute'];
                $all_attr_list[$key]['attr_list'][0]['url'] = build_uri('category', array('cid'=>$cat_id, 'bid'=>$brand, 'price_min'=>$price_min, 'price_max'=>$price_max, 'filter_attr'=>$temp_arrt_url), $cat['cat_name']);
                $all_attr_list[$key]['attr_list'][0]['selected'] = empty($filter_attr[$key]) ? 1 : 0;

                foreach ($attr_list as $k => $v)
                {  
                    $temp_key = $k + 1;
                    $temp_arrt_url_arrc[$key] = $v['goods_id'];       //为url中代表当前筛选属性的位置变量赋值,并生成以‘.’分隔的筛选属性字符串
                    $temp_arrt_url = implode('.', $temp_arrt_url_arrc);

                    $all_attr_list[$key]['attr_list'][$temp_key]['attr_value'] = $v['attr_value'];
                    $all_attr_list[$key]['attr_list'][$temp_key]['url'] = build_uri('category', array('cid'=>$cat_id, 'bid'=>$brand, 'price_min'=>$price_min, 'price_max'=>$price_max, 'filter_attr'=>$temp_arrt_url), $cat['cat_name']);

                    if (!empty($filter_attr[$key]) AND $filter_attr[$key] == $v['goods_id'])
                    {
                        $all_attr_list[$key]['attr_list'][$temp_key]['selected'] = 1;
                    }
                    else
                    {
                        $all_attr_list[$key]['attr_list'][$temp_key]['selected'] = 0;
                    }
                }
            }


        }
return $all_attr_list;
}


在index.dwt相应的位置添加。

<!--组合搜索 开始--> 
<!--{if $brands.1 || $price_grade.1 || $filter_attr_list}-->
<div><img src="images/artt_top1.gif"></div>
<div class="indexscreeBox">
<ul>
<!--{foreach from=$filter_attr_list item=filter_attr}-->
<li> <strong>{$filter_attr.filter_attr_name|escape:html}:</strong>
<!--{foreach from=$filter_attr.attr_list item=attr}--> 
<!-- {if $attr.selected} --> 
<span>{$attr.attr_value}</span> 
<!-- {else} --> 
<a href="{$attr.url}">{$attr.attr_value}</a>
<!-- {/if} --> 
<!--{/foreach}--> 
<div class="clear"></div>
</li>
<!--{/foreach}--> 
</ul>
</div>
<div><img src="images/artt_bottom1.gif"></div>
<div class="blank5"></div>
<!-- {/if} --> 
<!--组合搜索 结束--> 


效果。
View Code

foreach

EcShop开发手册_使用教程EcShop开发手册_php_02
{foreach},{foreachelse} {foreach} 用于像循环访问一个数字索引数组一样循环访问一个关联数组,与仅能访问数字索引数组的{section}不同,{foreach}的语法比 {section}的语法简单得多,但是作为一个折衷方案也仅能用于单个数组。每个{foreach}标记必须与关闭标记{/foreach}成对出现。 属性 1、from 类型:array数组 必要性:Yes必要 默认值:n/a 描述:循环访问的数组 2、item 类型:string字符串 必要性:Yes必要 默认值:n/a 描述:当前元素的变量名 3、key 类型:string字符串 必要性:No可选 默认值:n/a 描述:当前键名的变量名 4、name 类型:string字符串 必要性:No可选 默认值:n/a 描述:用于访问foreach属性的foreach循环的名称 from 和item是必要属性 {foreach}循环的name可以是任何字母,数组,下划线的组合,参考PHP变量。 {foreach}循环可以嵌套,嵌套的{foreach}的名称应当互不相同。 from属性通常是值数组,被用于判断{foreach}的循环次数。 在from 变量中没有值时,将执行{foreachelse}。 {foreach}循环也有自身属性的变量,可以通过 {$smarty.foreach.name.property}访问,其中"name"是name属性。 注意:name属性仅在需要访问 {foreach}属性时有效,与{section}不同。访问未定义name的{foreach}属性不会抛出一个错误,但将导致不可预知的结果。 {foreach} 属性有index, iteration, first, last, show, total. 示例: 例一. item属性 assign('myArray', $arr); ?> 用模板以无序列表输出$myArray

{foreach from=$myArray item=foo}
{$foo}
{/foreach}
上例将输出:

1000
1001
1002
例二. 演示item和key属性 'Tennis', 3 => 'Swimming', 8 => 'Coding'); $smarty->assign('myArray', $arr); ?> 用模板按键名/键值对的形式输出$myArray, 类似于PHP的foreach。

{foreach from=$myArray key=k item=v}
{$k}: {$v}
{/foreach}
上例将输出:

9: Tennis
3: Swimming
8: Coding
例三. {foreach}的item属性是关联数组 array('no' => 2456, 'label' => 'Salad'), 96 => array('no' => 4889, 'label' => 'Cream') ); $smarty->assign('items', $items_list); ?> 模板中,url通过$myId输出$items

{foreach from=$items key=myId item=i}
{$i.no}: {$i.label}
{/foreach}
上例将输出:

2456: Salad
4889: Cream
例四. {foreach}使用嵌套的item和key 向Smarty 设置一个数组,对于每个键名对应的每个循环值都包括键。 assign('contacts', array( array('phone' => '1', 'fax' => '2', 'cell' => '3'), array('phone' => '555-4444', 'fax' => '555-3333', 'cell' => '760-1234') )); ?> 用于输出$contact的模板。 {foreach name=outer item=contact from=$contacts}

{foreach key=key item=item from=$contact} {$key}: {$item}
{/foreach} {/foreach} 上例将输出:

phone: 1
fax: 2
cell: 3

phone: 555-4444
fax: 555-3333
cell: 760-1234
例五. 使用{foreachelse}的数据库示例 一个数据库(例如PEAR或ADODB)的搜索脚本示例, assign('results', $db->getAssoc($sql) ); ?> 借助{foreachelse}标记在没有结果时模板输出"None found"字样。 {foreach key=cid item=con from=$results} {$con.name} - {$con.nick} 
{foreachelse} No items were found in the search {/foreach} .index包含当前数组索引,从零开始。 例六. index示例 {* 每五行输出一次头部区块 *}

{foreach from=$items key=myId item=i name=foo} {if $smarty.foreach.foo.index % 5 == 0} {/if} {/foreach}
Title
{$i.label}
iteration包含当前循环次数,与index不同,从1开始,每次循环增长1。 例七. iteration和index示例 {* this will output 0|1, 1|2, 2|3, ... etc *} {* 该例将输出0|1, 1|2, 2|3, ... 等等 *} {foreach from=$myArray item=i name=foo} {$smarty.foreach.foo.index}|{$smarty.foreach.foo.iteration}, {/foreach} first在当前{foreach}循环处于初始位置时值为TRUE。 例八. first属性示例 {* 对于第一个条目显示LATEST而不是id *}

{foreach from=$items key=myId item=i name=foo} {/foreach}
{if $smarty.foreach.foo.first}LATEST{else}{$myId}{/if}    {$i.label}
last在当前{foreach}循环处于最终位置是值为TRUE。 例九. last属性示例 {* 在列表结束时增加一个水平标记 *}) {foreach from=$items key=part_id item=prod name=products} {$prod} {if $smarty.foreach.products.last}

{else},{/if} {foreachelse} ... content ... {/foreach} show是{foreach}的参数. show是一个布尔值。如果值为FALSE,{foreach}将不被显示。如果有对应的{foreachelse},将被显示。 total包括 {foreach}将循环的次数,既可以在{foreach}中使用,也可以在之后使用。 例十. total属性示例 {* 在结束位置显示行数 *} {foreach from=$items key=part_id item=prod name=foo} {$prod.name>

{if $smarty.foreach.foo.last}

{$smarty.foreach.foo.total} items
{/if} {foreachelse} ... something else ... {/foreach} 问题 {foreach from=$custid item=curr_id key=num} {if num is odd} 干啥 {else} 干其他的 {/if} {/foreach} 与以下的代码的区别,odd和enen的意义? {foreach from=$custid item=curr_id key=num} {if num%2==0} 干啥 {else} 干其他的 {/if} {/foreach}
View Code

onclick

EcShop开发手册_使用教程EcShop开发手册_php_02
onclick="this.className='current'"
View Code

ECSHOP商品属性,商品分类,商品类型,商品筛选,商品描述,商品图片,商品列表,商品管理使用教程

文章标题

教程类别

添加日期

浏览量

ECSHOP商品批量导出,ECSHOP商品数据包制作导出

ECSHOP使用教程

2013-10-26

2892

ECSHOP商品图片批量处理,ECSHOP商品缩略图片模糊处理教程

ECSHOP使用教程

2013-10-26

2496

ECSHOP虚拟商品,ECSHOP商品虚拟卡

ECSHOP使用教程

2013-10-26

1912

ECSHOP标签列表,ECSHOP商品标签管理

ECSHOP使用教程

2013-10-26

2097

ECSHOP商品品牌,ECSHOP商品品牌图片添加设置

ECSHOP使用教程

2013-10-26

2230

ECSHOP添加新商品,ECSHOP商品描述

ECSHOP使用教程

2013-10-26

3754

ECSHOP商品分类,ECSHOP商品分类编辑

ECSHOP使用教程

2013-10-26

3244

ECSHOP商品属性,ECSHOP商品属性筛选

ECSHOP使用教程

2013-10-26

4068

ECSHOP商品类型,ECSHOP商品属性类型

ECSHOP使用教程

2013-10-26

2768

ECSHOP商品批量上传,ECSHOP商品数据包导入

ECSHOP使用教程

2013-10-26

6990

ECSHOP商品自动上下架,ECSHOP商品批量下架上架

ECSHOP使用教程

2013-10-26

2591

ECSHOP更改加密串,ECSHOP商品虚拟卡加密串

ECSHOP使用教程

2013-10-25

1639

ECSHOP生成商品代码,ECSHOP商品推广代码

ECSHOP使用教程

2013-10-25

1656

ECSHOP商品批量修改,ECSHOP商品描述修改

ECSHOP使用教程

2013-10-25

2012

ECSHOP商品回收站,ECSHOP商品批量删除

ECSHOP使用教程

2013-10-25

3778

ECSHOP用户评论,ECSHOP商品用户评论

ECSHOP使用教程

2013-10-25

2528

ECSHOP商品列表,ECSHOP后台商品列表管理

ECSHOP使用教程

2013-10-25

1910

EcShop开发手册_管理程序_45