Harga Produk Magento yang Dapat Dikonfigurasi Mengesampingkan Harga Produk Sederhana

21

Saya memiliki produk yang diatur secara identik (sejauh yang saya tahu) dan semuanya diimpor dengan template CSV universal.

  • Harga yang dapat dikonfigurasi adalah 29,99
  • Lengan Pendek Produk Sederhana Terkait adalah 29,99
  • Lengan Panjang Produk Terkait yang Berhubungan adalah 39,99

Faktur baru-baru ini menagih produk lengan panjang ( ZTWS-SBLS-XL ) yang memiliki harga 39,99 dengan harga produk yang dapat dikonfigurasi sebesar 29,99. Bagaimana saya bisa memaksa harga produk sederhana untuk mengesampingkan harga produk yang dapat dikonfigurasi? Kedua produk di bawah ini diatur secara identik dengan produk yang dapat dikonfigurasi induknya dan sebagai produk sederhana.

Faktur:

Item             Sku             Qty    Subtotal
Item one         ZLOB-SBLS-XL    1      $39.99
Item Two         ZTWS-SBLS-XL    1      $29.99

EDIT: Masih bekerja untuk menyelesaikan ini. Apa yang akan menyebabkan Magento lebih memilih harga produk sederhana daripada harga produk yang dapat dikonfigurasi atau harga atribut produk terkait?

TylersSN
sumber
Bisakah saya mendapatkan bantuan magento.stackexchange.com/q/291238/57334 @TylersSN
zus

Jawaban:

18

Ketika Anda membuat produk yang dapat dikonfigurasi, tidak peduli berapa harga produk sederhana - harga ini diabaikan sepenuhnya. Jadi jika Anda ingin menjual produk A sederhana yang memiliki harga $ 29,99 dan produk sederhana B ($ 39,99) maka Anda harus membuat produk yang dapat dikonfigurasi, tetapkan harganya menjadi $ 29,99 dan buka tab produk terkait . Tambahkan produk yang ingin Anda kaitkan dengan produk yang dapat dikonfigurasi ini. Setelah menambahkannya, sebuah blok bernama Konfigurasi atribut produk super muncul yang berisi opsi dan perbedaan harga. Biarkan produk Harga kosong dan masukkan 10 (+ $ 10) ke bidang harga produk B dan voila: produk sederhana berbeda punya harga berbeda.

Sebenarnya ada ekstensi yang memungkinkan Anda untuk menggunakan harga produk sederhana alih-alih perbedaan harga, tetapi agak sulit untuk diatur. Karena ini ekstensi gratis, saya harap tidak ada yang mengeluh tentang saya menempelkan tautannya di sini:

https://github.com/organicinternet/magento-configurable-simple

Segera
sumber
Anda membantu saya memahami masalah saya. Saya telah memperbarui skema penetapan harga saya sehingga produk ditetapkan ke harga 29,99. Dari produk terkait, kami memasang $ 10 hingga atribut lengan panjang dan $ 2 untuk> = 2x atribut. Yang menarik adalah bahwa ini berfungsi untuk beberapa produk sementara tidak bekerja pada produk yang dapat dikonfigurasi lainnya.
TylersSN
Untuk produk yang tidak berfungsi, magento lebih suka harga produk sederhana daripada harga yang dapat dikonfigurasi apakah ditetapkan pada produk itu sendiri atau dalam harga atribut produk terkait.
TylersSN
5
Ekstensi ini omong kosong dan buggy.
Alireza Fallah
Bisakah saya mendapatkan bantuan terkait produk yang dapat dikonfigurasi magento.stackexchange.com/q/291238/57334 @Pronto
zus
16

Jadi, saya menggunakan kode di bawah ini dalam kombinasi dengan ekstensi seperti produk organik sederhana yang dapat dikonfigurasi.

Kode di bawah ini dimaksudkan untuk proses keranjang / checkout, pada dasarnya, ini merupakan pembaruan untuk model harga yang dapat dikonfigurasi yang melewati perhitungan harga ke produk sederhana jika produk telah ditambahkan ke keranjang --- solusi ini TIDAK TIDAK menampilkan harga pada halaman produk itu sendiri (namun ada banyak ekstensi yang sudah melakukannya).

