Получите самую низкую и самую высокую возможную цену за настраиваемый продукт


Какой был бы хороший способ получить самые низкие и самые высокие возможные цены на данный настраиваемый продукт - на основе его доступных опций?

Например, футболка поставляется в следующих размерах и ценах:

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

Я хочу получить массив примерно так:

array(10, 30)

Моя лучшая идея на данный момент - загрузить экземпляр настраиваемого типа продукта и использовать getUsedProducts, затем создать массив цен, отсортировать и нарезать.

Это должно сработать, однако для этого необходимо запускаться в шаблоне списка продуктов, поэтому он должен быть полуэффективным.

Кто-нибудь еще сталкивался с этой проблемой раньше?

РЕДАКТИРОВАТЬ - это не сработает, так как мне нужно настраиваемое значение цены, т.Е. добавочная цена, которую magento ставит поверх настраиваемой цены продукта

Author: Marty Wallace, 2013-09-08

6 answers

Попробуйте этот подход. используйте массив конфигурации, который раскрывающиеся списки атрибутов используют для изменения цены настраиваемого продукта. Давайте предположим, что $productId - это идентификатор настраиваемого продукта.

$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;
 13
Author: Marius, 2013-09-21 19:34:31

Более простой вариант.

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
                }
 10
Author: ajinkya.23, 2013-09-20 10:55:50

Этот ответ, также @Marius, на аналогичный вопрос является хорошей основой для работы. Используя это, вот решение этой проблемы, которое учитывает потенциал настраиваемых продуктов, имеющих несколько атрибутов, которые изменяют цену.

Я написал это как функцию, которая принимает настраиваемый идентификатор продукта и возвращает строку от минимальной до максимальной цены. Должно быть довольно ясно, как использовать это в нужном вам контексте.

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

}
 5
Author: Laizer, 2017-04-13 12:55:02

Это поможет, хотя это не лучший пример

<?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; ?>
 4
Author: brentwpeterson, 2013-09-09 15:23:25

Используя 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")

 1
Author: Greg Nickoloff, 2018-08-16 17:44:59

Вы также можете попробовать этот простой код, чтобы получить самую высокую/низкую цену в соответствии с вашими потребностями

$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;
 0
Author: Vivek Khandelwal, 2016-12-07 07:15:21