php 网上商城促销设计实例代码


Posted in PHP onFebruary 17, 2012

大体的思想,每一个促销要新建一个促销类,有专门的开关来控制是否生效。
用商品里面的促销识别码来判断具体调用哪一个促销实例。
首先,在添加商品的时候,分两步,第一步是添加状态,第二步是把购物车内的商品显示这个状态。
一,添加步骤几个重要的点:
1,添加商品之前,遍历所有的促销互斥条件。
例如,某一款商品不可以和另一个商品同时在一个购物车内;或者某个用户权限,不可以购买特定的一件商品等等。
2,添加商品之前,选择特定的促销实例,来进行添加之前的操作。
注:第二点与第一点的区别在于1是要遍历所有的促销实例,而2是单独的一条。
3,添加商品后,根据特定的促销实例,所要进行的操作。

/** 
* 向购物车内添加商品 
* @param int $goods_id 商品ID 
* @param string $goods_spec 商品规格 
* @param int $goods_number 商品数量 
* @param string $promote_name 商品参加活动 
* @return bool 
*/ 
public function goodsAdd($goods_id, $goods_spec, $goods_number, $promote_name) 
{ 
//获取所有有效的促销实例 
$rules = $this->_getAllRuleInstance(); 
foreach($this->_rules as $instance) 
{ 
//换礼互斥判断 
if(!$instance->goodsExclusion($goods_id, $goods_spec)) 
{ 
return false; 
} 
} 
//获取商品单独的促销实例 
$rule = $this->_getRuleInstance($promote_name); 
//添加商品之前操作 
if($rule->beforeGoodsAdd()) 
{ 
$rule->goodsAdd($goods_id, $goods_spec, $goods_number); 
//添加商品之后操作 
return $rule->afterGoodsAdd(); 
} 
return false; 
}

/** 
* 获取可用规则实例列表 
* @return array 
*/ 
private function _getAllRuleInstance() 
{ 
if(empty($this->_rules)) 
{ 
$dir = dirname(__FILE__).'/Cart/Rule/'; 
$dir_handle = opendir($dir); 
while($file = readdir($dir_handle)) 
{ 
if(is_file($dir.$file)) 
{ 
$instance = $this->_getRuleInstance(substr($file, 0, strpos($file, '.'))); 
if($instance->enabled()) 
{ 
$this->_rules[] = $instance; 
} 
} 
} 
} 
return $this->_rules; 
}

/** 
* 获取购物车规则类 
* @param string $name 规则名称 
* @return Bll_Shop_Cart_Rule 
*/ 
private function _getRuleInstance($name) 
{ 
$rule_name = 'Bll_Shop_Cart_Rule_'.$name; 
try 
{ 
Zend_Loader::loadClass($rule_name); 
$this->_rule = new $rule_name(); 
$this->_rule->setCart($this); 
return $this->_rule; 
}catch (Exception $e) 
{ 
Bll_LogWriter::logException('购物规则对象加载异常. rule_name:'.$rule_name); 
throw new Exception('购物规则对象加载异常.'); 
} 
}

这里主要用到的促销是,判断某一个人是否有添加这个商品的权限,打折等。
二,遍历购物车商品的操作
这一步要执行关键操作是遍历所有促销策略的检查列表函数。
这里常常可以用到的促销是满多少钱,送赠品,买二送一等等。
/** 
* 获取购物车内商品清单对象列表 
* @return array Bll_Shop_Cart_Rule 
*/ 
public function goodsViewList() 
{ 
$list = $this->getGoodsList(); 
// 在列表时检查购物车内商品列表 
$rules = $this->_getAllRuleInstance(); 
foreach($this->_rules as $instance) 
{ 
$instance->setGoodsList($list)->goodsCheckList(); 
$this->_tip_rules[] = $instance; 
} 
//获取最新购物车列表 
$goods_list = $this->_cart->getGoodsList(); 
return $goods_list; 
}