Perbarui aplikasi / kode / inti / Penyihir / Katalog / Model / Produk / Jenis / Dapat Dikonfigurasi / Harga.php (idealnya Anda menggunakan ekstensi atau penggantian lokal dalam aplikasi / kode / lokal)

Perbarui metode: getFinalPrice, ubah ke

public function getFinalPrice($qty=null, $product)
{
    //Start edit
    $selectedAttributes = array();
    if ($product->getCustomOption('attributes')) {
        $selectedAttributes = unserialize($product->getCustomOption('attributes')->getValue());
    }
    //End edit
    if (sizeof($selectedAttributes)) return $this->getSimpleProductPrice($qty, $product);

    if (is_null($qty) && !is_null($product->getCalculatedFinalPrice())) {
        return $product->getCalculatedFinalPrice();
    }

    $basePrice = $this->getBasePrice($product, $qty);
    $finalPrice = $basePrice;
    $product->setFinalPrice($finalPrice);
    Mage::dispatchEvent('catalog_product_get_final_price', array('product' => $product, 'qty' => $qty));
    $finalPrice = $product->getData('final_price');

    $finalPrice += $this->getTotalConfigurableItemsPrice($product, $finalPrice);
    $finalPrice += $this->_applyOptionsPrice($product, $qty, $basePrice) - $basePrice;
    $finalPrice = max(0, $finalPrice);

    $product->setFinalPrice($finalPrice);
    return $finalPrice;
}

Kemudian tambahkan fungsi ini tepat di bawah getFinalPrice:

public function getSimpleProductPrice($qty=null, $product)
    {
        $cfgId = $product->getId();
        $product->getTypeInstance(true)
            ->setStoreFilter($product->getStore(), $product);
        $attributes = $product->getTypeInstance(true)
            ->getConfigurableAttributes($product);
        $selectedAttributes = array();
        if ($product->getCustomOption('attributes')) {
            $selectedAttributes = unserialize($product->getCustomOption('attributes')->getValue());
        }
        $db = Mage::getSingleton('core/resource')->getConnection('core_read');
        $dbMeta = Mage::getSingleton('core/resource');
        $sql = <<<SQL
SELECT main_table.entity_id FROM {$dbMeta->getTableName('catalog/product')} `main_table` INNER JOIN
{$dbMeta->getTableName('catalog/product_super_link')} `sl` ON sl.parent_id = {$cfgId}
SQL;
        foreach($selectedAttributes as $attributeId => $optionId) {
            $alias = "a{$attributeId}";
            $sql .= ' INNER JOIN ' . $dbMeta->getTableName('catalog/product') . "_int" . " $alias ON $alias.entity_id = main_table.entity_id AND $alias.attribute_id = $attributeId AND $alias.value = $optionId AND $alias.entity_id = sl.product_id";
        }
        $id = $db->fetchOne($sql);
        return Mage::getModel("catalog/product")->load($id)->getFinalPrice($qty);
    }

Anda dapat melihat, jika pengguna telah "menyesuaikan" produk (IE, opsi yang dapat dikonfigurasi yang dipilih), kami menentukan produk sederhana yang terkait dan memberikan kontrol ke model penetapan harganya, jika tidak, jika produk tersebut tidak "disesuaikan" (yaitu, kami Sedang browsing di halaman produk) kami melanjutkan seperti biasa

Alan
sumber
jawaban ini genius, bravo!
pixiemedia
5

Menggunakan Magento Versi 1.9.2.2

Mungkin solusi yang sedikit lebih baik, gunakan pendekatan 'Pengamat' alih-alih meretas inti atau bahkan mengesampingkan kelas Harga Model default yaitu aplikasi / kode / inti / Penyihir / Katalog / Model / Produk / Jenis / Dapat Dikonfigurasi / Price.php

Yang harus Anda lakukan adalah menggunakan kode Alan di dalam Pengamat yang baru dibuat, satu-satunya perbedaan adalah bukannya mengembalikan

Mage::getModel("catalog/product")->load($id)->getFinalPrice($qty);

Ganti dengan yang berikut ini:

$fp = Mage::getModel("catalog/product")->load($id)->getFinalPrice($qty);
return $product->setFinalPrice($fp);

Ikuti Observer.php ini

class YourFolderinLOCAL_YourModulename_Model_Observer 
{

