EcShop开发手册
Ecshop文件结构
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 的目录
ECShop的库项目功能
认识一下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的心情
ecshop 实现全站调用购物车功能
此功能是根据网友提供的方法,然后自己实际操作后发现了一些问题,更改了部分代码,完美了一些,下面的代码都贴出来了
今天给一朋友解决一个问题,需要在商城每个页面中的购物车处都显示购物车详情!其实,这个功能很简单,现在很多商城都在用(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中的代码中就行了。 到此,大功告成!!
ECSHOP换KindEditor编辑器
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,至此结束,看看效果吧!
ECSHOP所有页面分类树显示全部的方法,所有页面分类树显示全部的方法
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'"; }
Ecshop 团购列表增加市场价、团购价、为您节省、倒计时等!
曾经求助过此方法,结果运气很好,有一位高手加我无偿为我解决了此问题,非常感谢!经过我俩几天的调试,目前只有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;
}
?>
Ecshop后台fckeditor上传图片路径修改和重命名上传图片
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; //
return $sNewFileName ;
}
ecshop促销时间倒计时效果
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="data: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} -->
ecshop开发之如何实现团购网的倒计时功能
首先,你需要在购买的时候,提示输入框,告诉用户,你必须购买多少.其次,购物车中需要修改购买数量的时候,你也需要控制。
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="data:images/but_buy.jpg"></a>
<a href="javascript:;" id="compareLink"quotes"}','{$goods.type}')"><img src="data: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="data:images/but_buy.jpg"></a></form>
最后完成了购买数量的控制。
ecshop首页促销商品倒计时效果
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="data: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} -->
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布局代码...............
<!--{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} -->
ecshop添加自定义导航
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} -->
显示导航内容。 前台效果
ecshop怎么得到商品属性的值
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。
ecshop增加pc扫描二维码微信支付功能代码
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="data: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
更多安全信息和详细信息就不列举了
ecshop专题页面添加关键词_描述
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="data: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="data: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']));
分级显示会员价格
<!-- {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}-->
分析ecshop中ur_here.lbi的原理
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>></code> <a href="' . build_uri($type, $args, $val['cat_name']) . '">' .
htmlspecialchars($val['cat_name']) . '</a>';
}
}
模板引擎实例
比如 程序里面引用的最新商品模块 对应的库文件是: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手册
判断用户是否登录
<!--如果会员登陆了{if $smarty.session.user_name}-- <!--{/if}-->
限定名称长度
truncate:10
在 ecshop 首页调用分类下面的商品属性
在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="data: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="data:images/artt_bottom1.gif"></div>
<div class="blank5"></div>
<!-- {/if} -->
<!--组合搜索 结束--> 效果。
foreach
{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}
onclick
onclick="this.className='current'"
ECSHOP商品属性,商品分类,商品类型,商品筛选,商品描述,商品图片,商品列表,商品管理使用教程
文章标题 |
教程类别 |
添加日期 |
浏览量 |
2013-10-26 |
2892 |
||
2013-10-26 |
2496 |
||
2013-10-26 |
1912 |
||
2013-10-26 |
2097 |
||
2013-10-26 |
2230 |
||
2013-10-26 |
3754 |
||
2013-10-26 |
3244 |
||
2013-10-26 |
4068 |
||
2013-10-26 |
2768 |
||
2013-10-26 |
6990 |
||
2013-10-26 |
2591 |
||
2013-10-25 |
1639 |
||
2013-10-25 |
1656 |
||
2013-10-25 |
2012 |
||
2013-10-25 |
3778 |
||
2013-10-25 |
2528 |
||
2013-10-25 |
1910 |
EcShop开发手册的更多相关文章
- ecshop在线手册前言及程序结构
该在线手册是有模版堂转载而来:仅供参考 一.前言 为什么我们ecshop模板堂要重制ecshop在线手册呢?因为目前网上的一些教程有些是比较老的,有些是不全面的,官方的手册也已经很久没有更 新,很多刚 ...
- Net力软快速信息化系统开发框架 + 开发手册+数据库说明
源码目录结构说明LeaRun.Cache –缓存层LeaRun.Resource –本地语言LeaRun.Utilities –公共类库LeaRun.DataAccess –数据库访问核心组件LeaR ...
- 在线教学、视频会议 Webus Fox(2) 服务端开发手册
上次在<在线教学.视频会议软件 Webus Fox(1)文本.语音.视频聊天及电子白板基本用法>里介绍了软件的基本用法.本文主要介绍服务器端如何配置.开发. 1. 配置 1.1 IIS配置 ...
- 在线教学、视频会议 Webus Fox(3) 客户端开发手册
本文主要介绍webus fox 客户端的配置及接口说明. 1. 文件列表和配置 1.1 文件列表 1.2 common.xml 配置 根据服务器端的部署, 替换[ServerUrl] , [RtmpP ...
- Navi.Soft30.开放平台.聚合.开发手册
1系统简介 1.1功能简述 现在是一个信息时代,并且正在高速发展.以前获取信息的途径非常少,可能只有电视台,收音机等有限的来源,而现在的途径数不胜数,如:QQ,微信,官方网站,个人网站等等 本开发手册 ...
- Navi.Soft30.开放平台.腾讯.开发手册
1系统简介 1.1功能简述 现在是一个信息时代,并且正在高速发展.以前获取信息的途径非常少,可能只有电视台,收音机等有限的来源,而现在的途径数不胜数,如:QQ,微信,官方网站,个人网站等等 本开发手册 ...
- Navi.Soft30.开放平台.百度.开发手册
1系统简介 1.1功能简述 现在是一个信息时代,并且正在高速发展.以前获取信息的途径非常少,可能只有电视台,收音机等有限的来源,而现在的途径数不胜数,如:QQ,微信,官方网站,个人网站等等 本开发手册 ...
- Navi.Soft30.框架.WinForm.开发手册
阅读导航 Navi.Soft30.Core类库.开发手册 http://www.cnblogs.com/xiyang1011/p/5709489.html Navi.Soft30.框架.WinForm ...
- Discuz!开发手册
如何使用Discuz开发手册? 1.首先建议你了解Discuz目录结构-全局篇 通过对目录结构的了解,会在以后的创作道路上提供坚实的基础! 2.你还需要了解Discuz! X3.1数据字典 3.创建自 ...
随机推荐
- Spring数据库主从分离
1.spring+spring mvc +mybatis+druid 实现数据库主从分离 2.Spring+MyBatis主从读写分离 3.MyCat痛点 4.Spring+MyBatis实现数据库读 ...
- 一台 Java 服务器可以跑多少个线程?
一台Java服务器能跑多少个线程? 这个问题来自一次线上报警如下图,超过了我们的配置阈值. 京东自研UMP监控分析 打出jstack文件,通过IBM Thread and Monitor Dump A ...
- QQ音乐爬虫
#今日目标 **QQ音乐爬虫** 今天要爬取的是QQ音乐任意歌手的所有音乐歌词,因为笔者是周杰伦的忠实粉丝,所以专门写了个爬虫来爬取他的音乐的歌词,因为他的音乐在咪咕音乐可以听,所以便没有去爬取. 好 ...
- 解析Nuxt.js Vue服务端渲染摸索
本篇文章主要介绍了详解Nuxt.js Vue服务端渲染摸索,写的十分的全面细致,具有一定的参考价值,对此有需要的朋友可以参考学习下.如有不足之处,欢迎批评指正. Nuxt.js 十分简单易用.一个简单 ...
- Linux文档整理之【Jenkins+Docker自动化部署.Net Core】
这次整理的文档是Jenkins+Docker实现自动化部署,很早之前就写的,今天有时间就搬到博客园做个记录. Jenkins是基于Java开发的一种持续集成工具,主要用于持续.自动的构建/测试软件等相 ...
- springboot导包spring-boot-starter-parent出现错误
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot ...
- 53道Java线程面试题
53道Java线程面试题 下面是Java线程相关的热门面试题,你可以用它来好好准备面试. 1) 什么是线程? 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位.程序 ...
- java面试01-网络知识
1.网络七层协议 第一层:物理层 机械.电子.定时接口通信信道上的原始比特流传输 第二层:数据链路层 物理寻址,同时将原始比特流转变为逻辑传输线路 第三层:网络层 控制子网的运行‘如逻辑编址.分组传输 ...
- Codeforces 899 1-N两非空集合最小差 末尾最多9对数计算 pair/链表加优先队列最少次数清空
A /*Huyyt*/ #include<bits/stdc++.h> #define mem(a,b) memset(a,b,sizeof(a)) #define pb push_bac ...
- Android仿支付宝扣款顺序,动态改变ListView各Item次序
前言:今天遇到个需求,需要让用户动态选择语音传输方式的次序,突然想起支付宝选择扣款顺序的功能,恰好能满足需要,就花了点时间写了个demo,在此权当学习记录 先上效果图 支付宝的效果 demo的效果 思 ...