Konfigurierbarer Magento-Produktpreis Überschreibt den einfachen Produktpreis


21

Ich habe Produkte identisch eingerichtet (soweit ich das beurteilen kann) und sie wurden alle mit einer universellen CSV-Vorlage importiert.

  • Der konfigurierbare Preis beträgt 29,99
  • Der zugehörige Kurzarm für einfache Produkte ist 29,99
  • Zugehöriges einfaches Produkt Langarm ist 39,99

Auf einer Rechnung wurde kürzlich ein Langarmprodukt ( ZTWS-SBLS-XL ) mit einem Preis von 39,99 und einem konfigurierbaren Produktpreis von 29,99 in Rechnung gestellt . Wie kann ich den einfachen Produktpreis zwingen, den konfigurierbaren Produktpreis zu überschreiben? Die beiden folgenden Produkte sind identisch mit ihrem übergeordneten konfigurierbaren Produkt und als einfache Produkte eingerichtet.

Rechnung:

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

EDIT: Ich arbeite immer noch daran, das zu lösen. Was würde Magento veranlassen, den einfachen Produktpreis dem konfigurierbaren Produktpreis oder dem zugehörigen Produktattributpreis vorzuziehen?


Antworten:


18

Wenn Sie ein konfigurierbares Produkt erstellen, spielt es keine Rolle, wie hoch der Preis für einfache Produkte ist - diese Preise werden vollständig ignoriert. Wenn Sie also ein einfaches Produkt A mit einem Preis von 29,99 USD und ein einfaches Produkt B mit einem Preis von 39,99 USD verkaufen möchten, müssen Sie ein konfigurierbares Produkt erstellen, den Preis auf 29,99 USD festlegen und das zugehörige Produkt öffnen Registerkarte . Fügen Sie Produkte hinzu, die Sie mit diesem konfigurierbaren Produkt verknüpfen möchten. Nach dem Hinzufügen wird ein Block mit dem Namen Super product attributes configuration angezeigt, der Optionen und Preisunterschiede enthält. Lassen Sie Produkt A Preis leer und geben Sie 10 (+ $ 10) für Produkt B Preisfeld und Voila ein: Unterschiedliche einfache Produkte haben unterschiedliche Preise.

Es gibt tatsächlich eine Erweiterung, mit der Sie einfache Produktpreise anstelle von Preisunterschieden verwenden können, deren Einrichtung jedoch schwierig ist. Da es sich um eine kostenlose Erweiterung handelt, hoffe ich, dass sich niemand darüber beschwert, dass ich den Link hier eingefügt habe:

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


Sie haben mir geholfen, mein Problem zu verstehen. Ich habe mein Preisschema aktualisiert, sodass die Produkte auf einen Preis von 29,99 festgelegt sind. Von den zugehörigen Produkten gehen wir auf $ 10 bis hin zu Langarmattributen und $ 2 für> = 2x Attribute. Interessant ist, dass dies für einige Produkte funktioniert, für andere konfigurierbare Produkte jedoch nicht.
TylersSN

Für die Produkte, die nicht bearbeitet werden, zieht magento den einfachen Produktpreis dem konfigurierbaren Preis vor, unabhängig davon, ob er am Produkt selbst oder in den zugehörigen Produktattributen festgelegt ist.
TylersSN

5
Die Erweiterung ist Mist und Buggy.
Alireza Fallah

Kann ich Hilfe zu konfigurierbaren Produkten erhalten ? Magento.stackexchange.com/q/291238/57334 @Pronto
zus

16

Daher benutze ich den unten stehenden Code in Kombination mit einer Erweiterung, wie zum Beispiel einfach konfigurierbaren Produkten für das organische Internet.

Der folgende Code ist für den Warenkorb- / Checkout-Prozess gedacht. Im Wesentlichen handelt es sich um eine Aktualisierung des konfigurierbaren Preismodells, das die Preisberechnung an ein einfaches Produkt weiterleitet, falls das Produkt dem Warenkorb hinzugefügt wurde. Diese Lösung zeigt KEINE Preise an auf der Produktseite selbst (es gibt jedoch viele Erweiterungen, die dies bereits tun).

Aktualisiere App / Code / Kern / Magier / Katalog / Modell / Produkt / Typ / Konfigurierbar / Preis.php (idealerweise verwendest du eine Erweiterung oder lokale Überschreibung in App / Code / Lokal)

Aktualisieren Sie die Methode: getFinalPrice, wechseln Sie zu

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

Dann fügen Sie diese Funktion direkt unterhalb von getFinalPrice hinzu:

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

Sie können sehen, dass für den Fall, dass der Benutzer das Produkt "angepasst" hat (IE, ausgewählte konfigurierbare Optionen), wir das zugehörige einfache Produkt bestimmen und die Kontrolle an sein Preismodell übergeben, andernfalls, wenn das Produkt nicht "angepasst" ist (IE, wir) browsen auf der Produktseite) gehen wir wie gewohnt vor


