4

在 magento 1.7 上,我为“特殊会员”客户群创建了 20% 折扣的促销价格规则。

我想显示两个价格。我以为会有类似的东西

$_product->getPriceByCustomerGroup( $groupId );

目标

(未登录):

  • 正常价格:10.99 美元
  • 会员价:5.99 美元

(会员登录):

  • 正常价格:10.99 美元
  • 会员价:5.99 美元
4

6 回答 6

6

好吧,有点乱,但我想我有。

您可以通过调用产品的 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/>';

第二次幸运:)

于 2012-09-09T23:29:31.723 回答
6

在破解了一段时间后实现了我自己的愿望

$now = Mage::getSingleton('core/date')->timestamp( time() );
$websiteId = Mage::app()->getStore()->getWebsiteId();
$customerGroup = 4;

Mage::getResourceModel('catalogrule/rule')->getRulePrice( $now, $websiteId, $customerGroup, $_productId);
于 2012-09-21T21:26:55.830 回答
3

这是我对这个问题的解决方案。我还添加了关于其他解决方案和一些有用技巧的评论。

<?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()

我希望这会对某人有所帮助。

于 2013-11-27T05:24:16.900 回答
2

另一种解决方案。如果团价将小于主价,函数 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();
于 2016-03-04T14:00:48.597 回答
1

这是你如何做到的。经测试,正常工作。

<?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));
?>
于 2013-01-28T20:30:10.620 回答
1

如果有人仍在寻找 1.7.0.2 CE 版本的解决方案,那么这样的代码对我有用(在这种情况下,当我使用产品对象时):

$group_id = 4;
$grp_price = $_product->getData('group_price');
echo $grp_price[$group_id]['price'];
于 2013-05-01T13:09:01.623 回答