Erhalten Sie den niedrigsten und höchstmöglichen Preis für ein konfigurierbares Produkt

8

Was wäre ein guter Weg, um die niedrigsten und höchstmöglichen Preise für ein bestimmtes konfigurierbares Produkt zu erhalten - basierend auf den verfügbaren Optionen?

Zum Beispiel gibt es ein T-Shirt in folgenden Größen und Preisen:

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

Ich möchte ein Array wie folgt erhalten:

array(10, 30)

Meine bisher beste Idee ist es, die konfigurierbare Produkttypinstanz zu laden und zu verwenden getUsedProductsund dann eine Reihe von Preisen zu erstellen, zu sortieren und zu schneiden.

Das sollte funktionieren, muss jedoch auf der Produktlistenvorlage ausgeführt werden, damit es halb effizient ist.

Haben sich andere schon einmal mit diesem Problem befasst?

BEARBEITEN - das funktioniert nicht, da ich den konfigurierbaren Preiswert haben möchte, dh den additiven Preis, den Magento über den konfigurierbaren Produktpreis legt

Marty Wallace
quelle

Antworten:

13

Versuchen Sie diesen Ansatz. Verwenden Sie das Konfigurationsarray, mit dem die Attribut-Dropdowns den Preis des konfigurierbaren Produkts ändern. Nehmen wir an, dies $productIdist die ID des konfigurierbaren Produkts.

$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
quelle
1
Es sieht nicht so aus, als würde dies funktionieren, wenn der Preis aus mehreren Attributen aufgebaut ist. Wenn es beispielsweise einen Preisaufschlag für die Größe "XL" und einen Preisaufschlag für das Material "Silber" gibt, wird der Preis für das XL Silver-Produkt nicht ermittelt.
Laizer
@ Laizer Ich habe mit einem Produkt mit 2 Attributen getestet und es scheint zu funktionieren. Können Sie eine Konfiguration bereitstellen, die mit dieser Methode nicht funktioniert?
Marius
1
Wenn jedes Attribut zum Grundpreis addiert, wird bei dieser Methode die Kombination der beiden Additionen nicht erfasst. Ich habe es gerade an einem konfigurierbaren Produkt mit zwei preisbeeinflussenden Attributen getestet und festgestellt, dass es nicht den Höchstpreis erreicht hat. Ich habe auch die Methode getestet, die Sie unter magento.stackexchange.com/questions/9665/… vorschlagen , und diese funktioniert gut, indem ich die Auswirkungen beider Attribute hinzufüge.
Laizer
Ich stimme zu. Dies scheint bei mehreren Konfigurationen nicht zu funktionieren. Optionen.
Greg Nickoloff
10

Eine einfachere.

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
quelle
Ich glaube, dass dies funktioniert, aber nur in dem Fall, in dem der Preis des einfachen Produkts mit dem Preis dieses Produkts übereinstimmt, wenn es als Auswahl eines konfigurierbaren Produkts gekauft wird. Mir ist nicht klar, dass es passen muss.
Laizer
Dies hat bei mir perfekt funktioniert, da die Preise unserer konfigurierbaren Produkte genau die gleichen sind wie die einfachen Produkte, aus denen unsere konfigurierbaren Produkte bestehen. Das heißt, wir behandeln unsere konfigurierbaren Produkte lediglich als Behälter, die einfache Produkte enthalten. Unter Magento 1.9 zeigen konfigurierbare Produkte auf Produktlistenseiten nicht den niedrigsten Preis an, weshalb dieser Code nützlich war (wir wollten anstelle des regulären Produktpreises ein Etikett mit der Aufschrift "So niedrig wie ____" anzeigen).
Aquarelle
5

Diese Antwort , auch von @Marius, auf eine ähnliche Frage ist eine gute Grundlage, um daraus zu arbeiten. Hier ist eine Lösung für dieses Problem, die das Potenzial für konfigurierbare Produkte mit mehreren Attributen berücksichtigt, die den Preis ändern.

Ich habe es als Funktion geschrieben, die eine konfigurierbare Produkt-ID verwendet und eine Zeichenfolge von min bis max price zurückgibt. Es sollte ziemlich klar sein, wie man es in den Kontext einarbeitet, den Sie brauchen.

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
quelle
4

Dies wird den Trick tun, obwohl es nicht das beste Beispiel ist

<?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
quelle
1
Dies macht den Fehler anzunehmen, dass der Preis eines einfachen Produkts dem Preis der konfigurierten Option entspricht - keine Garantie.
Laizer
1

Mit EE 1.14 erhielt ich aus irgendeinem Grund "lustige" Zahlen mit den oben vorgeschlagenen Methoden. Die $childPriceLowestund $childPriceHighestgaben nicht immer die wahren Minimal- und Maximalwerte zurück. Manchmal sah ich mit mehreren Konfigurationsoptionen usw. Zwischenwerte.

Am Ende habe ich Folgendes verwendet:

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

Dann später, um den Bereich wiederzugeben:

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

(zB "$ 10.00 - $ 30.00")

Greg Nickoloff
quelle
0

Sie können diesen einfachen Code auch ausprobieren, um den höchsten / niedrigsten Preis gemäß Ihren Anforderungen zu erhalten

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