Diese Antwort ist Genie, Bravo!
Pixiemedia

5

Verwendung von Magento Version 1.9.2.2

Vielleicht ist es eine etwas bessere Lösung, den 'Observer'-Ansatz zu verwenden, anstatt den Kern zu hacken oder sogar die Standard-Modellpreisklasse zu überschreiben, dh app / code / core / Mage / Katalog / Modell / Produkt / Typ / Konfigurierbar / Preis.php

Alles, was Sie tun müssen, ist, Alans Code in Ihrem neu erstellten Observer zu verwenden. Der einzige Unterschied besteht darin, nicht zurückzukehren

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

Ersetzen Sie es durch Folgendes:

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

Folgen Sie dieser 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>

Hoffe es löst das Problem .. :)


2

Wenn die einfachen Produkte einen unterschiedlichen Preis haben, aber für das konfigurierbare Produkt ohne feste oder prozentuale Preiseinstellung eingerichtet sind, wird der Preis des konfigurierbaren Produkts verwendet. Unabhängig davon, welche einfachen Produkte gekauft werden, scheint deren Preis nicht berücksichtigt zu werden.

Um dies zu aktualisieren, rufen Associated ProductsSie einfach das übergeordnete Produkt im Administrationsbereich auf. Auf der Registerkarte können Sie den Preis für jedes untergeordnete Produkt aktualisieren, um einen zusätzlichen Preis zum Preis für das übergeordnete Produkt hinzuzufügen.


Hallo David, ich habe es versucht. Meine aktuelle Anstrengung besteht darin, den konfigurierbaren Produktpreis auf 0,00 USD festzulegen. Im Abschnitt "Zugehörige Produkte" versuche ich, einen Festpreis von 29,99 USD für Kurzarmattribute und 39,99 USD für Langarmhemden festzulegen. Aus welchem ​​Grund auch immer, es gibt immer noch ein einzelnes konfigurierbares Produkt (Langarm), für das 29,99 US-Dollar berechnet werden sollen, obwohl der Festpreis UND der Preis im einfachen Produkt selbst festgelegt sind. Danke für Ihre Antwort.
TylersSN

@ user1812580 können Sie dieses Produkt im Admin oder einfach im Frontend sehen?
David Manners

Ich kann es als separates einfaches Produkt betrachten, das dem konfigurierbaren Produkt zugeordnet ist.
TylersSN

Hallo David, ich habe das Preisschema wie in meiner Antwort auf @Pronto angegeben aktualisiert. Hoffentlich hilft dir das, mir zu helfen?
TylersSN

@DavidManners Ich habe versucht, meine Preise über den Abschnitt "Super Attributes Config" des konfigurierbaren Produkts zu aktualisieren. Die Preisangabe wird jedoch nur im Feld TOP price-info (Wo Artikelnummer, Produktname usw.) aktualisiert, wenn Sie auf die Variante klicken. Irgendwelche Tipps, wie Sie die Box für niedrigere Preise auch aktualisieren können?
Elva Sandoval

2

Ich habe auch das gleiche Problem und ich habe es mit dem folgenden Code behoben. Dies funktioniert auch auf der Admin-Seite, wenn Sie bei Admin bestellen (für telefonische Bestellungen).

Beobachten Sie dieses Ereignis,

sales_quote_item_set_product 

und füge den folgenden Code in deine Observer.php ein

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

            }

Es wird der zugehörige Produktpreis angezeigt und im Angebot gespeichert.


+1 für $item->setOriginalCustomPrice($sprice);und $item->setOriginalPrice($price);, das ermöglicht mehrere konfigurierbare Artikel, die auf dasselbe Produkt im Warenkorb verweisen, mit unterschiedlichen Preisen.
Niloct

2

Befolgen Sie die nachstehenden Schritte, um den Superattributpreis zu ändern

Verwenden Sie zuerst die Beobachter "catalog_product_get_final_price". Machen Sie Beobachter so:

Öffnen Sie Ihr Modul config.xml und verwenden Sie den folgenden Code:

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

Erstellen Sie nun die Observer.php-Datei in model und past unter code

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

}

?>

Öffnen Sie jetzt app / design / frontend / default / yourtheme / template / catalog / product / view / type / options / configure.phtml und fügen Sie den Code an einer beliebigen Stelle in der Datei ein

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

Öffnen Sie nun js / varien / configure.js und ändern Sie die reloadPrice-Funktion wie folgt oder Sie können auch diese gesamte Funktion ersetzen

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

Code Entnommen aus: http://chandreshrana.blogspot.in/2016/03/set-simple-product-price-instead-of.html


Kann ich Hilfe zu konfigurierbaren Produkten erhalten ? Magento.stackexchange.com/q/291238/57334 @Chandresh Rana
zus
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.