Konfigurowalna cena produktu Magento Zastępuje prostą cenę produktu

21

Mam produkty skonfigurowane identycznie (o ile wiem) i wszystkie zostały zaimportowane za pomocą uniwersalnego szablonu CSV.

  • Cena konfigurowalna to 29,99
  • Powiązany prosty produkt z krótkim rękawem to 29,99
  • Powiązany prosty produkt z długim rękawem to 39,99

Niedawno wystawiono fakturę za produkt z długim rękawem ( ZTWS-SBLS-XL ), który ma cenę 39,99, a cena produktu z możliwością konfiguracji 29,99. Jak zmusić prostą cenę produktu, aby zastąpiła konfigurowalną cenę produktu? Oba poniższe produkty są skonfigurowane identycznie z nadrzędnym produktem konfigurowalnym i jako produkty proste.

Faktura:

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

EDYCJA: Nadal pracuję nad rozwiązaniem tego problemu. Co sprawiłoby, że Magento wolałoby prostą cenę produktu niż konfigurowalna cena produktu lub powiązana cena atrybutu produktu?

TylersSN
źródło
Czy mogę uzyskać pomoc magento.stackexchange.com/q/291238/57334 @TylersSN
zus

Odpowiedzi:

18

Kiedy tworzysz konfigurowalny produkt, nie ma znaczenia, jaka jest cena prostych produktów - ceny te są całkowicie ignorowane. Więc jeśli chcesz sprzedać prosty produkt A, który ma cenę 29,99 USD i prosty produkt B (39,99 USD), musisz utworzyć produkt konfigurowalny, ustawić jego cenę na 29,99 USD i otworzyć kartę Powiązany produkt . Dodaj produkty, które chcesz powiązać z tym konfigurowalnym produktem. Po ich dodaniu pojawia się blok o nazwie Konfiguracja atrybutów Super produktu, który zawiera opcje i różnice cenowe. Pozostaw produkt A cenę pustą i umieść 10 (+ 10 USD) w polu ceny produktu B i voila: różne proste produkty mają inną cenę.

W rzeczywistości istnieje rozszerzenie, które pozwala korzystać z prostych cen produktów zamiast różnic cen, ale konfiguracja jest dość trudna. Ponieważ jest to bezpłatne rozszerzenie, mam nadzieję, że nikt nie narzeka, że ​​wkleiłem tutaj jego link:

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

Pronto
źródło
Pomogłeś mi zrozumieć mój problem. Zaktualizowałem mój plan cenowy, aby ceny produktów wynosiły 29,99. Od powiązanych produktów wybieramy 10 USD do atrybutów z długim rękawem i 2 USD za> = 2x atrybuty. Co ciekawe, działa to w przypadku niektórych produktów, podczas gdy nie działa w przypadku innych produktów konfigurowalnych.
TylersSN
W przypadku produktów, na których nie działa, magento preferuje prostą cenę produktu niż cenę konfigurowalną, niezależnie od tego, czy jest ustawiona na samym produkcie, czy w cenie powiązanych atrybutów produktów.
TylersSN
5
Rozszerzenie to bzdury i buggy.
Alireza Fallah
Czy mogę uzyskać pomoc dotyczącą konfigurowalnych produktów magento.stackexchange.com/q/291238/57334 @Pronto
zus
16

Tak więc używam poniższego kodu w połączeniu z rozszerzeniem, takim jak proste produkty organiczne z możliwością konfiguracji w Internecie.

Poniższy kod jest przeznaczony dla procesu koszyka / kasy, w gruncie rzeczy jest to aktualizacja konfigurowalnego modelu cen, który przekazuje kalkulację ceny do prostego produktu w przypadku, gdy produkt został dodany do koszyka --- to rozwiązanie NIE wyświetla ceny na samej stronie produktu (jednak istnieje wiele rozszerzeń, które już to robią).

Zaktualizuj aplikację / code / core / Mage / Catalog / Model / Product / Type / Configurable / Price.php (najlepiej używasz rozszerzenia lub zastąpienia lokalnego w app / code / local)

Zaktualizuj metodę: getFinalPrice, zmień na

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

Następnie dodaj tę funkcję bezpośrednio pod 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);
    }

Możesz zobaczyć, że w przypadku, gdy użytkownik „dostosował” produkt (IE, wybrane opcje konfigurowalne), określamy powiązany prosty produkt i przekazujemy kontrolę nad jego modelem cenowym, w przeciwnym razie, jeśli produkt nie będzie „dostosowany” (tj. przeglądamy na stronie produktu) postępujemy jak zwykle

