2012-07-03 4 views
3

J'ai un produit de paquet sous forme de tableau comme celui-ci: (extrais params quand AJOUTZ au panier)Comment obtenir le prix du produit Bundle dans Magento?

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

Comment pourrais-je obtenir le prix pour ce produit bundle?

Répondre

6

Quelque chose comme cela devrait aussi fonctionner:

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 ""; 
    } 
} 
+0

Il y a un petit problème avec votre code, "price" ne correspondra pas toujours au prix de l'option spécifiée (par exemple, vous pouvez avoir un produit dans un bundle qui a un prix de 50 $ mais dans le bundle '' selection_price_value'' pourrait être défini sur $ 10). – mludd

1
// 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()); 
} 

ou, vous pouvez utiliser mon module magento: https://github.com/head82/KH_ExtendedBundlePrice testé avec magento 1,7

+0

merci Kevin, bien que ce soit une vieille réponse, un module sur notre e-store utilise exactement votre code pour calculer le prix final des produits bundle, ça marche très bien mais si j'utilise getSingleton au lieu de getModel pour charger des produits, ça donne Erreur fatale: Appel à une méthode non définie Mage_Catalog_Model_Product_Type_Configurable :: getOptionsCollection() dans /var/www/html/app/code/core/Mage/Bundle/Block/Catalog/Product/View/Type/Bundle.php on line 54 – Haris

1

Vous pouvez utiliser le getMinimalPrice() et getMaximalPrice() fonctions dans la classe Mage_Bundle_Product_Price, qui sont écrites spécifiquement pour les produits bundle.

1

@Kevin, excellent travail. J'ai personnellement besoin d'une légère modification. Dans Magento 1.7.0.2, la fonction getSelectionPreFinalPrice() appelle effectivement getSelectionPrice() qui appelle getSelectionFinalTotalPrice() - mais dans cette dernière partie, le prix est calculé avec le prix final (y compris les prix de niveau et les prix spéciaux) et non le prix d'origine.

I appliqué l'extrait suivant pour obtenir ce prix initial (sans niveau-prix et sans prix spéciaux):

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

Vous pouvez utiliser la méthode statique intégrée calculatePrice de Mage_Bundle_Model_Product_Price comme ceci:

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

    } 
0

Bien que je sois sûr que vous avez compris ce dont vous aviez besoin il y a plusieurs années, je ne suis pas tout à fait sûr où dans la réponse acceptée vous mettriez vos paramètres. Ce que j'ai trouvé, c'est que vous pouvez obtenir le prix d'un produit bundle avec getFinalPrice() comme n'importe quel autre produit, mais vous pouvez définir les options sélectionnées en utilisant l'assistant catalogue/produit.

$_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(); 
1

Voici le chemin magento:

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

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

En supposant que le rendement $this->getProduct()Catalog/Product modèle. Fonctionne à la fois avec des types de prix fixes et dynamiques, même compatibles avec l'extension de bundle configurable. Tiré de design/base/default/modèle/bundle/catalogue/produit/price.phtml

0

Je l'ai résolu par sa propre méthode, pas sûr que son acceptable ou pas.send les valeurs de poste et l'ID du produit, le modèle retournera le prix.

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

mon fichier d'aide est

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: Je construit un tableau 1-D du tableau 2-D (la question). de la fonction dans helper nous pouvons obtenir tous les id de sélection d'un produit bundle. En faisant correspondre (en utilisant in_array), nous pouvons calculer le prix de nos produits sélectionnés sur mesure.

Questions connexes