Obtenga el precio más bajo y más alto posible para un producto configurable

8

¿Cuál sería una buena manera de recuperar los precios más bajos y más altos posibles para un producto configurable dado, en función de sus opciones disponibles?

Por ejemplo, una camiseta viene en los siguientes tamaños y precios:

Small - $10
Medium - $20
Large - $30

Quiero obtener una matriz así:

array(10, 30)

Mi mejor idea hasta ahora es cargar la instancia de tipo de producto configurable y usar getUsedProducts, luego crear una matriz de precios, ordenar y dividir.

Eso debería funcionar, sin embargo, esto debe ejecutarse en la plantilla de la lista de productos, por lo que debe ser semi eficiente.

¿Alguna otra persona ha enfrentado este problema antes?

EDITAR: eso no funcionará ya que quiero el valor de precio configurable, es decir, el precio aditivo que magento pone por encima del precio del producto configurable

Marty Wallace
fuente

Respuestas:

13

Prueba este enfoque. use la matriz de configuración que usan los menús desplegables de atributos para cambiar el precio del producto configurable. Asumamos que esa $productIdes la ID del producto configurable.

$product = Mage::getModel('catalog/product')->load($productId);
$block = Mage::app()->getLayout()->createBlock('catalog/product_view_type_configurable');
$block->setProduct($product);
$config = json_decode($block->getJsonConfig(), true);
$basePrice = $config['basePrice'];
$min = null;
$max = null;
foreach ($config['attributes'] as $aId=>$aValues){
    foreach ($aValues['options'] as $key=>$value){
        if (is_null($min) || $min>$value['price']){
            $min = $value['price'];
        }
        if (is_null($max) || $max<$value['price']){
            $max = $value['price'];
        }
    }
}
//until here we have the min and max price differences. Now just add the base price.
$min += $basePrice;
$max += $basePrice;
Marius
fuente
1
No parece que esto funcione si el precio se construye a partir de múltiples atributos. Por ejemplo, si hay una adición de precio para el tamaño "XL" y una adición de precio para el material "plata", esto no obtendrá el precio del producto XL Silver.
Laizer
@Laizer probé con un producto con 2 atributos y parece funcionar. ¿Puede proporcionar una configuración que no funcione con este método?
Marius
1
Si cada atributo se suma al precio base, este método no recogerá la combinación de las dos adiciones. Acabo de probarlo en un producto configurable con dos atributos que afectan el precio y descubrí que no obtuvo el precio máximo. También probé el método que sugieres en magento.stackexchange.com/questions/9665/… , y ese funciona bien, agregando el impacto de ambos atributos.
Laizer
Estoy de acuerdo. Esto no parece funcionar para múltiples configuraciones. opciones.
Greg Nickoloff
10

Una más simple

if($_product->isConfigurable()) // check if the product is configurable (u may check this in for loop of products)
                {
                    //get associative (child) products
                    $childProducts = Mage::getModel('catalog/product_type_configurable')->getUsedProducts(null,$_product);
                    $childPriceLowest = "";    
                    $childPriceHighest = "";       
                    foreach($childProducts as $child){
                        $_child = Mage::getModel('catalog/product')->load($child->getId());

                        if($childPriceLowest == '' || $childPriceLowest > $_child->getPrice() )
                        $childPriceLowest =  $_child->getPrice();

                        if($childPriceHighest == '' || $childPriceHighest < $_child->getPrice() )
                        $childPriceHighest =  $_child->getPrice();

                    }
                    $price_array = array($childPriceLowest,$childPriceHighest); // array containing required values
                }
ajinkya.23
fuente
Creo que esto funciona, pero solo en el caso en que el precio del producto simple coincida con el precio de ese producto cuando se compra como una selección de un configurable. No me queda claro que tiene que coincidir.
Laizer
Esto funcionó perfectamente para mí ya que los precios de nuestros productos configurables son exactamente los mismos que los productos simples que constituyen nuestros configurables. Es decir, tratamos nuestros productos configurables como simples contenedores que contienen productos simples. En Magento 1.9, los productos configurables en las páginas de listado de productos no muestran el precio más bajo, por lo que este código fue útil (queríamos mostrar una etiqueta de "Tan bajo como ____" en lugar del precio normal del producto).
Aquarelle
5

