Dapatkan harga serendah dan setinggi mungkin untuk produk yang dapat dikonfigurasi

8

Apa cara yang baik untuk mengambil harga serendah dan setinggi mungkin untuk produk yang dapat dikonfigurasi - berdasarkan pilihan yang tersedia?

Misalnya t-shirt tersedia dalam ukuran dan harga berikut:

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

Saya ingin mendapatkan array seperti ini:

array(10, 30)

Ide terbaik saya sejauh ini adalah memuat instance dan penggunaan jenis produk yang dapat dikonfigurasi getUsedProducts, kemudian membuat array harga, mengurutkan dan mengiris.

Itu harus bekerja, namun ini harus dijalankan pada templat daftar produk sehingga perlu semi efisien.

Adakah orang lain di luar sana yang menghadapi masalah ini sebelumnya?

EDIT - yang tidak akan berfungsi karena saya ingin nilai harga yang dapat dikonfigurasi yaitu harga tambahan yang ditambahkan di atas harga produk yang dapat dikonfigurasi

Marty Wallace
sumber

Jawaban:

13

Coba pendekatan ini. gunakan larik konfigurasi yang digunakan dropdown atribut untuk mengubah harga produk yang dapat dikonfigurasi. Mari kita asumsikan itu $productIdadalah ID dari produk yang dapat dikonfigurasi.

$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
sumber
1
Sepertinya ini tidak akan berfungsi jika harga dibangun dari beberapa atribut. Misalnya, jika ada tambahan harga untuk ukuran "XL" dan tambahan harga untuk bahan "perak" ini tidak akan mendapatkan harga produk XL Silver.
Laizer
@Laizer saya menguji dengan produk dengan 2 atribut dan itu berfungsi. Bisakah Anda memberikan konfigurasi yang tidak berfungsi dengan metode ini?
Marius
1
jika setiap atribut menambah harga dasar, metode ini tidak akan mengambil kombinasi dari dua penambahan. Saya baru saja mengujinya pada produk yang dapat dikonfigurasi dengan dua atribut yang mempengaruhi harga dan menemukan bahwa itu tidak mendapatkan harga maksimal. Saya juga menguji metode yang Anda sarankan di magento.stackexchange.com/questions/9665/… , dan yang satu berfungsi dengan baik, menambahkan dampak dari kedua atribut.
Laizer
Saya setuju. Ini sepertinya tidak berfungsi untuk banyak konfigurasi. pilihan.
Greg Nickoloff
10

Yang lebih sederhana.

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
sumber
Saya percaya ini berhasil, tetapi hanya dalam kasus di mana harga produk sederhana cocok dengan harga produk itu ketika dibeli sebagai pilihan yang dapat dikonfigurasi. Tidak jelas bagi saya bahwa itu harus cocok.
Laizer
Ini bekerja dengan baik bagi saya karena harga produk yang dapat dikonfigurasi kami persis sama dengan produk sederhana yang merupakan produk yang dapat dikonfigurasi. Artinya kami memperlakukan produk kami yang dapat dikonfigurasi hanya sebagai wadah yang menampung produk sederhana. Di Magento 1.9, produk yang dapat dikonfigurasi pada halaman daftar produk tidak menampilkan harga terendah, itulah sebabnya kode ini sangat berguna (kami ingin menampilkan label "Serendah ____" alih-alih harga reguler produk).
Aquarelle
5

Jawaban ini , juga oleh @Marius, untuk pertanyaan serupa adalah dasar yang baik untuk bekerja. Dengan menggunakan itu, inilah solusi untuk masalah ini yang memperhitungkan potensi produk yang dapat dikonfigurasi yang memiliki banyak atribut yang mengubah harga.

Saya telah menulisnya sebagai fungsi yang mengambil id produk yang dapat dikonfigurasi, dan mengembalikan serangkaian min ke harga maksimum. Seharusnya cukup jelas bagaimana cara mengerjakannya ke dalam konteks yang Anda butuhkan.

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

Ini akan melakukan trik, meskipun itu bukan contoh terbaik

<?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
sumber
1
Ini membuat kesalahan dengan mengasumsikan harga produk sederhana sama dengan harga opsi yang dikonfigurasi - bukan jaminan.
Laizer
1

Menggunakan EE 1.14, saya mendapatkan angka "lucu" menggunakan metode yang diusulkan di atas untuk beberapa alasan. The $childPriceLowestdan $childPriceHighesttidak mengembalikan nilai minimum dan maksimum yang sebenarnya sepanjang waktu. Terkadang, dengan beberapa opsi konfigurasi, dll. Saya melihat nilai menengah.

Saya akhirnya menggunakan ini:

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

Lalu nanti, ini untuk mengulangi kisaran:

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

(mis. "$ 10.00 - $ 30.00")

Greg Nickoloff
sumber
0

Anda juga dapat mencoba kode sederhana ini untuk mendapatkan harga tertinggi / terendah sesuai kebutuhan Anda

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