Obtenez le prix des options de produits configurables

9

J'ai besoin d'exporter tous les produits avec des prix depuis Magento 1.7.

Pour les produits simples ce n'est pas un problème, mais pour les produits configurables j'ai ce problème: Le prix exporté est le prix fixé pour le produit simple associé! Comme vous le savez, Magento ignore ce prix et utilise le prix du produit configurable plus les ajustements pour les options sélectionnées.

Je peux obtenir le prix du produit parent, mais comment calculer la différence en fonction des options sélectionnées?

Mon code ressemble à ceci:

foreach($products as $p)
   {
    $price = $p->getPrice();
            // I save it somewhere

    // check if the item is sold in second shop
    if (in_array($otherShopId, $p->getStoreIds()))
     {
      $otherConfProd = Mage::getModel('catalog/product')->setStoreId($otherShopId)->load($p->getId());
      $otherPrice = $b2cConfProd->getPrice();
      // I save it somewhere
      unset($otherPrice);
     }

    if ($p->getTypeId() == "configurable"):
      $_associatedProducts = $p->getTypeInstance()->getUsedProducts();
      if (count($_associatedProducts))
       {
        foreach($_associatedProducts as $prod)
         {
                            $p->getPrice(); //WRONG PRICE!!
                            // I save it somewhere
                        $size $prod->getAttributeText('size');
                        // I save it somewhere

          if (in_array($otherShopId, $prod->getStoreIds()))
           {
            $otherProd = Mage::getModel('catalog/product')->setStoreId($otherShopId)->load($prod->getId());

            $otherPrice = $otherProd->getPrice(); //WRONG PRICE!!
                            // I save it somewhere
            unset($otherPrice);
            $otherProd->clearInstance();
            unset($otherProd);
           }
         }
                     if(isset($otherConfProd)) {
                         $otherConfProd->clearInstance();
                            unset($otherConfProd);
                        }
       }

      unset($_associatedProducts);
    endif;
  }
Josef dit de réintégrer Monica
la source

Réponses:

13

Voici comment vous pouvez obtenir les prix des produits simples. L'exemple concerne un seul produit configurable mais vous pouvez l'intégrer dans votre boucle.
Il peut y avoir un problème de performances car il y a beaucoup de foreachboucles mais au moins vous avez un point de départ. Vous pouvez optimiser ultérieurement.

//the configurable product id
$productId = 126; 
//load the product - this may not be needed if you get the product from a collection with the prices loaded.
$product = Mage::getModel('catalog/product')->load($productId); 
//get all configurable attributes
$attributes = $product->getTypeInstance(true)->getConfigurableAttributes($product);
//array to keep the price differences for each attribute value
$pricesByAttributeValues = array();
//base price of the configurable product 
$basePrice = $product->getFinalPrice();
//loop through the attributes and get the price adjustments specified in the configurable product admin page
foreach ($attributes as $attribute){
    $prices = $attribute->getPrices();
    foreach ($prices as $price){
        if ($price['is_percent']){ //if the price is specified in percents
            $pricesByAttributeValues[$price['value_index']] = (float)$price['pricing_value'] * $basePrice / 100;
        }
        else { //if the price is absolute value
            $pricesByAttributeValues[$price['value_index']] = (float)$price['pricing_value'];
        }
    }
}

//get all simple products
$simple = $product->getTypeInstance()->getUsedProducts();
//loop through the products
foreach ($simple as $sProduct){
    $totalPrice = $basePrice;
    //loop through the configurable attributes
    foreach ($attributes as $attribute){
        //get the value for a specific attribute for a simple product
        $value = $sProduct->getData($attribute->getProductAttribute()->getAttributeCode());
        //add the price adjustment to the total price of the simple product
        if (isset($pricesByAttributeValues[$value])){
            $totalPrice += $pricesByAttributeValues[$value];
        }
    }
    //in $totalPrice you should have now the price of the simple product
    //do what you want/need with it
}

Le code ci-dessus a été testé sur CE-1.7.0.2 avec les données d'exemple Magento pour 1.6.0.0.
J'ai testé sur le produit Zolof The Rock And Roll Destroyer: T-shirt LOL Cat et il semble bien fonctionner. J'obtiens comme résultats les mêmes prix que ceux que je vois dans le frontend après avoir configuré le produit par SizeetColor

Marius
la source
3

Se pourrait - il que vous avez besoin de changer $ppour $prodle code ci - dessous?

 foreach($_associatedProducts as $prod)
         {
                            $p->getPrice(); //WRONG PRICE!!
Francis Kim
la source
2

Voici comment je le fais:

$layout = Mage::getSingleton('core/layout');
$block = $layout->createBlock('catalog/product_view_type_configurable');
$pricesConfig = Mage::helper('core')->jsonDecode($block->getJsonConfig());

De plus, vous pouvez le convertir en Varien_Object:

$pricesConfigVarien = new Varien_Object($pricesConfig);

Donc, fondamentalement, j'utilise la même méthode que celle utilisée pour calculer les prix de votre page de produit configurable dans le noyau magento.

Oleg Kudinov
la source
0

Je ne sais pas si cela aiderait, mais si vous ajoutez ce code à la page configurable.phtml, il devrait cracher les super attributs des produits configurables avec le prix de chaque option et son étiquette.

   $json =  json_decode($this->getJsonConfig() ,true);


    foreach ($json as $js){
        foreach($js as $j){

      echo "<br>";     print_r($j['label']); echo '<br/>';

            foreach($j['options'] as $k){
                echo '<br/>';     print_r($k['label']); echo '<br/>';
                print_r($k['price']); echo '<br/>';
            }
        }
    }
Egregory
la source