Alan
źródło
ta odpowiedź jest genialna, brawo!
pixiemedia,
5

Korzystanie z Magento w wersji 1.9.2.2

Może być nieco lepsze rozwiązanie, użyj podejścia „obserwator” zamiast włamać się do rdzenia lub nawet przesłonić domyślną klasę ceny modelu, tj. App / code / core / Mage / Catalog / Model / Product / Type / Configurable / Price.php

Wszystko, co musisz zrobić, to użyć kodu Alana w swoim nowo utworzonym Observerie, jedyną różnicą jest zamiast powrotu

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

Zastąp go następującym:

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

Śledź ten Observer.php

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>

Mam nadzieję, że rozwiązuje problem .. :)

Zeeshan
źródło
2

Jeśli proste produkty mają inną cenę, ale są skonfigurowane w stosunku do produktu konfigurowalnego bez ustawienia ceny, stałego lub procentowego, wówczas zostanie wzięta cena produktu konfigurowalnego. Bez względu na to, jakie proste produkty są kupowane, ich cena nie jest brana pod uwagę.

Aby to zaktualizować, przejdź do produktu nadrzędnego w sekcji administratora, a następnie w zakładce Associated Productsmożesz zaktualizować cenę każdego produktu podrzędnego, aby dodać dodatkową cenę do ceny produktów nadrzędnych .

David Manners
źródło
Cześć David, próbowałem tego. Mój obecny wysiłek polega na ustawieniu konfigurowalnej ceny produktu na 0,00 USD i w dziale Powiązane produkty próbuję ustalić stałą cenę 29,99 USD na atrybuty z krótkim rękawem i 39,99 USD na koszule z długim rękawem. Z jakiegokolwiek powodu nadal istnieje jeden konfigurowalny produkt (długi rękaw), który chce zapłacić 29,99 USD pomimo stałej ceny ORAZ ceny ustalonej w samym prostym produkcie. Dziękuję za odpowiedź.
TylersSN
@ user1812580 czy możesz zobaczyć ten produkt w panelu administratora lub po prostu w interfejsie użytkownika?
David Manners
Widzę to jako oddzielny prosty produkt związany z produktem konfigurowalnym.
TylersSN
Cześć David, zaktualizowałem schemat cenowy, jak podano w mojej odpowiedzi na @Pronto. Mam nadzieję, że to pomoże mi pomóc?
TylersSN
@DavidManners Próbowałem zaktualizować swoją cenę za pośrednictwem sekcji Konfiguracja super atrybutów w konfigurowalnym produkcie. Jednak ceny są aktualizowane tylko w polu TOP-informacja-cena (gdzie są SKU, nazwa produktu itp.) Po kliknięciu wariantu. Czy masz jakieś wskazówki, jak uzyskać aktualizację w niższej cenie?
Elva Sandoval,
2

Mam również ten sam problem i rozwiązałem go, używając poniższego kodu. Będzie działał również po stronie administratora, jeśli złożysz zamówienie od administratora (w przypadku zamówienia telefonicznego)

Obserwuj to wydarzenie,

sales_quote_item_set_product 

i dodaj poniższy kod w swoim Observer.php

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

            }

Otrzyma odpowiednią cenę produktu i zostanie zapisana w ofercie.

Elavarasan
źródło
+1 za $item->setOriginalCustomPrice($sprice);i $item->setOriginalPrice($price);, co pozwala na wiele konfigurowalnych przedmiotów, które wskazują ten sam produkt, w koszyku, w różnych cenach.
Niloct,
2

Postępuj zgodnie z poniższymi krokami, aby zmienić cenę super atrybutu

Najpierw skorzystaj z obserwatorów „katalog_produktu_get_final_cena” Ustaw obserwatorów w ten sposób:

Otwórz moduł config.xml i użyj poniższego kodu:

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

Teraz utwórz plik Observer.php w modelu i przeszłości poniżej kodu

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

}

?>

Teraz otwórz aplikację / design / frontend / default / yourtheme / template / catalog / product / view / type / options / configurable.phtml i wklej poniżej kodu w dowolnym miejscu pliku

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

Teraz otwórz js / varien / configurable.js i zmień funkcję reloadPrice jak poniżej lub możesz zastąpić całą tę funkcję

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

Kod pochodzi z: http://chandreshrana.blogspot.in/2016/03/set-simple-product-price-instead-of.html

Chandresh Rana
źródło
Czy mogę uzyskać pomoc dotyczącą konfigurowalnych produktów magento.stackexchange.com/q/291238/57334 @Chandresh Rana
zus