Esta respuesta , también de @Marius, a una pregunta similar es una buena base para trabajar. Usando eso, aquí hay una solución a este problema que tiene en cuenta el potencial de productos configurables que tienen múltiples atributos que cambian el precio.

Lo escribí como una función que toma una identificación de producto configurable y devuelve una cadena de precio mínimo a máximo. Debe quedar bastante claro cómo trabajarlo en el contexto que necesita.

function getPriceRange($productId) {

 $max = '';
 $min = '';

 $pricesByAttributeValues = array();

 $product = Mage::getModel('catalog/product')->load($productId); 
 $attributes = $product->getTypeInstance(true)->getConfigurableAttributes($product);
 $basePrice = $product->getFinalPrice();

 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'];
        }
    }
 }


 $simple = $product->getTypeInstance()->getUsedProducts();

 foreach ($simple as $sProduct){
    $totalPrice = $basePrice;

    foreach ($attributes as $attribute){

        $value = $sProduct->getData($attribute->getProductAttribute()->getAttributeCode());
        if (isset($pricesByAttributeValues[$value])){
            $totalPrice += $pricesByAttributeValues[$value];
        }
    }
    if(!$max || $totalPrice > $max)
        $max = $totalPrice;
    if(!$min || $totalPrice < $min)
        $min = $totalPrice;
 }

 return "$min - $max";

}
Laizer
fuente
4

Esto hará el truco, aunque no es el mejor ejemplo.

<?php $_configurable = $_product->getTypeInstance()->getUsedProductIds(); ?>
<?php $price_array = array(); $i=0; ?>
<?php foreach ($_configurable as $_config): ?>
    <?php $_simpleproduct = Mage::getModel('catalog/product')->load($_config); ?>
    <?php array_push($price_array, $_simpleproduct->getPrice()); ?>
<?php $i++; endforeach; ?>
<?php if(min($price_array) != max($price_array)): ?>
    <div class="price-box">
        <span id="product-price-<?php echo $_product->getId(); ?>" class="regular-price">
            <?php echo Mage::helper('core')->currency(min($price_array)); ?>
            <span class="price" style="padding: 0 5px; color: black;">-</span>
            <span class="final"><?php echo Mage::helper('core')->currency(max($price_array)); ?></span>
        </span>
    </div>
    <?php else: ?>
        <?php echo $this->getPriceHtml($_product, true); ?>
<?php endif; ?>
brentwpeterson
fuente
1
Esto comete el error de suponer que el precio del producto simple es el mismo que el precio de la opción configurada, no una garantía.
Laizer
1

Usando EE 1.14, estaba obteniendo números "divertidos" usando los métodos propuestos anteriormente por alguna razón. El $childPriceLowesty $childPriceHighestno estaban devolviendo los valores mínimos y máximos verdaderos todo el tiempo. A veces, con múltiples opciones de configuración, etc. Vi valores intermedios.

Terminé usando esto:

//get associated (child) products
$childProducts = Mage::getModel('catalog/product_type_configurable')
    ->getUsedProducts(null,$_product);

//cycle through child products, dump prices in an array.... 
foreach($childProducts as $child){  
   $_child = Mage::getModel('catalog/product')->load($child->getId());
   $childPrices[] = $_child->getPrice();
}

// concentrate the array to unique values and sort ascending....
$childPrices = array_unique($childPrices, SORT_NUMERIC);
sort($childPrices);     // array containing required values

Luego, más tarde, esto para hacer eco del rango:

<?php echo Mage::helper('core')->currency( $childPrices[0], true, false); ?>
<span class="config-price-divider"> - </span>
<?php echo Mage::helper('core')->currency( end($childPrices), true, false)?>

(por ejemplo, "$ 10.00 - $ 30.00")

Greg Nickoloff
fuente
0

También puede probar este código simple para obtener el precio más alto / más bajo según su necesidad

$childPriceHighest = '';
         $product = Mage::getModel('catalog/product')->load($productId);
        $childProducts = Mage::getSingleton('catalog/product_type_configurable')->getUsedProducts( null, $product );

        if ($childProducts) {
            foreach ($childProducts as $child) {
                $_child = Mage::getSingleton('catalog/product')->load($child->getId());
                if ($childPriceHighest == '' || $childPriceHighest < $_child->getPrice()) {
                    $childPriceHighest = $_child->getPrice();
                }
            }
        } else {
            $childPriceHighest = $product->getPrice();
        }

        return $childPriceHighest;
Vivek Khandelwal
fuente