专注ECSHOP第九年
始自2007,服务二千多商户,不断为您增光溢彩

阿牛Ecshop二次开发-模板标签yw_assign获取单篇文章与文章列表

阿牛阅读(930)

Ecshop二次开发 经常需要调用数据库数据,为了方便开发人员调用,我们为其增加了 {yw_assign} 用于调用系统数据。本文主要讲解如何使用此标签调用相应的文章与文章列表。

 1.  调用一篇文章{yw_assign type=art id={文章ID} var={变量名}}

调用一篇文章变量的写法是:{yw_assign type=art id={文章ID} var={变量名}}

参数说明:

  • type :替换内容的类型 art 文章类型,标明要调去一篇文章并替换为文章变量。
  • id      : 文章ID要调去的文章ID,从后台中查看。
  • var   : 调用变量所使用的变量名。当前页面中不能重复。

返回变量:

  • .id                : 文章ID
  • .short_title  : 截取后的标题 eg. 12月15日全场大促…
  • .title             : 完整标题 eg.12月15日全场大促说明
  • .content       : 文章内容
  • .url               : 文章链接地址。
  • .file_url       : 文章附件路径。
  • .add_time   :  添加时间  eg. 2013-10-24
  • .file_url       :  文章附件路径。
  • .cat_name   : 所属分类名称
  • .cat_url       : 所属分类的链接地址。

 

例子:假设要调用一篇章的内容作为所有商品的售后说明,见下图:

 

Ecshop二次开发调用文章Ecshop二次开发调用文章
 假设文章的ID为:18,那么使用的标签是:
{yw_assign type=art id=18 var=goods_shouhou}
{$goods_shouhou.content}

2. 调用分类下的文章{yw_assign type=art_list id={分类ID} var={变量名} num={数量}}

调用一篇指定分类下文章变量的写法是:{yw_assign type=art_list id={文章ID} var={变量名} num={数量}}

参数说明:

  • id            : 文章分类ID 见网站后台《文章分类管理》
  • var          : 替换的变量名。
  • num        : 取出文章的数量。

返回变量说明:

  • .id                : 文章ID
  • .short_title  : 截取后的标题 eg. 12月15日全场大促…
  • .title             : 完整标题 eg.12月15日全场大促说明
  • .url               : 文章链接地址。
  • .file_url       : 文章附件路径。
  • .add_time   :  添加时间  eg. 2013-10-24
  • .file_url       :  文章附件路径。
  • .cat_name   : 所属分类名称
  • .cat_url       : 所属分类的链接地址。

返回变量的参数和type=art基本相同,唯一的不同是没有.content的获取。用于最新文章的制作。

假设要获取的文章分类的ID是18的话:如下调用:
{yw_assign type=art_list id=18 var=new_arts_18}
{if $new_arts_18}
<ul>
{foreach from=$new_arts_18 item=art}
  <li><a href="/{$art.url}" title="{$art.title}">{$art.short_title}</li>
{/foreach}
</ul>
{/if}

 

Ecshop 快速添加后台菜单详细图文-ecshop教程

阿牛阅读(1670)

Ecshop二次开发中经常需要再后台添加新的功能呢,这时就需要添加后台菜单。添加后台管理菜单需要修改四个文件:inc_menu.php,inc_priv.php,priv_action.php,common.php

比如后台添加购物卡菜单 举例说明:

 

第一,Ecshop后台管理admin\includes\inc_menu.php添加你要添加的功能。

打开文件如下面代码:

 

后台添加菜单inc_menu.php代码

 

第二,Ecshop后台管理admin\includes\inc_priv.php要对应 inc_menu.php添加的功能

参照第一步添加功能打开文件如:

 

后台添加菜单inc_priv,php代码

 

第三,前台语言包languages\zh_cn\admin\priv_action.php 添加语言。

配置好上面两步骤,添加语言如:

 

后台添加priv_action.php代码

 

第四,在languages\zh_cn\admin\common.php文件中增加一变量$_LANG[‘shop_card.php’]  =’xxxx’。

如下代码:

 

后台添加菜单common.php代码

 

权限分配完毕,可是在权限分配面板里,却没有看到购物卡管理的权限。

现在还需要在数据库esc_admin_action这个表里添加一些内容。

如图:

 

后台添加菜单数据库esc_admin_action表

 

parent_id就是所在菜单的id,当前的菜单是商品管理,而商品管理的菜单id是1,后台就是权限名了。

配置完成后 清理缓存,后台左侧管理菜单下会多出一个菜单。

 

后台添加菜单后台左侧管理菜单

