Lan Nguyen
Lan Nguyen

Reputation: 465

How to get bundle product price in Magento?

I have an bundle product as array like this: (take from params when add product to cart)

Array
(
    [product] => 165
    [bundle_option] => Array
    (
        [17] => 47
        [22] => 60
        [16] => 46
        [15] => 42
        [14] => Array
            (
                [0] => 39
            )
    )
)

How could I get price for this bundle product?

Upvotes: 3

Views: 19622

Answers (9)

kanishka maduranga
kanishka maduranga

Reputation: 1

$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$product = $objectManager->create('Magento\Catalog\Model\Product')->load($product_id);
if ($product->getTypeId() == 'bundle') {
      $regularPrice = $product->getPriceInfo()->getPrice('regular_price')->getMinimalPrice()->getValue();
      $specialPrice = $product->getPriceInfo()->getPrice('final_price')->getMinimalPrice()->getValue();            
}

Upvotes: 0

Matthew G
Matthew G

Reputation: 1090

You can use the getMinimalPrice() and getMaximalPrice() functions in the Mage_Bundle_Product_Price class, which are written specifically for bundle products.

Upvotes: 2

Varun Suresh Kumar
Varun Suresh Kumar

Reputation: 879

I solved it by own method, not sure its acceptable or not.send the post values and product id, the model will return the price.

$bundle_option = Mage::app ()->getRequest ()->getParam('bundle_option');
$bundle_option_array = call_user_func_array('array_merge', $bundle_option);
$price =  Mage::Helper('airhotels/bundle')->getBundlePrice($productid,$bundle_option_array);

my helper file is

public function getBundlePrice($productId,$bundle_option_array) {
$product = new Mage_Catalog_Model_Product();
$product->load($productId);
$price=0;
$selectionCollection = $product->getTypeInstance(true)->getSelectionsCollection($product->getTypeInstance(true)->getOptionsIds($product), $product);
foreach($selectionCollection as $option) 
{
if (in_array($option->getSelectionId(), $bundle_option_array)){
    $price += $option->price; 
}
}
return $price;
}

Concept: I built a 1-D array from the 2-D array(the question). from the function in helper we can get all the selection id of a bundle product . By matching (using in_array) we can calculate the price for our custom selected products.

Upvotes: 1

Moshe Shperling
Moshe Shperling

Reputation: 89

Here is the magento way:

$_product     = $this->getProduct();
$_priceModel  = $_product->getPriceModel();

list($_minimalPriceTax, $_maximalPriceTax) = $_priceModel->getTotalPrices($_product, null, null, false);
list($_minimalPriceInclTax, $_maximalPriceInclTax) = $_priceModel->getTotalPrices($_product, null, true, false);

Assuming that $this->getProduct() returns Catalog/Product Model. Works both with fixed and dynamic price types even compatible with Configurable Bundle extention. Taken from design/base/default/template/bundle/catalog/product/price.phtml

Upvotes: 1

teotwawki
teotwawki

Reputation: 80

Although I'm sure you have figured out what you needed several year ago I'm not quite sure where in the accepted answer you would put your params.

What I found was that you can get the price for a bundle product with getFinalPrice() just like any other product, but you can set the selected options using the catalog/product helper.

    $_product = Mage::getModel('catalog/product')->load($this->getRequest()->getPost()['product'];
    $productHelper = $this->helper('catalog/product');
    //getpost() contains the array you mentioned when you click add to cart
    $_configuredProducts = $_product->getTypeInstance(true)->processConfiguration(new Varien_Object($this->getRequest()->getPost()), $_product,Mage_Catalog_Model_Product_Type_Abstract::PROCESS_MODE_FULL ); 
    echo $_product->getFinalPrice();

Upvotes: 0

Erfan
Erfan

Reputation: 3019

You can use the built-in static method calculatePrice of Mage_Bundle_Model_Product_Price like so:

if ($product->getTypeId() == Mage_Catalog_Model_Product_Type::TYPE_BUNDLE){

        $pricemodel = Mage::getModel('bundle/product_price');

        $price = $pricemodel::calculatePrice(
            $product->getData('price'),
            $product->getSpecialPrice(),
            $product->getSpecialPriceFrom(),
            $product->getSpecialPriceTo(),
            false,
            Mage::app()->getStore()->getWebsite()->getId(),
            Mage::getSingleton('customer/session')->getCustomer()->getGroupId(),
            $product->getId()
        );

        $finalprice = $this->helper('core')->currencyByStore(Mage::helper('tax')->getPrice($product, $price));

    }

Upvotes: 2

jissereitsma
jissereitsma

Reputation: 122

@Kevin, great work. I personally needed a slight modification. In Magento 1.7.0.2, the function getSelectionPreFinalPrice() actually calls upon getSelectionPrice() which calls upon getSelectionFinalTotalPrice() - but in that last part the price is calculated with the final price (so including tier-pricing and special prices) and not the original price.

I applied the following snippet to get that original price (without tier-pricing and without special prices):

$_normalPrice = 0;
$_options = $_priceModel->getOptions($_product);
foreach($_options as $_option) {
    $_selection = $_option->getDefaultSelection();
    if ($_selection === null) continue;
    $_normalPrice = $_normalPrice + $_selection->getPrice();
}

Upvotes: 1

Emre colak
Emre colak

Reputation: 76

Something like this should also work:

public function getDisplayPrice($product) {
    if($product->getFinalPrice()) {
        return $product->getFormatedPrice();
    } else if ($product->getTypeId() == Mage_Catalog_Model_Product_Type::TYPE_BUNDLE) {
        $optionCol= $product->getTypeInstance(true)
                            ->getOptionsCollection($product);
        $selectionCol= $product->getTypeInstance(true)
                               ->getSelectionsCollection(
            $product->getTypeInstance(true)->getOptionsIds($product),
            $product
        );
        $optionCol->appendSelections($selectionCol);
        $price = $product->getPrice();

        foreach ($optionCol as $option) {
            if($option->required) {
                $selections = $option->getSelections();
                $minPrice = min(array_map(function ($s) {
                                return $s->price;
                            }, $selections));
                if($product->getSpecialPrice() > 0) {
                    $minPrice *= $product->getSpecialPrice()/100;
                }

                $price += round($minPrice,2);
            }  
        }
        return Mage::app()->getStore()->formatPrice($price);
    } else {
        return "";
    }
}

Upvotes: 6

Kevin
Kevin

Reputation: 1240

// load product
$product = new Mage_Catalog_Model_Product();
$product->load(165);
$priceModel = $product->getPriceModel();

// get options
$block = Mage::getSingleton('core/layout')->createBlock('bundle/catalog_product_view_type_bundle');
$options = $block->setProduct($product)->getOptions();

$price = 0;
foreach ($options as $option) {
  $selection = $option->getDefaultSelection();

  if ($selection === null) {
    continue;
  }

  $price += $priceModel->getSelectionPreFinalPrice($product, $selection, $selection->getSelectionQty());
}

or, you can use my magento module: https://github.com/head82/KH_ExtendedBundlePrice tested with magento 1.7

Upvotes: 1

Related Questions