如题,当使用简单产品配合分类促销使用的时候,原生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的开关,配合这个判断使用的。是否阻止其他促销进一步起效。