magento|简单产品使用分类促销的时候无法对options价格一起打折的问题

如题,当使用简单产品配合分类促销使用的时候,原生magento只会对产品的基础价格进行折扣,不会options的价格一起打折。这样就会造成折扣百分比存在问题。带options的产品价格是产品基础价格乘以打折的百分比加上options的价格,导致显示出来的原价和折扣价与实际百分比不符。

为了解决这个问题需要二次开发,重写mangeto的模块,具体如下:

1、重写app\code\local\Mage\Catalog\Model\Product\Option\Value.php中的getPrice方法:

public function getPrice($flag=false)
    {
        $fullContoller =  Mage::app()->getFrontController()->getAction()->getFullActionName();
        //后台保存是不调用栏目折扣信息
        if($fullContoller !='adminhtml_catalog_product_save' && $fullContoller !='adminhtml_catalog_product_options'){
            //折扣百分比
            if ($flag && $this->getPriceType() == 'percent') {
                $basePrice = $this->getOption()->getProduct()->getFinalPrice();
                $price = $basePrice*($this->_getData('price')/100);
                return $price;
            }
            //获取当前的系统栏目折扣
            $percent = 1;
            if($this->getProduct()){
                $product_obj = $this->getProduct();
            }else{
                $product_obj = Mage::getModel('catalog/product')->load($this->getOption()->getProductId());
            }
            $percent =  \Mage::helper('gigeo/cart')->getProductPriceRuleId($product_obj);
            return $this->_getData('price') * $percent;
            // return $this->_getData('price') ;
        }else{
            //系统原始
            if ($flag && $this->getPriceType() == 'percent') {
                $basePrice = $this->getOption()->getProduct()->getFinalPrice();
                $price = $basePrice*($this->_getData('price')/100);
                return $price;
            }
            Mage::log($fullContoller,null,'option---.log');
            return $this->_getData('price');

        }
    }

 

2、上面的方法里面引用到一个help里面的方法getProductPriceRuleId,这个需要自定义一个help文件,并写入方法,功能主要是用来获取促销的百分比,以便后续计算。具体方法如下:

protected static $_priceRulesData = array();
	public function getProductPriceRuleId(Mage_Catalog_Model_Product $product)
	{
		$rule_array = array();
		$priceRules = null;
		$productId  = $product->getId();
		$storeId    = $product->getStoreId();
		$websiteId  = Mage::app()->getStore($storeId)->getWebsiteId();
		if ($product->hasCustomerGroupId()) {
			$customerGroupId = $product->getCustomerGroupId();
		} else {
			$customerGroupId = Mage::getSingleton('customer/session')->getCustomerGroupId();
		}

		$dateTs     = Mage::app()->getLocale()->storeTimeStamp($storeId);


		$cacheKey   = date('Y-m-d', $dateTs) . "|$websiteId|$customerGroupId|$productId|ruleid";
		$rule_id = '';
		if (!array_key_exists($cacheKey, self::$_priceRulesData)) {

			$rulesData  = Mage::getResourceModel('catalogrule/rule')->getRulesFromProduct($dateTs, $websiteId, $customerGroupId, $productId);
			if ($rulesData) {
				foreach ($rulesData as $ruleData) {
					$catalogRuleID = $ruleData['rule_id'];
					$catalogRulObj = Mage::getModel('catalogrule/rule')->load($catalogRuleID);

					//var_dump($catalogRuleID);
					if ($product->getParentId()) {
						$rule_id = $ruleData['rule_id'];
						if ($ruleData['action_stop']) {
							break;
						}
					} else {
						$rule_id = $ruleData['rule_id'];
						if ($ruleData['action_stop']) {
							break;
						}
					}

					if($catalogRulObj->getData('is_active') == 0 || $catalogRulObj->getData('simple_action') != 'by_percent') continue;
					$rule_array[]= $catalogRulObj->getData();
				}
				//进行百分比计算
				$this->sortArrByField($rule_array, 'sort_order', $desc = false);
				$percent = 1;
				foreach($rule_array as $rule){
					$percent = $percent  * (1 - $rule['discount_amount'] / 100);
				}


				return $percent;
			} else {
				return 1;
			}
		} else {
			return 1;
		}
		return 1;
	}

在这个方法里面有一个action_stop的字段判断,这个值对照后台添加促销的时候有个设置是Stop Further Rules Processing的开关,配合这个判断使用的。是否阻止其他促销进一步起效。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值