Basit Ürün Fiyatını Geçersiz Kılan Magento Yapılandırılabilir Ürün Fiyatı


21

Aynı şekilde ayarlanmış ürünlerim var (söyleyebileceğim kadarıyla) ve hepsi evrensel bir CSV şablonu ile içe aktarıldı.

  • Yapılandırılabilir fiyat 29.99
  • İlişkili Basit Ürün Kısa Kol 29.99
  • İlişkili Basit Ürün Uzun Kol 39.99

Bir fatura yakın zamanda , 29.99 yapılandırılabilir ürün fiyatı ile 39.99 fiyatı olan uzun kollu bir ürünü ( ZTWS-SBLS-XL ) faturalandırdı . Yapılandırılabilir ürün fiyatını geçersiz kılmak için basit ürün fiyatını nasıl zorlayabilirim? Aşağıdaki her iki ürün de ana konfigüre edilebilir ürünleri ile aynı ve basit ürünler olarak ayarlanmıştır.

Fatura:

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

EDIT: Hala bunu çözmek için çalışıyor. Magento'nun yapılandırılabilir ürün fiyatı veya ilgili ürün özellik fiyatı yerine basit ürün fiyatını tercih etmesine ne neden olabilir?


İ yardım edebilir magento.stackexchange.com/q/291238/57334 @TylersSN
zus

Yanıtlar:


18

Yapılandırılabilir bir ürün oluşturduğunuzda, basit ürünlerin fiyatı ne olursa olsun - bu fiyatlar tamamen göz ardı edilir. Bu nedenle, fiyatı 29,99 $ olan basit bir ürün B ve basit bir ürün B (39,99 $) satmak istiyorsanız, yapılandırılabilir bir ürün oluşturmanız, fiyatını 29,99 ABD doları olarak ayarlamanız ve İlişkili ürün sekmesini açmanız gerekir . Bu yapılandırılabilir ürünle ilişkilendirmek istediğiniz ürünleri ekleyin. Onları ekledikten sonra seçenekleri ve fiyat farklarını içeren Süper ürün öznitelikleri yapılandırması adlı bir blok belirir. A fiyatını boş bırakın ve B ürün alanı ve ihaneti için 10 (+ 10 $) koyun: farklı basit ürün farklı fiyatlara sahip.

Aslında, fiyat farkları yerine basit ürün fiyatlarını kullanmanıza izin veren bir uzatma var, ancak kurulması biraz zor. Bu ücretsiz bir eklenti olduğundan, umarım kimse linkini buraya yapıştırdığım için şikayet etmiyordur:

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


Sorunumu anlamama yardım ettin. Ürünlerin fiyatını 29.99 a ayarlayacak şekilde fiyatlandırma planımı güncelledim. İlişkili ürünlerden 10 $ 'a kadar uzun kollu özellikleri ve> = 2x özellikleri için 2 $' ı ele alıyoruz. İlginç olan, bunun yapılandırılabilir başka ürünler üzerinde çalışmadığı halde bazı ürünler için işe yaramasıdır.
TylersSN

Üzerinde çalışmadığı ürünler için, magento, ürünün kendisinde veya ilgili ürünlerde fiyat belirlenirken, yapılandırılabilir fiyat üzerinden basit ürün fiyatını tercih eder.
TylersSN,

5
Uzatma saçmalık ve adamcağız.
Alireza Fallah,

Yapılandırılabilir ürünler konusunda yardım alabilir miyim? Magento.stackexchange.com/q/291238/57334 @Pronto
zus

16

Bu yüzden aşağıdaki kodu organik internet gibi basit yapılandırılabilir ürünler gibi bir eklentiyle birlikte kullanıyorum.

Aşağıdaki kod, sepet / ödeme işlemi içindir, temel olarak, ürünün sepete eklenmesi durumunda fiyat hesaplamasını basit bir ürüne geçiren yapılandırılabilir fiyat modelinde bir güncellemedir - bu çözüm fiyat görüntülemez ürün sayfasında (ancak bunu zaten yapan birçok uzantı var).

Uygulamayı güncelle / kod / çekirdek / Mage / Katalog / Model / Ürün / Tip / Yapılandırılabilir / Fiyat / php (ideal olarak uygulama / kod / yerel olarak bir uzantı veya yerel geçersiz kılma kullanıyorsunuz)

Yöntemi güncelle: getFinalPrice, olarak değiştir

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;
}

Sonra bu işlevi getFinalPrice'ın hemen altına ekleyin:

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);
    }

Gördüğünüz gibi, kullanıcının ürünü "özelleştirmesi" durumunda (IE, yapılandırılabilir seçeneklerin seçilmesi), ilişkili basit ürünü belirleriz ve kontrolü fiyatlandırma modeline geçiririz, aksi halde ürün "özelleştirilmiş" değilse (IE, biz ürün sayfasına göz atıyorum) normal olarak ilerliyoruz


