Obtenez le prix le plus bas et le plus élevé possible pour un produit configurable

8

Quelle serait une bonne façon de récupérer les prix les plus bas et les plus élevés possibles pour un produit configurable donné - en fonction de ses options disponibles?

Par exemple, un t-shirt est disponible dans les tailles et les prix suivants:

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

Je veux obtenir un tableau comme ceci:

array(10, 30)

Jusqu'à présent, ma meilleure idée est de charger l'instance de type de produit configurable et de l'utiliser getUsedProducts, puis de créer un tableau de prix, de trier et de découper.

Cela devrait fonctionner, mais cela doit être exécuté sur le modèle de liste de produits, il doit donc être semi-efficace.

Y en a-t-il d'autres avant qui ont fait face à ce problème?

EDIT - cela ne fonctionnera pas car je veux la valeur de prix configurable, c'est-à-dire le prix additif que magento ajoute au prix de produit configurable

Marty Wallace
la source

Réponses:

13

Essayez cette approche. utilisez le tableau de configuration utilisé par les listes déroulantes d'attributs pour modifier le prix du produit configurable. Supposons que $productIdc'est l'ID du produit configurable.

$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
la source
1
Il ne semble pas que cela fonctionnera si le prix est construit à partir de plusieurs attributs. Par exemple, s'il y a un ajout de prix pour la taille "XL" et un ajout de prix pour le matériau "argent", cela n'obtiendra pas le prix du produit XL Silver.
Laizer
@Laizer j'ai testé avec un produit avec 2 attributs et il semble fonctionner. Pouvez-vous fournir une configuration qui ne fonctionne pas avec cette méthode?
Marius
1
si chaque attribut ajoute au prix de base, cette méthode ne reprendra pas la combinaison des deux ajouts. Je viens de le tester sur un produit configurable avec deux attributs ayant un impact sur le prix et j'ai constaté qu'il n'obtenait pas le prix maximum. J'ai également testé la méthode que vous proposez sur magento.stackexchange.com/questions/9665/… , et celle-ci fonctionne bien, en ajoutant l'impact des deux attributs.
Laizer
Je plussoie. Cela ne semble pas fonctionner pour plusieurs configurations. les options.
Greg Nickoloff
10

Un plus simple.

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
la source
Je crois que cela fonctionne, mais uniquement dans le cas où le prix du produit simple correspond au prix de ce produit lorsqu'il est acheté en tant que sélection d'un configurable. Pas clair pour moi que cela doit correspondre.
Laizer
Cela a parfaitement fonctionné pour moi car les prix de nos produits configurables sont exactement les mêmes que les produits simples qui constituent nos configurables. C'est-à-dire que nous traitons nos produits configurables comme de simples conteneurs contenant des produits simples. Sur Magento 1.9, les produits configurables sur les pages de listes de produits n'affichent pas le prix le plus bas, c'est pourquoi ce code est utile (nous voulions afficher une étiquette "Aussi bas que ____" au lieu du prix régulier du produit).
Aquarelle
5

Cette réponse , également par @Marius, à une question similaire est une bonne base de travail. En utilisant cela, voici une solution à ce problème qui prend en compte le potentiel de produits configurables ayant plusieurs attributs qui modifient le prix.

Je l'ai écrit comme une fonction qui prend un identifiant de produit configurable et renvoie une chaîne de prix min à max. Il devrait être assez clair comment le faire fonctionner dans le contexte dont vous avez besoin.

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
la source
4

Cela fera l'affaire, même si ce n'est pas le meilleur exemple

<?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
la source
1
Cela fait l'erreur de supposer que le prix d'un produit simple est le même que le prix de l'option configurée - pas une garantie.
Laizer
1

En utilisant EE 1.14, j'obtenais des nombres "drôles" en utilisant les méthodes proposées ci-dessus pour une raison quelconque. Le $childPriceLowestet $childPriceHighestne renvoyait pas tout le temps les vraies valeurs minimum et maximum. Parfois, avec plusieurs options de configuration, etc. J'ai vu des valeurs intermédiaires.

J'ai fini par utiliser ceci:

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

Plus tard, ceci pour faire écho à la plage:

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

(par exemple, "10,00 $ - 30,00 $")

Greg Nickoloff
la source
0

Vous pouvez également essayer ce code simple pour obtenir le prix le plus élevé / le plus bas selon vos besoins

$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
la source