第三,提交订单之前的操作
有一些类型的促销,比如某人有打折的权限,当下完订单后,这个打折的权限就被用掉了;或者在下单之前要先检查这个订单的金额,如果小于多少就不准下这个订单等等。
以上这些都会用到提交订单之前的操作。
PHP 相关文章推荐
数据库相关问题
Oct 09 PHP
PHP小技巧搜集,每个PHPer都来露一手
Jan 02 PHP
php下几个常用的去空、分组、调试数组函数
Feb 22 PHP
基于PHP选项与信息函数的使用详解
May 10 PHP
解析crontab php自动运行的方法
Jun 24 PHP
php实现使用正则将文本中的网址转换成链接标签
Dec 03 PHP
php中magic_quotes_gpc对unserialize的影响分析
Dec 16 PHP
简单介绍win7下搭建apache+php+mysql开发环境
Aug 06 PHP
PHP基于单例模式编写PDO类的方法
Sep 13 PHP
浅谈php中变量的数据类型判断函数
Mar 04 PHP
php PDO判断连接是否可用的实现方法
Apr 03 PHP
Yii框架参数化查询中IN查询只能查询一个的解决方法
May 20 PHP
php中通过curl模拟登陆discuz论坛的实现代码
Feb 16 #PHP
初品cakephp 入门基础
Feb 16 #PHP
php线性表顺序存储实现代码(增删查改)
Feb 16 #PHP
用PHP实现Ftp用户的在线管理
Feb 16 #PHP
PHP排序算法的复习和总结
Feb 15 #PHP
php网上商城购物车设计代码分享
Feb 15 #PHP
php后台多用户权限组思路与实现程序代码分享
Feb 13 #PHP
You might like
基于jQuery的消息提示插件 DivAlert之旅(二)
2010/04/01 Javascript
基于jQuery的遍历同id元素 并响应事件的代码
2012/06/14 Javascript
jQuery实现带动画效果的二级下拉导航方法
2015/03/11 Javascript
浅谈jQuery 中的事件冒泡和阻止默认行为
2016/05/28 Javascript
jQuery实现表格行和列的动态添加与删除方法【测试可用】
2016/08/01 Javascript
js canvas仿支付宝芝麻信用分仪表盘
2016/11/16 Javascript
浅谈JavaScript的函数及作用域
2016/12/30 Javascript
JavaScript中利用构造器函数模拟类的方法
2017/02/16 Javascript
JavaScript实现前端分页控件
2017/04/19 Javascript
vue深入解析之render function code详解
2017/07/18 Javascript
vue2.0+vue-router构建一个简单的列表页的示例代码
2019/02/13 Javascript
手挽手带你学React之React-router4.x的使用
2019/02/14 Javascript
Vue Autocomplete 自动完成功能简单示例
2019/05/25 Javascript
你或许不知道的一些npm实用技巧
2019/07/04 Javascript
JavaScript实现的3D旋转魔方动画效果实例代码
2019/07/31 Javascript
vue实现行列转换的一种方法
2019/08/06 Javascript
解决vue-photo-preview 异步图片放大失效的问题
2020/07/29 Javascript
在Vue中使用CSS3实现内容无缝滚动的示例代码
2020/11/27 Vue.js
[06:04]DOTA2国际邀请赛纪录片:Just For LGD
2013/08/11 DOTA
[36:17]DOTA2上海特级锦标赛 - VGL音乐会全集
2016/03/06 DOTA
[01:10:03]OG vs EG 2018国际邀请赛淘汰赛BO3 第三场 8.23
2018/08/24 DOTA
python3.0 字典key排序
2008/12/24 Python
python装饰器使用方法实例
2013/11/21 Python
Python Learning 列表的更多操作及示例代码
2018/08/22 Python
eclipse创建python项目步骤详解
2019/05/10 Python
python实现函数极小值
2019/07/10 Python
python 并发下载器实现方法示例
2019/11/22 Python
python GUI库图形界面开发之PyQt5结合Qt Designer创建信号与槽的详细方法与实例
2020/03/08 Python
本科毕业生求职自荐信
2014/02/03 职场文书
关于雷锋的演讲稿
2014/05/10 职场文书
软件研发工程师岗位职责
2014/09/30 职场文书
2015年数学教师工作总结
2015/05/20 职场文书
《工作是最好的修行》读后感3篇
2019/12/13 职场文书
如何在向量化NumPy数组上进行移动窗口
2021/05/18 Python
解决Pytorch修改预训练模型时遇到key不匹配的情况
2021/06/05 Python
Python re.sub 反向引用的实现
2021/07/07 Python