     public function simpleProductPrice(Varien_Event_Observer $observer) {
        $event   = $observer->getEvent();
        $product = $event->getProduct();
        $qty     = $event->getQty();
        //Mage::log($observer, null, 'confPricing.log');
        // process percentage discounts only for simple products


            $selectedAttributes = array();
            if ($product->getCustomOption('attributes')) {
                Mage::log('yes-----', null, 'confPricing.log');
                $selectedAttributes = unserialize($product->getCustomOption('attributes')->getValue());
            }

            if (sizeof($selectedAttributes)) return $this->getSimpleProductPrice($qty, $product);



    }


    public function getSimpleProductPrice($qty=null, $product)
    {

        $cfgId = $product->getId();
        $product->getTypeInstance(true)
            ->setStoreFilter($product->getStore(), $product);
        $attributes = $product->getTypeInstance(true)
            ->getConfigurableAttributes($product);
        $selectedAttributes = array();
        if ($product->getCustomOption('attributes')) {
            $selectedAttributes = unserialize($product->getCustomOption('attributes')->getValue());
        }
        $db = Mage::getSingleton('core/resource')->getConnection('core_read');
        $dbMeta = Mage::getSingleton('core/resource');
        $sql = <<<SQL
SELECT main_table.entity_id FROM {$dbMeta->getTableName('catalog/product')} `main_table` INNER JOIN
{$dbMeta->getTableName('catalog/product_super_link')} `sl` ON sl.parent_id = {$cfgId}
SQL;
        foreach($selectedAttributes as $attributeId => $optionId) {
            $alias = "a{$attributeId}";
            $sql .= ' INNER JOIN ' . $dbMeta->getTableName('catalog/product') . "_int" . " $alias ON $alias.entity_id = main_table.entity_id AND $alias.attribute_id = $attributeId AND $alias.value = $optionId AND $alias.entity_id = sl.product_id";
        }
        $id = $db->fetchOne($sql);
        //Mage::log(Mage::getModel("catalog/product")->load($id)->getFinalPrice($qty), null, 'confPricing.log');
        //return 
        $fp = Mage::getModel("catalog/product")->load($id)->getFinalPrice($qty);
        return $product->setFinalPrice($fp);
    }


}

Config.xml

<?xml version="1.0"?>
<config> 
 <modules>
        <YourFolderinLOCAL_YourModulename>
            <version>0.0.1</version>
        </YourFolderinLOCAL_YourModulename>
    </modules>
    <global>
        <models>
            <YourFolderinLOCALYourModulename><!-- Al lovwercase in my case -->
                <class>Your_Model</class><!-- not needed in my case -->
            </YourFolderinLOCALYourModulename>
        </models>

    </global>
    <frontend>
    <events>
            <catalog_product_get_final_price>
                <observers>
                    <YourFolderinLOCAL_YourModulename_model_observer>
                        <type>singleton</type>
                        <class> YourFolderinLOCAL_YourModulename_Model_Observer</class>
                        <method>simpleProductPrice</method>
                    </YourFolderinLOCAL_YourModulenameg_model_observer>
                </observers>
            </catalog_product_get_final_price>

        </events>
        </frontend>
</config>

Semoga ini bisa menyelesaikan masalah .. :)

Zeeshan
sumber
2

Jika produk sederhana memiliki harga yang berbeda tetapi diatur terhadap produk yang dapat dikonfigurasi tanpa pengaturan harga, baik tetap atau persentase, maka harga produk yang dapat dikonfigurasi akan diambil. Tidak peduli produk mana yang dibeli harga mereka tampaknya tidak diperhitungkan.

Untuk memperbarui ini cukup masuk ke produk induk di bagian admin, lalu di bawah tab Associated ProductsAnda dapat memperbarui harga setiap produk anak untuk menambahkan harga tambahan ke harga produk orangtua.