Bu cevap dahi, bravo!
pixiemedia

5

Magento Sürümünü Kullanma 1.9.2.2

Biraz daha iyi bir çözüm olabilir, çekirdeği kırmak yerine varsayılan gözlemci sınıfını geçersiz kılmak yerine 'Gözlemci' yaklaşımını kullanın, örneğin app / code / core / Mage / Katalog / Model / Ürün / Tip / Yapılandırılabilir / Fiyat / php

Yapmanız gereken tek şey Alan'ın kodunu yeni yarattığınız Gözlemcinizde kullanmak. Tek fark geri dönmek yerine

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

Aşağıdaki ile değiştirin:

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

Bu Observer.php izleyin.

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>

Umarım sorunu çözer .. :)


2

Basit ürünler farklı fiyatlara sahipse ancak fiyat ayarlaması olmadan, yapılandırılabilir ürüne göre ayarlanmışsa, sabit veya yüzde olarak ayarlanmışsa, yapılandırılabilir ürünün fiyatı alınacaktır. Hangi basit ürünlerin satın alındığı önemli değildir, fiyatı dikkate alınmaz.

Bunu güncellemek için yönetici bölümündeki ana ürüne Associated Productsgirmeniz yeterlidir, daha sonra sekme altında her bir alt ürünün fiyatını, ana ürün fiyatına ek bir fiyat eklemek için güncelleyebilirsiniz.


Merhaba David, Bunu denedim. Şu anki çabam, yapılandırılabilir ürün fiyatını 0.00 $ 'a ayarlamak ve İlişkili ürünler bölümünden, kısa kollu özelliklerde 29.99 $ ve uzun kollu gömleklerde 39.99 $ sabit fiyat belirlemeye çalışıyorum. Sebep ne olursa olsun, sabit fiyata ve basit ürünün kendisinde belirlenen fiyata rağmen 29,99 $ ücret almak isteyen tek bir yapılandırılabilir ürün (uzun kollu) hala var. Cevabınız için teşekkürler.
TylersSN,

@ user1812580 Bu ürünü yöneticide veya sadece ön tarafta görebiliyor musunuz?
David Manners

Yapılandırılabilir ürünle ilişkili ayrı bir basit ürün olarak görebiliyorum.
TylersSN

Merhaba David, @Pronto'ya verdiğim yanıtta belirtildiği gibi fiyatlandırma planını güncelledim . Umarım bu bana yardımcı olur?
TylersSN,

@DavidManners Fiyatlandırmamı, yapılandırılabilir üründeki Süper Özellikler Yapılandırması bölümünden güncellemeyi denedim. Bununla birlikte, fiyatlandırma yalnızca varyasyona tıkladığınızda ÜST fiyat bilgisi kutusundaki (burada sku, ürün adı vb.) Güncellenir. Güncellemek için düşük fiyat kutusunu nasıl alacağınızla ilgili herhangi bir ipucu?
Elva Sandoval,

2

Aynı sorunu yaşıyorum ve aşağıdaki kodu kullanarak düzelttim. Admin'den sipariş ederseniz, yönetici tarafında da çalışacaktır (telefonla sipariş için)

Bu olayı gözlemle

sales_quote_item_set_product 

ve Observer.php içine aşağıdaki kodu ekleyin

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

            }

İlgili ürün fiyatını alacak ve teklifte saklanacaktır.


+1, $item->setOriginalCustomPrice($sprice);ve $item->setOriginalPrice($price);, aynı ürüne işaret eden ve yapılandırılabilir öğelerin sepetinde farklı fiyatlara sahip olan birden fazla yapılandırılabilir öğeye izin verir.
Niloct

2

Süper özellik fiyatını değiştirmek için lütfen aşağıdaki adımları izleyin.

İlk önce "catalog_product_get_final_price" gözlemcilerini kullanın. Böyle gözlemciler yapın:

Config.xml modülünüzü açın ve aşağıdaki kodu kullanın:

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

Şimdi Observer.php dosyasını modele ve aşağıdaki kodu geçmiş hale getirin

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

}

?>

Şimdi app / design / frontend / default / yourtheme / template / catalog / product / view / type / options / configurable.phtml dosyasını açın ve kodun altındaki herhangi bir yere yapıştırın

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

Şimdi js / varien / configurable.js dosyasını açın ve reloadPrice işlevini aşağıdaki gibi değiştirin; yoksa bu işlevin tamamını değiştirebilirsiniz.

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();
},

Alınan Kod: http://chandreshrana.blogspot.in/2016/03/set-simple-product-price-instead-of.html


İ yardım saygı yapılandırılabilir ürünler alabilir miyim magento.stackexchange.com/q/291238/57334 @Chandresh Rana
zus
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.