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


8

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

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

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

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

array(10, 30)

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

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

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

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

Ответы:


13

Попробуйте этот подход. используйте массив config, который используется в раскрывающихся списках атрибутов, чтобы изменить цену настраиваемого продукта. Давайте предположим, что $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;

1
Не похоже, что это будет работать, если цена построена из нескольких атрибутов. Например, если будет добавлена ​​цена для размера «XL» и добавлена ​​цена для материала «серебро», это не даст цены на продукт XL Silver.
— Laizer

@ Laizer я протестировал с продуктом с 2 атрибутами, и он работает. Можете ли вы предоставить конфигурацию, которая не работает с этим методом?
— Мариус

1
если каждый атрибут добавляет к базовой цене, этот метод не подберет комбинацию двух добавлений. Я только что протестировал его на настраиваемом продукте с двумя влияющими на цену атрибутами и обнаружил, что он не получил максимальную цену. Я также протестировал метод, который вы предлагаете, на magento.stackexchange.com/questions/9665/… , и он работает хорошо, добавляя влияние обоих атрибутов.
— Laizer

Я согласен. Это не похоже на работу с несколькими конфигами. опции.
— Грег Николофф

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

Это прекрасно сработало для меня, так как цены на наши настраиваемые продукты точно такие же, как и на простые продукты, которые составляют наши настраиваемые. То есть мы рассматриваем наши настраиваемые продукты как просто контейнеры, которые содержат простые продукты. В Magento 1.9 настраиваемые продукты на страницах с перечнем продуктов не отображают самую низкую цену, поэтому этот код пригодился (мы хотели показать ярлык «Столь же ____» вместо обычной цены продукта).
— Aquarelle

5

Этот ответ , также @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";

}

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

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;
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.