在 magento 1.7 上,我为“特殊会员”客户群创建了 20% 折扣的促销价格规则。
我想显示两个价格。我以为会有类似的东西
$_product->getPriceByCustomerGroup( $groupId );
目标
(未登录):
- 正常价格:10.99 美元
- 会员价:5.99 美元
(会员登录):
- 正常价格:10.99 美元
- 会员价:5.99 美元
在 magento 1.7 上,我为“特殊会员”客户群创建了 20% 折扣的促销价格规则。
我想显示两个价格。我以为会有类似的东西
$_product->getPriceByCustomerGroup( $groupId );
目标
(未登录):
(会员登录):
好吧,有点乱,但我想我有。
您可以通过调用产品的 setCustomerGroupId 来获取特定组 ID(在下面的例子中为 3)的价格。唯一需要注意的是,一旦您调用 setCustomerGroupId 函数,您就不能将客户组 ID 设置为不同的组并接收该组的价格 - 它设置一次价格,然后不会覆盖它。
在下面的示例中,我有一个产品的正常价格为 399.99 美元,适用于除组 id 3 之外的所有组。对于组 id 3,我设置了 20% 折扣的目录价格规则。
如果我运行下面的代码,我会得到:
product A: 399.99
product B (group id 3): 319.9900
product B (group id 0): 319.9900
请注意我第二次设置客户组时它不会改变价格
$_productA = $this->getProduct();
$_productB = Mage::getModel('catalog/product')->load($_productA->getId());
$_productB->setCustomerGroupId(3);
echo 'product A: '.$_productA->getFinalPrice().'<br/>';
echo 'product B (group id 3): '.$_productB->getFinalPrice().'<br/>';
$_productB->setCustomerGroupId(0);
echo 'product B (group id 0): '.$_productB->getFinalPrice().'<br/>';
第二次幸运:)
在破解了一段时间后实现了我自己的愿望
$now = Mage::getSingleton('core/date')->timestamp( time() );
$websiteId = Mage::app()->getStore()->getWebsiteId();
$customerGroup = 4;
Mage::getResourceModel('catalogrule/rule')->getRulePrice( $now, $websiteId, $customerGroup, $_productId);
这是我对这个问题的解决方案。我还添加了关于其他解决方案和一些有用技巧的评论。
<?php
//Get the product
$_product = $this->getProduct();
//or load it from the DB by product ID: $_product = Mage::getModel('catalog/product')->load($_id);
$qty = 1; //price for only one item
Mage::log("Current customer GroupID ('0' for Not Logged In): ".Mage::getSingleton('customer/session')->getCustomerGroupId());
Mage::log("Initial Product price GroupID (always = Null): ".$_product->getCustomerGroupId());
Mage::log("Initial Product price: ".$_product->getPriceModel()->getFinalPrice($qty, $_product));
$NonMember_gr=1; //"1" - is default group for logged in customers
$Member_gr=2;
$_product->setCustomerGroupId($NonMember_gr);
$NonMemberPrice = $_product->getPriceModel()->getFinalPrice($qty, $_product);
Mage::log("Product Group changed to: ".$_product->getCustomerGroupId());
Mage::log("Non-member price is: ".$NonMemberPrice);
$_product->setCustomerGroupId($Member_gr);
$MemberPrice = $_product->getPriceModel()->getFinalPrice($qty, $_product);
Mage::log("Product Group changed to: ".$_product->getCustomerGroupId());
Mage::log("Member price is: ".$MemberPrice);
$_product->setCustomerGroupId(Mage::getSingleton('customer/session')->getCustomerGroupId());
Mage::log("Product Group returned to: ".$_product->getCustomerGroupId());
Mage::log("Price returned to: ".$_product->getPriceModel()->getFinalPrice($qty, $_product));
?>
之后,您将在日志文件中拥有:
2013-12-05T03:01:10+00:00 DEBUG (7): Current customer GroupID ('0' for Not Logged In): 0
2013-12-05T03:01:10+00:00 DEBUG (7): Initial Product price GroupID (always = Null):
2013-12-05T03:01:10+00:00 DEBUG (7): Initial Product price: 55
2013-12-05T03:01:10+00:00 DEBUG (7): Product Group changed to: 1
2013-12-05T03:01:10+00:00 DEBUG (7): Non-member price is: 40.0000
2013-12-05T03:01:10+00:00 DEBUG (7): Product Group changed to: 2
2013-12-05T03:01:10+00:00 DEBUG (7): Member price is: 25.0000
2013-12-05T03:01:10+00:00 DEBUG (7): Product Group returned to: 0
2013-12-05T03:01:10+00:00 DEBUG (7): Price returned to: 55
如果您没有定义团体价格,它将仅返回一般价格
因此,每次更改 GID 时,此函数都会为客户 GID 返回正确的价格
$price = $_product->getPriceModel()->getFinalPrice($qty, $_product);
请小心使用此函数,因为它只会在您最初设置产品客户组 ID 时返回正确的价格一次(null 到 $gid)
$price = $_product->getFinalPrice();
还要小心 Dmitry 的解决方案,因为它返回“原始”产品组价格。这意味着必须为产品定义组价格,并且该价格不受目录规则折扣的影响,因此它可能高于实际最终价格或一般价格。
$gr_price_arr = $_product->getData('group_price');
foreach ($gr_price_arr as $gr_price){
echo '<br>CustomerGroup='.$gr_price['cust_group'].' GroupPrice='.$gr_price['price'];
}
获得目录规则和购物车规则的特殊价格和折扣的一些其他有用功能
//get Catalogue Rule by ID
$rule = Mage::getModel('catalogrule/rule')->load($rule_id);
//get Rule Name and Discount Amount
echo '<br>name: '.$rule->getName().' Amount: '.$rule->getDiscountAmount().'<br>';
//get Cart Rules and Coupon Discounts
$coupon = Mage::getModel('salesrule/rule');
$couponCollection = $coupon->getCollection();
foreach($couponCollection as $c){
echo 'Code:'.$c->getCode().'--->Discount Amount:'.$c->getDiscountAmount().'<br />'; }
有时检查客户是否登录可能很有用
Mage::getSingleton('customer/session')->isLoggedIn()
我希望这会对某人有所帮助。
另一种解决方案。如果团价将小于主价,函数 getGroupPrice 返回主价。
//get product
$product = Mage::getModel('catalog/product')->load($id);
//get group by code
$group = Mage::getModel('customer/group')->load($code, 'customer_group_code');
//get group price
$product->setCustomerGroupId($group->getId());
$price = $product->getGroupPrice();
//get main price
$product->setCustomerGroupId(null);
$price = $product->getPrice();
这是你如何做到的。经测试,正常工作。
<?php
$now = Mage::getSingleton('core/date')->timestamp( time() );
$websiteId = 1; // Choose your store # here
$customerGroup = 4;
$productId = 9369;
$rules = Mage::getResourceModel('catalogrule/rule');
echo $rules->getRulePrice($now, $websiteId, $customerGroup, $productId));
?>
如果有人仍在寻找 1.7.0.2 CE 版本的解决方案,那么这样的代码对我有用(在这种情况下,当我使用产品对象时):
$group_id = 4;
$grp_price = $_product->getData('group_price');
echo $grp_price[$group_id]['price'];