David Manners
sumber
Hai David, saya sudah mencoba ini. Upaya saya saat ini terdiri dari menetapkan harga produk yang dapat dikonfigurasi menjadi $ 0,00 dan dari bagian Produk terkait saya mencoba untuk menetapkan harga tetap $ 29,99 untuk atribut lengan pendek dan $ 39,99 untuk kemeja lengan panjang. Untuk alasan apa pun, masih ada satu produk yang dapat dikonfigurasi (lengan panjang) yang ingin mengenakan biaya $ 29,99 meskipun harga tetap DAN harga yang ditetapkan dalam produk sederhana itu sendiri. Terima kasih atas tanggapan Anda.
TylersSN
@ user1812580 dapatkah Anda melihat produk ini di admin atau di ujung depan saja?
David Manners
Saya dapat melihatnya sebagai produk sederhana terpisah yang terkait dengan produk yang dapat dikonfigurasi.
TylersSN
Hai David, saya telah memperbarui skema penetapan harga sebagaimana tercantum dalam tanggapan saya terhadap @Pronto. Semoga itu akan membantu Anda membantu saya?
TylersSN
@ Davidvider Saya sudah mencoba memperbarui harga saya melalui bagian Konfigurasi Atribut Super pada produk yang dapat dikonfigurasi. Namun, harga hanya memperbarui pada kotak TOP info-info (Di mana sku, nama produk, dll.) Ketika Anda mengklik variasi. Adakah tips tentang cara mendapatkan kotak harga yang lebih rendah untuk memperbarui juga?
Elva Sandoval
2

Saya juga mengalami masalah yang sama dan saya memperbaiki dengan menggunakan kode di bawah ini. Ini akan bekerja di sisi admin juga jika Anda memesan dari admin (untuk pesanan telepon)

Amati acara ini,

sales_quote_item_set_product 

dan tambahkan kode di bawah ini di Observer.php Anda

public function loadQuote(Varien_Event_Observer $observer)
            {

                $event      = $observer->getEvent();
                $quote_item = $event->getQuoteItem();
                $storeId    = $quote_item->getStoreId();
                $item       = $observer->getQuoteItem();
                $product    = $observer->getProduct();
                $sku        = $product->getSku();
                $productDetails     =  Mage::getModel('catalog/product')
                            ->setStoreId($storeId)
                            ->loadByAttribute('sku',$sku);

                $price      = $productDetails->getPrice();
                $sprice     = $productDetails->getFinalPrice();

                $item->setOriginalCustomPrice($sprice);
                $item->setOriginalPrice($price);

            }

Ini akan mendapatkan harga produk terkait dan disimpan dalam kutipan.

Elavarasan
sumber
+1 untuk $item->setOriginalCustomPrice($sprice);dan $item->setOriginalPrice($price);, yang memungkinkan beberapa item yang dapat dikonfigurasi yang mengarah ke produk yang sama, dalam keranjang, dengan harga yang berbeda.
Niloct
2

Silakan ikuti langkah-langkah di bawah ini untuk mengubah harga atribut super

Pertama Gunakan pengamat "catalog_product_get_final_price". Jadikan pengamat seperti ini:

Buka modul config.xml Anda dan gunakan kode di bawah ini:

<events>
    <catalog_product_get_final_price>
        <observers>
            <Setblue_Banner_Model_Observer>
                <type>singleton</type>
                <class>Setblue_Banner_Model_Observer</class>
                <method>getFinalPrice</method>
            </Setblue_Banner_Model_Observer>
        </observers>
    </catalog_product_get_final_price>
</events>

Sekarang buat file Observer.php dalam model dan kode sebelumnya di bawah ini

<?php
class Setblue_Banner_Model_Observer
{

 public function getFinalPrice(Varien_Event_Observer $observer) {

  $event   = $observer->getEvent();
        $product = $event->getProduct();
        $qty     = $event->getQty();

  $selectedAttributes = array();
  if ($product->getCustomOption('attributes')) {
   Mage::log('yes-----', null, 'confPricing.log');
   $selectedAttributes = unserialize($product->getCustomOption('attributes')->getValue());
  }

  if (sizeof($selectedAttributes)) return $this->getSimpleProductPrice($qty, $product);

    }

