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

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
                }
ajinkya.23
источник
Я считаю, что это работает, но только в том случае, если цена простого продукта совпадает с ценой этого продукта, когда он покупается как набор настраиваемых. Не понятно мне, что оно должно совпадать.
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";

}
Laizer
источник
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; ?>
brentwpeterson
источник
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;
Вивек Хандельвал
источник