Ottieni il prezzo più basso e più alto possibile per un prodotto configurabile


8

Quale sarebbe un buon modo per recuperare i prezzi più bassi e più alti possibili per un determinato prodotto configurabile, in base alle sue opzioni disponibili?

Ad esempio una maglietta è disponibile nelle seguenti misure e prezzi:

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

Voglio ottenere un array in questo modo:

array(10, 30)

La mia idea migliore finora è caricare l'istanza del tipo di prodotto configurabile e utilizzarla getUsedProducts, quindi creare una serie di prezzi, ordinare e suddividere.

Dovrebbe funzionare, tuttavia deve essere eseguito sul modello dell'elenco prodotti, quindi deve essere semi efficiente.

Qualcun altro là fuori ha affrontato questo problema prima?

EDIT - che non funzionerà poiché desidero il valore di prezzo configurabile, ovvero il prezzo aggiuntivo che magento mette in cima al prezzo di prodotto configurabile

Risposte:


13

Prova questo approccio. utilizzare l'array di configurazione utilizzato dagli elenchi a discesa degli attributi per modificare il prezzo del prodotto configurabile. Supponiamo che $productIdsia l'ID del prodotto configurabile.

$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
Non sembra che funzionerà se il prezzo è basato su più attributi. Ad esempio, se c'è un prezzo aggiuntivo per la taglia "XL" e un prezzo aggiuntivo per il materiale "argento", questo non otterrà il prezzo del prodotto XL Silver.
Laizer,

@Laizer ho provato con un prodotto con 2 attributi e funziona perfettamente. Potete fornire una configurazione che non funziona con questo metodo?
Marius

1
se ogni attributo si aggiunge al prezzo base, questo metodo non raccoglierà la combinazione delle due aggiunte. L'ho appena testato su un prodotto configurabile con due attributi che incidono sul prezzo e ho scoperto che non ha ottenuto il prezzo massimo. Ho anche testato il metodo che suggerisci su magento.stackexchange.com/questions/9665/… e che uno funziona bene, aggiungendo l'impatto di entrambi gli attributi.
Laizer,

Concordo. Questo non sembra funzionare per più configurazioni. opzioni.
Greg Nickoloff,

10

Uno più semplice.

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
                }

Credo che funzioni, ma solo nel caso in cui il prezzo del prodotto semplice corrisponda al prezzo di quel prodotto quando acquistato come una selezione di un configurabile. Non mi è chiaro che deve corrispondere.
Laizer,

Questo ha funzionato perfettamente per me poiché i prezzi dei nostri prodotti configurabili sono esattamente gli stessi dei prodotti semplici che costituiscono i nostri configurabili. Vale a dire che trattiamo i nostri prodotti configurabili come semplici contenitori che contengono prodotti semplici. Su Magento 1.9, i prodotti configurabili nelle pagine di elenco dei prodotti non visualizzano il prezzo più basso, motivo per cui questo codice è stato utile (volevamo visualizzare un'etichetta "A partire da ____" invece del prezzo normale del prodotto).
Aquarelle,

5

Questa risposta , anche di @Marius, a una domanda simile è una buona base su cui lavorare. Usandolo, ecco una soluzione a questo problema che tiene conto del potenziale per prodotti configurabili con più attributi che cambiano il prezzo.

L'ho scritto come funzione che accetta un ID prodotto configurabile e restituisce una stringa da un minimo a un prezzo massimo. Dovrebbe essere abbastanza chiaro come lavorare nel contesto di cui hai bisogno.

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

Questo farà il trucco, sebbene non sia l'esempio migliore

<?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
Questo fa l'errore di presumere che il prezzo del prodotto semplice sia uguale al prezzo dell'opzione configurata, non una garanzia.
Laizer,

1

Usando EE 1.14, stavo ottenendo numeri "divertenti" usando i metodi proposti sopra per qualche ragione. Il $childPriceLoweste $childPriceHighestnon stavano restituendo i valori minimi e massimi veri per tutto il tempo. A volte, con più opzioni di configurazione, ecc. Ho visto valori intermedi.

Ho finito per usare questo:

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

Quindi più tardi, questo per fare eco alla gamma:

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

(ad es. "$ 10,00 - $ 30,00")


0

Puoi anche provare questo semplice codice per ottenere il prezzo più alto / più basso secondo le tue necessità

$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;
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.