后台添加菜单权限管理

 

PHP轻松实现谷歌短网址服务的API接口

阿牛阅读(919)

1 谷歌短网址API接口介绍

谷歌短网址(Google url shortener)页面是http://goo.gl/,官方API文档说明是:点击进入。同新浪短网址的API一样,谷歌短网址的API调用可以通过两种授权方式(Authentication)实现。正如文档中所提到的:Every request your application sends to the Google URL Shortener API needs to identify your application to Google. There are two ways to identify your application: using an OAuth 2.0 token (which also authorizes the request) and/or using the application’s API key.(你的应用向谷歌短网址API服务器所发送的每一个请求,都需要向Google提供合法证明。有如下两种渠道来识别你的应用:使用一个OAuth 2.0 token,或者使用应用的API KEY)。由于OAuth 2.0的认证过程相对麻烦,而且谷歌官方文档也说了“An API key is highly recommended”,所以这里就使用第二种API KEY来实现。

2 使用Google url shortener的API KEY来调用谷歌短网址API

Google url shortener的API KEY申请方式见《Google 开发者控制台Developers Console简单介绍以及API KEY的生成》。在获得了API KEY后就可以使用下面的代码来实现谷歌短网址的API接口调用了:

<?php
/**
* @author: vfhky 201403012 20:31
* @description: PHP调用谷歌短网址API接口
* @reference: http://goo.gl/Ro277L
* @param string $type: 非零整数代表长网址转短网址,0表示短网址转长网址
* @note: 长网址转短网址采用POST模式,短网址转长网址采用Get模式
*/
function ggUrlAPI($type,$url){
  if($type){
     /* The API key is safe for embedding in URLs; it doesn't need any encoding. */
     $key = 'AIzaSyBlRWs2M5c6a04l-YSDUpUKtlsvDK1hL1Q';//这是我申请的KEY,大家可以测试用
     $data = array('longUrl' => $url, 'key' => $key);
     /* requests containing JSON content bodies must be accompanied by a Content-Type: application/json request header */
     $post = json_encode($data);
     $baseurl = 'https://www.googleapis.com/urlshortener/v1/url';
  }
  else
     $baseurl = 'https://www.googleapis.com/urlshortener/v1/url?shortUrl='.$url;
  $ch = curl_init();
  curl_setopt($ch, CURLOPT_URL, $baseurl);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
  curl_setopt($ch, CURLOPT_HEADER, 0);
  if($type){
     curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-type:application/json'));
     curl_setopt($ch, CURLOPT_POST, 1);
     curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
  }
  $response = curl_exec($ch);
  $arrResponse = json_decode($response);
  curl_close($ch);
  return $arrResponse;
}
echo '谷歌短网址API接口测试结果: <br/> ';
echo 'Long to Short: ';
print_r(ggUrlAPI(1,'http://www.huangkeye.cn'));
echo '<br/><br/>';

echo 'Short to Long: ';
print_r(ggUrlAPI(0,'http://goo.gl/F90bfL'));
echo '<br/><br/>';
?>

 

3 要说明的地方1

PHP实现谷歌短网址服务的API接口调用

从上面的测试结果图片可以看出,“长转短”和“短转长”的返回的对象中的成员类似,“短转长”多了一个status成员而已。下面是json格式的视图:

/* 1短网址转长网址 */
{
  "kind": "urlshortener#url",
  "id": "http://goo.gl/F90bfL",
  "longUrl": "http://www.huangkeye.cn"
}

/* 2短网址转长网址 */
{
  "kind": "urlshortener#url",
  "id": "http://goo.gl/F90bfL",
  "longUrl": "http://www.huangkeye.cn",
  "status": "OK"
}

 

4 要说明的地方2

上面代码输出的是对象,大家可以直接输出里面的成员,例如输出“短转长”中返回的短网址和长网址

$result = ggUrlAPI(0,'http://goo.gl/F90bfL');
echo $result->id.$result->longUrl.'<br/><br/>';

 

5 错误响应Error responses

假如输入的数据有误或者其它原因造成接口返回错误数据,那么可以通过错误数据进行调试。谷歌短网址API返回的错误信息包括:a status code(状态码), a human readable message(人工可读的消息), and a list of error details(错误详细列表)。

{
"error": {
"errors": [
{
"domain": "global",
"reason": "required",
"message": "Required",
"locationType": "parameter",
"location": "resource.longUrl"
}
],
"code": 400,
"message": "Required"
}
}

 

如何修改ECSHOP后台路径[附图]

阿牛阅读(918)

