获得可配置产品的最低和最高价格


8

根据其可用选项,检索给定可配置产品的最低和最高价格的好方法是什么?

例如,一件T恤的尺寸和价格如下:

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

我想要一个像这样的数组:

array(10, 30)

到目前为止,我最好的想法是加载可配置产品类型实例并使用getUsedProducts,然后创建价格,排序和切片的数组。

那应该起作用,但是这需要在产品列表模板上运行,因此它必须是半有效的。

还有其他人以前遇到过这个问题吗?

编辑-这是行不通的,因为我想要可配置的价格值,即附加价格magento放在可配置的产品价格之上

Answers:


13

试试这种方法。使用属性下拉列表用来更改可配置产品价格的配置数组。假设这$productId是可配置产品的ID。

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

1
如果价格是由多个属性构成的,这似乎不起作用。例如,如果尺寸“ XL”有价格上涨,而材料“银”有价格上涨,那么这将无法获得XL银产品的价格。
Laizer 2014年

@Laizer我使用具有2个属性的产品进行了测试,并且可以正常工作。您可以提供不适用于此方法的配置吗?
马里乌斯

1
如果每个属性加到基价上,则此方法将不会选择两个加法的组合。我只是在具有两个影响价格的属性的可配置产品上对其进行了测试,发现它没有获得最高价格。我还在magento.stackexchange.com/questions/9665/…上测试了您建议的方法,该方法效果很好,并添加了这两个属性的影响。
Laizer 2014年

我同意。这似乎不适用于多个配置。选项。
格雷格·尼克洛洛夫

10

一个简单的。

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
                }

我相信这是可行的,但仅在简单产品的价格与以可配置形式选择时购买的产品价格相匹配的情况下才有效。我不清楚它必须匹配。
Laizer 2014年

这对我来说非常有效,因为我们可配置产品的价格与构成我们可配置产品的简单产品的价格完全相同。也就是说,我们将可配置产品视为仅容纳简单产品的容器。在Magento 1.9上,产品列表页面上的可配置产品不会显示最低价格,这就是为什么此代码派上用场的原因(我们希望显示“低至____”标签而不是产品的正常价格)。
Aquarelle

5

@Marius对此类似问题的答案也是一个很好的依据。使用该方法,这里是针对此问题的解决方案,其中考虑到具有多个可改变价格的属性的可配置产品的潜力。

我已将其编写为带有可配置产品ID的函数,并返回最小到最大价格的字符串。应该很清楚如何在所需的上下文中使用它。

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

}

4

尽管这不是最好的例子,但这可以解决问题

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

1
这会导致错误,即假定简单产品的价格与已配置选件的价格相同,而不是保证。
Laizer 2014年

1

使用EE 1.14,由于某种原因,使用上述方法获得了“有趣”的数字。在$childPriceLowest$childPriceHighest不回真正的最小值和最大值所有的时间。有时,具有多个配置选项等。我看到了中间值。

我最终使用了这个:

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

然后,稍后以回显范围:

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

(例如“ $ 10.00-$ 30.00”)


0

您还可以尝试使用此简单代码,根据需要获取最高价/最低价

$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;
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.