Nhận giá thấp nhất và cao nhất có thể cho một sản phẩm có thể định cấu hình


8

Điều gì sẽ là một cách tốt để lấy giá thấp nhất và cao nhất có thể cho một sản phẩm có thể định cấu hình nhất định - dựa trên các tùy chọn có sẵn của nó?

Ví dụ, áo phông có các kích cỡ và giá sau:

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

Tôi muốn có được một mảng như vậy:

array(10, 30)

Ý tưởng tốt nhất của tôi cho đến nay là tải phiên bản loại sản phẩm có thể định cấu hình và sử dụng getUsedProducts, sau đó tạo một mảng giá, sắp xếp và cắt lát.

Điều đó sẽ hoạt động, tuy nhiên điều này cần phải được chạy trên mẫu danh sách sản phẩm để nó cần phải bán hiệu quả.

Bất kỳ ai khác ngoài đó phải đối mặt với vấn đề này trước đây?

EDIT - sẽ không hoạt động vì tôi muốn giá trị định giá có thể định cấu hình, tức là magento giá phụ gia đặt lên trên giá sản phẩm có thể định cấu hình

Câu trả lời:


13

Hãy thử phương pháp này. sử dụng mảng cấu hình mà danh sách thả xuống thuộc tính sử dụng để thay đổi giá của sản phẩm có thể định cấu hình. Giả sử đó $productIdlà ID của sản phẩm có thể định cấu hình.

$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
Nó không giống như điều này sẽ hoạt động nếu giá được xây dựng từ nhiều thuộc tính. Ví dụ: nếu có giá bổ sung cho kích thước "XL" và giá bổ sung cho vật liệu "bạc" thì điều này sẽ không có giá của sản phẩm Bạc XL.
Laizer

@Laizer tôi đã thử nghiệm với một sản phẩm có 2 thuộc tính và nó có thể hoạt động được. Bạn có thể cung cấp một cấu hình không hoạt động với phương pháp này?
Marius

1
nếu mỗi thuộc tính thêm vào giá cơ sở, phương thức này sẽ không nhận được sự kết hợp của hai bổ sung. Tôi vừa thử nghiệm nó trên một sản phẩm có thể định cấu hình với hai thuộc tính ảnh hưởng đến giá và thấy rằng nó không có giá tối đa. Tôi cũng đã thử nghiệm phương pháp mà bạn đề xuất tại magento.stackexchange.com/questions/9665/ , và một phương pháp hoạt động tốt, thêm tác động của cả hai thuộc tính.
Laizer

Tôi đồng tình. Điều này dường như không hoạt động cho nhiều cấu hình. tùy chọn.
Greg Nickoloff

10

Một cái đơn giản hơn.

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
                }

Tôi tin rằng điều này hoạt động, nhưng chỉ trong trường hợp giá của sản phẩm đơn giản phù hợp với giá của sản phẩm đó khi được mua dưới dạng lựa chọn cấu hình. Không rõ ràng với tôi rằng nó phải phù hợp.
Laizer

Điều này làm việc hoàn hảo với tôi vì giá của các sản phẩm có thể định cấu hình của chúng tôi hoàn toàn giống với các sản phẩm đơn giản cấu thành cấu hình của chúng tôi. Điều đó có nghĩa là chúng tôi coi các sản phẩm có thể định cấu hình của mình chỉ là các thùng chứa các sản phẩm đơn giản. Trên Magento 1.9, các sản phẩm có thể định cấu hình trên các trang liệt kê sản phẩm không hiển thị giá thấp nhất, đó là lý do tại sao mã này có ích (chúng tôi muốn hiển thị nhãn "Thấp như ____" thay vì giá thông thường của sản phẩm).
Aquarelle

5

Câu trả lời này , cũng bởi @Marius, cho một câu hỏi tương tự là một cơ sở tốt để làm việc. Sử dụng điều đó, đây là một giải pháp cho vấn đề này có tính đến tiềm năng cho các sản phẩm có thể định cấu hình có nhiều thuộc tính thay đổi giá.

Tôi đã viết nó dưới dạng hàm lấy id sản phẩm có thể định cấu hình và trả về một chuỗi từ tối thiểu đến giá tối đa. Nó sẽ khá rõ ràng làm thế nào để làm việc với bối cảnh mà bạn cần.

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

Điều này sẽ thực hiện các mẹo, mặc dù nó không phải là ví dụ tốt nhất

<?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
Điều này làm cho sai lầm khi giả định giá của sản phẩm đơn giản giống như giá của tùy chọn được định cấu hình - không phải là một sự đảm bảo.
Laizer

1

Sử dụng EE 1.14, tôi đã nhận được những con số "hài hước" bằng cách sử dụng các phương pháp được đề xuất ở trên vì một số lý do. Các $childPriceLowest$childPriceHighestkhông trả về giá trị tối thiểu và tối đa thực sự mọi lúc. Đôi khi, với nhiều tùy chọn cấu hình, v.v. Tôi thấy các giá trị trung gian.

Tôi đã kết thúc bằng cách sử dụng này:

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

Sau đó, điều này để lặp lại phạm vi:

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

(ví dụ: "$ 10,00 - $ 30,00")


0

Bạn cũng có thể thử mã đơn giản này để có giá cao nhất / thấp nhất theo nhu cầu của bạn

$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;
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.