ecshop如何修改后台admin路径?

大家都知道ecshop的默认后台是admin,这样会导致网站不安全,容易被黑客入侵。因为一般的黑客入侵都是从后台开始。

所以建议大家修改一下admin文件夹的名称

2.72,2.73版本的系统修改admin方法比较简单,修改方法如下:

 

1 。打开data/config.php,找到define(’ADMIN_PATH’,’admin’);

这里是定义后台目录的地方,把其中的admin换成你的后台自定义目录,如define(’ADMIN_PATH’,’adminks265‘);

79f0f736afc3793166ca3fb2eac4b74542a9118e

2。然后把根目录下的admin目录名称换成你修改的,如adminks265,到此即可.

以上几步即可完成后台路径修改!

注意: 后台的路径,不能有下划线,比如admin_ks265;不能用大写,比如ADMINKS265,否则后台登录口可以正常访问,但登录验证不了,进不了后台.

另外啰嗦一句:编辑程序,请勿使用记事本。

使用memcached 加速PHP 效率 !!

阿牛阅读(1020)

Windows 版的Memcached 目前最新应该是1.2.6 版,要安装Memcached 之前就先找个位置放好吧,例如D:\memcached,资料夹中至少要有memcached.exe,在部分系统中可能会出现找不到msvcr71.dll 的错误讯息,我已经将msvcr71.dll 一并放到memcached 压缩档中了,所以应该不会再出现这个错误讯息了,不过memcached 目前仍只有32 位元版,还好在64位元的Windows 上仍然可以正常执行。

接下来先安装memcached 成为系统服务,上面假设的路径是D:\memcached,所以输入指令如下:

D:\memcached\memcached.exe -d install

这样就安装程系统服务了,接下来启动memcached,指令如下:

D:\memcached\memcached.exe -d start

再来就是让PHP 载入php_memcache.dll,在那之前先看看php_info 中写的内容 :

fb5c81ed3a220004b71069645f11286720110427143943142

第3 行的Compiler 显示的是MSVC9,第4 行显示系统是64 位元的,所以这里就要找到VC9_64 位元版的php_memcache.dll,并将php_memcache.dll 放到PHP 资料夹中的ext 资料夹里,然后编辑php.ini 档,用搜寻的方式找到「extension=」,找到以后可以依英文字母顺序或在以extension= 开头的最后一行加入以下这一行:

extension=php_memcache.dll

如果是32 位元系统的话就要使用VC6,这个php_memcache.dll 还有分TS 及NTS,指的是N on T hread S afe,在我的系统上要用TS 的才能被成功载入。

接着重新启动Apache 伺服器让php_memcache.dll 被载入,然后再看看php_info 中有没有memcached 的讯息,如下图:

4a47a0db6e60853dedfcfdf08a5ca2492011042714394214473

如果可以在php_info 中看到上图讯息的话代表已经成功了喔~

如果所架的网站有快取系统可以设定,或者可以透过外挂(Plugin)让网站使用memcached 的话,就可以直接设定使用memcached 来快取,最上方所做的将memcached 安装成服务后,电脑就变成了memcached 快取伺服器了,预设使用的通讯埠是11211,如果设定中有相关设定的话,只要将伺服器IP 设定为127.0.0.1,通讯埠设为11211 即可开始使用memcached 来做快取了。

彻底解决ECSHOP一句话木马 断除WEBSHELL

阿牛阅读(1800)

总体来讲,对php webshell和一句话木马的查杀,主要从三个方面进行
1.Shell特征
2.PHP安全方面的函数和变量 以及安全配置选项
3.语法检测

首先,基于Shell特征,此方法主要针对base64_decode编码与gzinflate等参考特征库与匹配算法:Web Shell Detector v1.51,当前共有296个特征https://github.com/emposha/PHP-Shell-Detector/zipball/master可同时参考其他开源软件特征库
其次,对涉及PHP安全方面的函数和安全配置选项进行了归类,参照了很多文章,博客以及开源工具,在此表示感谢

1.include/require/require_once/include_once/file_get_contents //文件包含

2.exec/system/popen/passthru/proc_open/pcntl_exec/shell_exec/curl_exec/curl_multi_exec/“/escapeshellcmd/pcntl_exec //系统命令执行

3.eval/preg_replace/assert/call_user_func/call_user_func_array/create_function/ob_start/array_map //代码执行

4._GET/_POST/_COOKIE/_SERVER/_REQUEST/_ENV/GLOBALS/php://input/getenv/ //数据传递

5. session/cookie