 public function getSimpleProductPrice($qty=null, $product)
    {

  $cfgId = $product->getId();
        $product->getTypeInstance(true)
            ->setStoreFilter($product->getStore(), $product);
        $attributes = $product->getTypeInstance(true)
            ->getConfigurableAttributes($product);
        $selectedAttributes = array();
        if ($product->getCustomOption('attributes')) {
            $selectedAttributes = unserialize($product->getCustomOption('attributes')->getValue());
        }
        $db = Mage::getSingleton('core/resource')->getConnection('core_read');
        $dbMeta = Mage::getSingleton('core/resource');
        $sql = <<<SQL
SELECT main_table.entity_id FROM {$dbMeta->getTableName('catalog/product')} `main_table` INNER JOIN
{$dbMeta->getTableName('catalog/product_super_link')} `sl` ON sl.parent_id = {$cfgId}
SQL;
        foreach($selectedAttributes as $attributeId => $optionId) {
            $alias = "a{$attributeId}";
            $sql .= ' INNER JOIN ' . $dbMeta->getTableName('catalog/product') . "_int" . " $alias ON $alias.entity_id = main_table.entity_id AND $alias.attribute_id = $attributeId AND $alias.value = $optionId AND $alias.entity_id = sl.product_id";
        }
        $id = $db->fetchOne($sql);
        //Mage::log(Mage::getModel("catalog/product")->load($id)->getFinalPrice($qty), null, 'confPricing.log');
        //return
        $fp = Mage::getModel("catalog/product")->load($id)->getFinalPrice($qty);
        return $product->setFinalPrice($fp);
 }

}

?>

Sekarang buka aplikasi / desain / antarmuka / default / tema Anda / templat / katalog / produk / tampilan / jenis / opsi / konfigurasi.phtml dan rekatkan kode di bawah ini di mana saja dalam file

<ul class="productIds" style="display:none;">
    <?php
        $configurableProduct = Mage::getModel('catalog/product')->load($_product->getId());
        $childProducts = Mage::getModel('catalog/product_type_configurable')->getUsedProducts(null,$configurableProduct);
        foreach($childProducts as $child) {
            $_productObj = Mage::getModel('catalog/product')->load($child->getId());
            ?>
            <li id='simple_<?php echo $child->getId(); ?>'><?php echo Mage::helper('core')->currency($_productObj->getFinalPrice()); ?></li>
        <?php   
        }
    ?>
</ul>

Sekarang buka js / varien / configurable.js dan ubah fungsi reloadPrice seperti di bawah ini atau Anda dapat mengganti seluruh fungsi ini juga

reloadPrice: function(){
    if (this.config.disablePriceReload) {
        return;
    }
    var price    = 0;
    var oldPrice = 0;
    for(var i=this.settings.length-1;i>=0;i--){
        var selected = this.settings[i].options[this.settings[i].selectedIndex];
        if(selected.config){
            price    += parseFloat(selected.config.price);
            oldPrice += parseFloat(selected.config.oldPrice);
        }
    }

    /* Edit Code By Chandresh Rana*/

     //optionsPrice.changePrice('config', {'price': price, 'oldPrice': oldPrice});
     optionsPrice.reload();

     var existingProducts = new Object();
     for(var i=this.settings.length-1;i>=0;i--)
     {
         var selected = this.settings[i].options[this.settings[i].selectedIndex];
         if(selected.config)
         {
            for(var iproducts=0;iproducts<selected.config.products.length;iproducts++)
            {
                var usedAsKey = selected.config.products[iproducts]+"";
                if(existingProducts[usedAsKey]==undefined)
                {
                    existingProducts[usedAsKey]=1;
                }
                else
                {
                    existingProducts[usedAsKey]=existingProducts[usedAsKey]+1;
                }
             }
         }
     }

     for (var keyValue in existingProducts)
     {
        for ( var keyValueInner in existingProducts)
         {
            if(Number(existingProducts[keyValueInner])<Number(existingProducts[keyValue]))
            {
                delete existingProducts[keyValueInner];
            }
         }
     }

     var sizeOfExistingProducts=0;
     var currentSimpleProductId = "";
     for ( var keyValue in existingProducts)
     {
        currentSimpleProductId = keyValue;
        sizeOfExistingProducts=sizeOfExistingProducts+1
     }

     if(sizeOfExistingProducts==1)
     {
        if($('product-price-'+this.config.productId)){
            $('product-price-'+this.config.productId).innerHTML = jQuery("#simple_"+currentSimpleProductId).html();
        }

     }
    // End Code By Chandresh Rana

    return price;

    if($('product-price-'+this.config.productId)){
        $('product-price-'+this.config.productId).innerHTML = price;
    }
    this.reloadOldPrice();
},

Kode Diambil dari: http://chandreshrana.blogspot.in/2016/03/set-simple-product-price-instead-of.html

Chandresh Rana
sumber
Bisakah saya mendapatkan bantuan mengenai produk yang dapat dikonfigurasi magento.stackexchange.com/q/291238/57334 @Chandresh Rana
zus