Magento: получить цену продукта от группы клиентов

На magento 1.7 я создал рекламное ценовое правило с 20% скидкой для группы клиентов «особые участники».

Я бы хотел показать обе цены. Я думал, что будет что-то вроде

$_product->getPriceByCustomerGroup( $groupId ); 

Цель

(не вошел):

  • Обычная цена: $ 10.99
  • Цена для участников: $ 5.99

(участник вошел в систему):

  • Обычная цена: $ 10.99
  • Цена для участников: $ 5.99

Related of "Magento: получить цену продукта от группы клиентов"

Хорошо, немного гадости вокруг, но я думаю, что у меня это есть.

Вы можете получить цену за конкретный идентификатор группы (3 в случае ниже), вызвав setCustomerGroupId для продукта. Единственное предостережение в том, что после вызова функции setCustomerGroupId вы не можете установить идентификатор группы клиентов в другую группу и получить цену для этой группы – она ​​устанавливает цену один раз, а затем она не будет перезаписывать ее.

В приведенном ниже примере у меня есть продукт с нормальной ценой в 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/>'; 

2-й раз повезло 🙂

Выудил мое собственное желание после взлома на нем какое-то время

 $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 

Если у вас нет определенной цены в группе, она вернет только общую цену

Таким образом, эта функция вернет правильную цену для Customer GID каждый раз, когда вы меняете GID

 $price = $_product->getPriceModel()->getFinalPrice($qty, $_product); 

Будьте осторожны с этой функцией, потому что она вернет правильную цену только ОДИН, когда вы первоначально настроили идентификатор группы клиентов продукта (от нуля до $ gid)

 $price = $_product->getFinalPrice(); 

Также будьте осторожны с решением Дмитрия, потому что он возвращает «сырую» цену группы продуктов. Это означает, что цена для Группы должна определяться для продукта, и эта цена не будет зависеть от скидок правил каталога, поэтому она может быть выше фактической конечной цены или общей цены.

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

Надеюсь, это поможет кому-то.

Вот как ты это делаешь. Протестировано и работает.

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

Другое решение. Если цена группы будет меньше основной цены, функция 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(); 

Если кто-то все еще ищет решение в версии 1.7.0.2 CE, такой код работал для меня (в ситуации, когда я использую объект продукта):

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