6. extract/parse_str/mb_parse_str/import_request_variables/unserialize

7.copy/rmdir/chmod/delete/fwrite/fopen/readfile/fpassthru/move_uploaded_file/file_put_contents/unlink/upload/opendir/fgetc/fgets/ftruncate/fputs/fputcs //文件操作

8.select/insert/update/delete/order by/group by/limit/in(/stripslashes/urldecode //数据库操作

9.confirm_phpdoc_compiled/mssql_pconnect/mssql_connect/crack_opendict/snmpget/ibase_connect

10.echo/print/printf/vprintf/document.write/document.innerHTML/document.innerHtmlText

11.phpinfo/highlight_file/show_source/parse_ini_file //敏感信息,源代码泄露

12.iconv/mb_convert_encoding13.base64_decode, gzinflate, gzuncompress, gzdecode, str_rot13 //代码加密
其他:

usort(), uasort(), uksort()

array_filter()

array_reduce()

array_diff_uassoc(), array_diff_ukey()

array_udiff(), array_udiff_assoc(), array_udiff_uassoc()

array_intersect_assoc(), array_intersect_uassoc()

array_uintersect(), array_uintersect_assoc(), array_uintersect_uassoc()

array_walk(), array_walk_recursive()

xml_set_character_data_handler()

xml_set_default_handler()

xml_set_element_handler()

xml_set_end_namespace_decl_handler()

xml_set_external_entity_ref_handler()

xml_set_notation_decl_handler()

xml_set_processing_instruction_handler()

xml_set_start_namespace_decl_handler()

xml_set_unparsed_entity_decl_handler()

stream_filter_register()

set_error_handler()

register_shutdown_function()

register_tick_function()
附带php.ini中涉及安全配置选项。

safe_mode = off ( a lot of shit cannot be done with this on )

disabled_functions = N/A ( no one,we want all )

register_globals = on ( we can set variables by request )

allow_url_include = on ( for lfi/rfi )

allow_url_fopen = on ( for lfi/rfi )

magic_quotes_gpc = off ( this will escape ‘ ” \ and NUL’s with a backslash and we don’t want that )short_tag_open = on ( some scripts are using short tags,better on )

file_uploads = on ( we want to upload )

display_errors = on ( we want to see the script errors,maybe some undeclared variables? )

open_basedir 限制访问目录

display_errors = off 显示错误信息

auto_prepend_file = on 在每个页面之前被载入

auto_append_file = on 在每个页面之后被载入

HP一句话后门可谓五脏俱全,一不小心您肯定中招了,而我们今天这篇文章的重中之重在哪呢?重点就在下边的总结!

如何应对PHP一句话后门

我们强调几个关键点,看这文章的你相信不是门外汉,我也就不啰嗦了:

  • 对PHP程序编写要有安全意识
  • 服务器日志文件要经常看,经常备份
  • 对每个站点进行严格的权限分配
  • 对动态文件及目录经常批量安全审查
  • 学会如何进行手工杀毒《即行为判断查杀》
  • 时刻关注,或渗入活跃的网络安全营地
  • 对服务器环境层级化处理,哪怕一个函数也可做规则

阿牛认为当管理的站点多了,数据量大时,我们应合理应用一些辅助工具,但不应完全依赖这些工具,技术是时刻在更新进步的,最为重要的是你应学会和理解,编写这些强悍后门的人所处思维,角色上的换位可为你带来更大的进步。

文中所列后门中如涉及版权问题,要强调的是这类后门无从查找原始出处,也无唯一性,如果你非要和我说某某是你原创的,请联系我,我会验证后在文中特别强调。我非常看重网络知识产权问题。

部分转载自某安全网

ECSHOP 常用功能之自定义广告调用

阿牛阅读(1642)

经常需要调用自定义广告,调用分类广告。方法整理如下:

/* 首页各分类广告图片 例如:部署在include/libcommon.php */
function get_adv($position) 
{ 
	$sql = "select ap.ad_width,ap.ad_height,ad.ad_id,ad.ad_name,ad.ad_code,ad.ad_link from ".$GLOBALS['ecs']->table('ad_position')." as ap left join ".$GLOBALS['ecs']->table('ad')." as ad on ad.position_id = ap.position_id where ap.position_name='".$position."' and ad.media_type=0 and UNIX_TIMESTAMP()>ad.start_time and UNIX_TIMESTAMP()<ad.end_time and ad.enabled=1 order by ad.ad_id desc limit 1"; 

	$res = $GLOBALS['db']->getRow($sql); 
	if($res) 
	{ 
		return  "<a href='affiche.php?ad_id=".$res['ad_id']."&uri=".$res['ad_link']."' target='_blank'><img src='data/afficheimg/".$res['ad_code']."' width='".$res['ad_width']."' height='".$res['ad_height']."' /></a>"; 
	} 
	else 
	{ 
		return ""; 
	} 
}

修改模板文件。(首页分类模板一般在/library/cat_goods.lbi)

 <div class="f_l"><?php $GLOBALS['smarty']->assign('index_cat_image', get_adv('首页-分类ID'.$GLOBALS['smarty']->_var['goods_cat']['id'].'-左边图片广告')); ?>{$index_cat_image}</div>

<div class="f_r"><?php $GLOBALS['smarty']->assign('index_cat_image', get_adv('首页-分类ID'.$GLOBALS['smarty']->_var['goods_cat']['id'].'-右边图片广告'));?> {$index_cat_image}</div>

注意:整理要说明的是:

后台,广告列表,添加广告。广告名称必须以固定格式存在。如“首页-分类ID-1-左边广告图片”,表示调用分类ID为1的广告图片。

其他广告以此类推。

 

Ecshop实现仿淘宝按地区显示运费

阿牛阅读(1607)

淘宝网(Taobao)购物的宝贝详情页面,可以针对不同地区显示不同运费,运费由后台设定;结算时间,按重量、件数计算运费。Ecshop本身有配送方式插件,已有多家物流公司插件,例如:顺丰快递、申通快递、圆通快递等。本文介绍如何实现按地区显示运费,并且让每个商品绑定运费模板。

     1、Ecshop后台配送方式创建

进入Ecshop后台”系统设置–>配送方式”,将“顺丰快递”改名称为“粮食快递”,配送ID号为6。

134700_6zWt_102350

134711_8Cck_102350

     2、商品绑定配送方式的运费模板

       2.1 数据表“ecs_goods”增加一个字段,执行下面SQL语句:

ALTER TABLE  `ecs_goods` ADD `shipping_id` MEDIUMINT(9) NOT NULL DEFAULT '6';

 

2.2 后台添加/编辑 商品 调出已经安装配送方式 “admin/ goods.php “,将此shipping_list函数添加到goods.php最末处。

/**
 * 取得已安装的配送方式
 * @return  array   已安装的配送方式
*/
function shipping_list()
{
    $sql = 'SELECT shipping_id, shipping_name ' .
            'FROM ' . $GLOBALS['ecs']->table('shipping') .
            ' WHERE enabled = 1';

    return $GLOBALS['db']->getAll($sql);
}

在代码前“$smarty->assign(‘unit_list’, get_unit_list());”增加调用代码

// LONGHTML 增加运费模板
$smarty->assign('shipping_list', shipping_list());
// END
$smarty->assign('unit_list', get_unit_list());

在“/* 处理商品数据 */”后面,增加POST过来的“shipping_id ”表单值进行赋值

/* 处理商品数据 */

// LONGHTML 运费模板(新增,更新)
$shipping_id = empty($_POST['shipping_id']) ? '0' : intval($_POST['shipping_id']);
// END

最后一步是“插入/更新”商品时,对“shipping_id”字段实现处理。直接替换掉下面代码

/* 入库 */
    if ($is_insert)
    {
        if ($code == '')
        {
            $sql = "INSERT INTO " . $ecs->table('goods') . " (goods_name, goods_name_style, goods_sn, " .
                    "cat_id, brand_id, shop_price, market_price, is_promote, promote_price, " .
                    "promote_start_date, promote_end_date, goods_img,  goods_thumb, original_img, keywords, goods_brief, " .
                    "seller_note, goods_weight, goods_number, warn_number, integral, give_integral, is_best, is_new, is_hot, " .
                    "is_on_sale, is_alone_sale, is_shipping, goods_desc, add_time, last_update, goods_type, rank_integral, suppliers_id, shipping_id)" .//注意这里增加了一个字段 shipping_id
                "VALUES ('$_POST[goods_name]', '$goods_name_style', '$goods_sn', '$catgory_id', " .
                    "'$brand_id', '$shop_price',  '$market_price', '$is_promote','$promote_price', ".
                    "'$promote_start_date', '$promote_end_date', '$goods_img', '$goods_thumb', '$original_img', ".
                    "'$_POST[keywords]', '$_POST[goods_brief]', '$_POST[seller_note]', '$goods_weight', '$goods_number',".
                    " '$warn_number', '$_POST[integral]', '$give_integral', '$is_best', '$is_new', '$is_hot', '$is_on_sale', '$is_alone_sale', $is_shipping, ".
                    " '$_POST[goods_desc]', '" . gmtime() . "', '". gmtime() ."', '$goods_type', '$rank_integral', '$suppliers_id',  '$shipping_id' )";//注意这里增加了字段 shiping_id  by uuecs.com
        }
        else
        {
            $sql = "INSERT INTO " . $ecs->table('goods') . " (goods_name, goods_name_style, goods_sn, " .
                    "cat_id, brand_id, shop_price,  market_price, is_promote, promote_price, " .
                    "promote_start_date, promote_end_date, goods_img, goods_thumb, original_img, keywords, goods_brief, " .
                    "seller_note, goods_weight, goods_number, warn_number, integral, give_integral, is_best, is_new, is_hot, is_real, " .
                    "is_on_sale, is_alone_sale, is_shipping, goods_desc, add_time, last_update, goods_type, extension_code, rank_integral,shipping_id)" .//注意这里增加了一个字段 shipping_id
                "VALUES ('$_POST[goods_name]', '$goods_name_style', '$goods_sn', '$catgory_id', " .
                    "'$brand_id', '$shop_price', '$market_price', '$is_promote','$promote_price', ".
                    "'$promote_start_date', '$promote_end_date', '$goods_img', '$goods_thumb', '$original_img', ".
                    "'$_POST[keywords]', '$_POST[goods_brief]', '$_POST[seller_note]', '$goods_weight', '$goods_number',".
                    " '$warn_number', '$_POST[integral]', '$give_integral', '$is_best', '$is_new', '$is_hot', 0, '$is_on_sale', '$is_alone_sale', $is_shipping, ".
                    " '$_POST[goods_desc]', '" . gmtime() . "', '". gmtime() ."', '$goods_type', '$code', '$rank_integral', '$shipping_id')";//注意这里增加了一个字段 shipping_id 
        }
    }
    else
    {
        /* 如果有上传图片,删除原来的商品图 */
        $sql = "SELECT goods_thumb, goods_img, original_img " .
                    " FROM " . $ecs->table('goods') .
                    " WHERE goods_id = '$_REQUEST[goods_id]'";
        $row = $db->getRow($sql);
        if ($proc_thumb && $goods_img && $row['goods_img'] && !goods_parse_url($row['goods_img']))
        {
            @unlink(ROOT_PATH . $row['goods_img']);
            @unlink(ROOT_PATH . $row['original_img']);
        }

        if ($proc_thumb && $goods_thumb && $row['goods_thumb'] && !goods_parse_url($row['goods_thumb']))
        {
            @unlink(ROOT_PATH . $row['goods_thumb']);
        }



        $sql = "UPDATE " . $ecs->table('goods') . " SET " .
                "goods_name = '$_POST[goods_name]', " .
                "goods_name_style = '$goods_name_style', " .
                "goods_sn = '$goods_sn', " .
                "cat_id = '$catgory_id', " .
                "brand_id = '$brand_id', " .
                "shop_price = '$shop_price', " .
                "market_price = '$market_price', " .
                "is_promote = '$is_promote', " .
                "promote_price = '$promote_price', " .
                "promote_start_date = '$promote_start_date', " .
                "suppliers_id = '$suppliers_id', " .
             //   "province = '$goods_provincestr', " .
              //  "city = '$goods_citystr', " .
               // "virtual_buy = '$virtual_buy', " .
                "shipping_id = '$shipping_id', " .//注意这里新增的 by uuecs.com
                "promote_end_date = '$promote_end_date', ";

        /* 如果有上传图片,需要更新数据库 */

 

      2.3 后台添加/编辑商品 实现绑定配送方式”admin/goods_info.htm”

<tr>
          <td class="label">运费模板</td>
          <td><select name="shipping_id" ><option value="0">{$lang.select_please}
		{foreach from=$shipping_list item=shipping}
                <option value="{$shipping.shipping_id}" {if $shipping.shipping_id eq $goods.shipping_id}selected{/if}>{$shipping.shipping_name}</option>
              {/foreach}
 </select>{$lang.require_field}</td>
        </tr>

 

在品牌下面,增加绑定运费模板。效果如下:
140733_9UdA_102350

      3、前台商品详情调用设置好的配送方式

以主题default为例,增加新文件:
1、chrome.js (themes/default/js)
2、icon_2.jpg (themes/default/images)相关文件下载

goods.php页面商品显示部分加入调用代码

/***** 商品页按地区显示运费 ***********************************************************************/
 $shippings = array();
 $res = $db->GetAll("SELECT shipping_name, shipping_id FROM ecs_shipping WHERE shipping_id=".$goods['shipping_id']);
 foreach ($res as $value)
 {
 $areas = array();
 $res1 = $db->GetAll("SELECT * FROM ecs_shipping_area WHERE shipping_id = $value[shipping_id]");
 foreach ($res1 as $area)
 {
 $configure = unserialize($area['configure']);
 if (is_array($configure))
 {
 foreach ($configure as $c)
 {
 if ($c['name'] == 'base_fee')
 {
 $price = $c['value'];
 }
 }
 }
 $sql = "SELECT a.region_id, r.region_name ".
 "FROM ".$ecs->table('area_region')." AS a, ".$ecs->table('region'). " AS r ".
 "WHERE r.region_id=a.region_id AND a.shipping_area_id='$area[shipping_area_id]'";
 $res2 = $db->query($sql);
 while ($arr = $db->fetchRow($res2))
 {
 $value['areas'][$arr['region_name']] = $price;
 }
 }
 $shippings[] = $value;
 }
 $res = $db->GetAll("SELECT region_id,region_name FROM ecs_region WHERE parent_id = 1");
 if($goods['shipping_id'] == 6)
 {
 $current_region = '广东';   //默认显示广东省
 $smarty->assign('current_region',   $current_region); 
 $smarty->assign('current_price',   '7'); 
 }

 foreach ($res as $value)
 {
 $row = array();
 foreach ($shippings as $a => $shipping)
 {
 if ($shipping['areas'])
 {
 foreach ($shipping['areas'] as $key => $price)
 {
 if ($key == $value['region_name'])
 {
 $row[$a]['shipping_price'] = $price;
 }
 }
 }
 if ($row[$a]['shipping_price'] > 0)
 {
 $row[$a]['shipping_name'] = $shipping['shipping_name'];
 $value['shippings'] = $row;
 }
 }
 if ($value['shippings']) $regions[] = $value;
 }
 $smarty->assign('regions',              $regions);
 /****************************************************************************/

goods.dwt  加在需要显示运费的地方,根据自己需要调整。

 <!--{if $regions}-->
 <script src="themes/default/js/chrome.js" type="text/javascript"></script>
 {foreach from=$regions key=key item=value}
 {if $key == 0}
 <p id="chromemenu">至 <a rel="dropmenu1" href="javascript:;"><b id="s_a_name">{$current_region}</b><img style="margin:0 2px 0 2px;" src="images/icon_2.jpg" align="absmiddle" /></a>:<b id="s_a_price">
 {foreach from=$value.shippings item=shipping}
 {$shipping.shipping_name}{$current_price}元 &nbsp;
 {/foreach}
 </b>
 </p>
 {/if}
 {/foreach}
 <div id="dropmenu1" class="dropmenudiv">
 {foreach from=$regions item=value}
 <a href="javascript:;" onclick="show_shipping('{$value.region_name}','{foreach from=$value.shippings item=shipping}{$shipping.shipping_name}{$shipping.shipping_price}元 &nbsp;{/foreach}')">{$value.region_name}</a>
 {/foreach}
 </div>
 <script>
 function show_shipping(name,price)
 {
 document.getElementById("s_a_name").innerHTML = name;
 document.getElementById("s_a_price").innerHTML = price;
 }
 cssdropdown.startchrome("chromemenu");
 </script>
 <style>
 #chromemenu b { font-weight:normal}
 .dropmenudiv {position:absolute;top: 0;z-index:100;width:200px;visibility: hidden; background:#fdffee; padding:8px; border:solid #ffbf69 2px; line-height:25px;}
 .dropmenudiv a { margin:0 5px 0 5px;}
 </style>
 <!--{/if}-->

 

前台显示最终效果图,默认广东省

145650_qIIu_102350

     4、结算流程中,根据配送地址计算运费

        4.1 重写“include/lib_order.php”中last_shipping_and_payment函数。多个商品,不同配送方式,调用配送方式ID,以最贵配送方式计算。买家可以找客服进行,运费改价。

/**
 * 获得上一次用户采用的支付和配送方式
 *
 * @access  public
 * @return  void
 */
function last_shipping_and_payment()
{
    $sql = "SELECT shipping_id, pay_id " .
            " FROM " . $GLOBALS['ecs']->table('order_info') .
            " WHERE user_id = '$_SESSION[user_id]' " .
            " ORDER BY order_id DESC LIMIT 1";
    $row = $GLOBALS['db']->getRow($sql);

	/* LONGHTML 获得购物车中商品 运费模板最大值 */
	$sql = "SELECT DISTINCT max(g.shipping_id) as  shipping_id " .
            " FROM " . $GLOBALS['ecs']->table('cart') ." AS c ".
            " LEFT JOIN " . $GLOBALS['ecs']->table('goods') . " AS g ON c.goods_id = g.goods_id" .
            " WHERE c.`session_id` =  '" . SESS_ID . "'".
			" AND c.`extension_code` !=  'package_buy' ";
    $shipping_id = $GLOBALS['db']->getOne($sql);
	$row['shipping_id'] = $shipping_id;
	// END

    if (empty($row))
    {
        /* 如果获得是一个空数组,则返回默认值 */
        $row = array('shipping_id' => 0, 'pay_id' => 0);
    }

    return $row;
}

4.2  flow.php购物流程checkout,done步骤,调用商品绑定的配送方式

   /* 对是否允许修改购物车赋值 */
   if ($flow_type != CART_GENERAL_GOODS || $_CFG['one_step_buy'] == '1')
   {
       $smarty->assign('allow_edit_cart', 0);
   }
   else
   {
       $smarty->assign('allow_edit_cart', 1);
   }

// LONGHTML 最大值的运费模板 
$arr = last_shipping_and_payment();
$_SESSION['flow_order']['shipping_id'] = $arr['shipping_id'];
$smarty->assign('select_shipping_id', $arr['shipping_id']);
// END

将themes/default/flow.dwt配送方式隐藏掉

<!--{if $total.real_goods_count neq 0}-->
    <div class="" style="display:none;">
    <h5><span>{$lang.shipping_method}</span></h5>
    <table width="984" align="center" border="0" cellpadding="5" cellspacing="1" bgcolor="#dddddd" id="shippingTable">
            <tr align="center">
              <th align="center" bgcolor="#ffffff" width="5%">&nbsp;</th>
              <th align="center" bgcolor="#ffffff" width="25%">{$lang.name}</th>
              <th align="center" bgcolor="#ffffff">{$lang.describe}</th>
              <th align="center" bgcolor="#ffffff" width="15%">{$lang.fee}</th>
              <th align="center" bgcolor="#ffffff" width="15%">{$lang.free_money}</th>
              <th align="center" bgcolor="#ffffff" width="15%">{$lang.insure_fee}</th>
            </tr>
            <!-- {foreach from=$shipping_list item=shipping} 循环配送方式 -->
            <tr align="center">
              <td align="center" bgcolor="#ffffff" valign="top"><input name="shipping" id="shipping_se" type="radio" value="{$shipping.shipping_id}" {if ($order.shipping_id eq $shipping.shipping_id) or true}checked="true"{/if} supportCod="{$shipping.support_cod}" insure="{$shipping.insure}" onclick="selectShipping(this)" />
              </td>
              <td align="center" bgcolor="#ffffff" valign="top"><strong>{$shipping.shipping_name}</strong></td>
              <td align="center" bgcolor="#ffffff" valign="top">{$shipping.shipping_desc}</td>
              <td bgcolor="#ffffff" align="center" valign="top">{$shipping.format_shipping_fee}</td>
              <td bgcolor="#ffffff" align="center" valign="top">{$shipping.free_money}</td>
              <td bgcolor="#ffffff" align="center" valign="top">{if $shipping.insure neq 0}{$shipping.insure_formated}{else}{$lang.not_support_insure}{/if}</td>
            </tr>
            <!-- {/foreach} 循环配送方式 -->
			<!-- LONGHTML --><script>selectShipping02({$select_shipping_id});</script> <!-- END -->
            <tr align="center">
              <td colspan="6" bgcolor="#ffffff" align="center"><label for="ECS_NEEDINSURE">
                <input name="need_insure" id="ECS_NEEDINSURE" type="checkbox"  onclick="selectInsure(this.checked)" value="1" {if $order.need_insure}checked="true"{/if} {if $insure_disabled}disabled="true"{/if}  />
                {$lang.need_insure} </label></td>
            </tr>
          </table>
    </div>
    <div class="blank"></div>
        <!--{else}-->
        <input name = "shipping" type="radio" value = "-1" checked="checked"  style="display:none"/>
        <!--{/if}-->

 

 5、经过上面多处增加/修改,测试一下运行效果。

广东  首重10KG 7元,续重0.7元/KG

151412_s5oe_102350

151421_skLj_102350

152034_kZzk_102350

152151_vbBQ_102350

阿牛ECSHOP 更专业 更方便

关于我们联系我们