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的开关,配合这个判断使用的。是否阻止其他促销进一步起效。

 

你可能感兴趣的:(magento)