【问题标题】:Magento: Get product price given a customer groupMagento:获取给定客户组的产品价格
【发布时间】:2012-09-07 23:56:51
【问题描述】:

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

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

$_product->getPriceByCustomerGroup( $groupId );

目标

(未登录):

  • 原价:10.99 美元
  • 会员价:5.99 美元

(会员登录):

  • 原价:10.99 美元
  • 会员价:5.99 美元

【问题讨论】:

  • 要删除我的答案,因为它是错误的,仍在寻找一种方法来做到这一点

标签: php magento product rule magento-1.7


【解决方案1】:

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

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

第二次幸运:)

【讨论】:

  • 酷,不错的解决方案。两次加载产品有点恶心,但我会接受的!
  • 是的,希望有一种不同的方式 - 并且知道有 Magento - 但我找不到它
  • 嗯,我现在正在尝试这个,复制产品后无法获得合适的价格。我要仔细检查一下,我没有犯错
  • 无法让它工作。即使以客户组的身份登录并执行此操作也无法获得正确的价格。我正在尝试在 catalog/product/price.phtml 中使用它,你在看什么文件导致你走上这条路?
  • 越来越近,但我无法弄清楚日期是如何关联的,数据库条目似乎是零星的。我的促销规则与日期无关。 Mage::getResourceModel('catalogrule/rule')-&gt;getRulePrice("2012-09-7", $_websiteId, $groupId, $_id);
【解决方案2】:

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

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

Mage::getResourceModel('catalogrule/rule')->getRulePrice( $now, $websiteId, $customerGroup, $_productId);

【讨论】:

  • 不应该是Mage::('catalogrule/rule') 而应该是Mage::getModel('catalogrule/rule')
  • 不,应该是 Mage::getResourceModel。 getModel 不是正确的。
  • 哇。这实际上有效。我从来不知道catalogrule 模块有那种获取价格的方法。谢谢!
【解决方案3】:

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

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

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

【讨论】:

    【解决方案4】:

    另一种解决方案。如果团价低于主价,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();
    

    【讨论】:

    • 完美答案感谢您的回答
    【解决方案5】:

    这就是你的做法。经过测试,并且可以正常工作。

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

    【讨论】:

      【解决方案6】:

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

      $group_id = 4;
      $grp_price = $_product->getData('group_price');
      echo $grp_price[$group_id]['price'];
      

      【讨论】:

      • 我知道这是一个非常古老的答案,但我认为在你的解决方案中你没有考虑任何促销规则。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-07
      • 1970-01-01
      • 1970-01-01
      • 2020-03-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多