Obtenga el precio de las opciones de producto configurables

9

Necesito exportar todos los productos con precios de Magento 1.7.

Para productos simples esto no es problema, pero para productos configurables tengo este problema: ¡El precio exportado es el precio establecido para el producto simple asociado! Como sabe, Magento ignora este precio y utiliza el precio del producto configurable más los ajustes para las opciones seleccionadas.

Puedo obtener el precio del producto principal, pero ¿cómo calculo la diferencia según las opciones seleccionadas?

Mi código se parece a esto:

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 dice reinstalar a Mónica
fuente

Respuestas:

13

Aquí es cómo puede obtener los precios de los productos simples. El ejemplo es para un solo producto configurable, pero puede integrarlo en su bucle.
Puede haber un problema con el rendimiento porque hay muchos foreachbucles, pero al menos tiene un lugar para comenzar. Puede optimizar más tarde.

//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
}

El código anterior se probó en CE-1.7.0.2 con los datos de muestra de Magento para 1.6.0.0. Probé
el producto Zolof The Rock And Roll Destroyer: camiseta LOL Cat y parece que funciona. Obtengo como resultados los mismos precios que veo en la interfaz después de configurar el producto por SizeyColor

Marius
fuente
3

Podría ser que necesita cambiar $pa $proden el código de abajo?

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

Así es como lo hago:

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

Además, puede convertirlo a Varien_Object:

$pricesConfigVarien = new Varien_Object($pricesConfig);

Básicamente, estoy usando el mismo método que se utiliza para calcular los precios de su página de producto configurable en el núcleo de magento.

Oleg Kudinov
fuente
0

No estoy seguro de si esto ayudaría, pero si agrega este código a la página configurable.phtml, debería escupir los súper atributos de los productos configurables con el precio de cada opción y su etiqueta.

   $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
fuente