Prezzo del prodotto configurabile Magento prioritario Prezzo del prodotto semplice


21

Ho prodotti configurati in modo identico (per quanto posso dire) e sono stati tutti importati con un modello CSV universale.

  • Il prezzo configurabile è 29,99
  • La manica corta del prodotto semplice associato è 29,99
  • La manica lunga per prodotti semplici associati è 39,99

Una fattura ha recentemente fatturato un prodotto a manica lunga ( ZTWS-SBLS-XL ) che ha un prezzo di 39,99 con il prezzo del prodotto configurabile di 29,99. Come posso forzare il semplice prezzo del prodotto a sovrascrivere il prezzo del prodotto configurabile? Entrambi i prodotti di seguito sono configurati in modo identico al prodotto configurabile principale e come prodotti semplici.

Fattura:

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

EDIT: ancora lavorando per risolvere questo. Cosa indurrebbe Magento a preferire il semplice prezzo del prodotto rispetto al prezzo del prodotto configurabile o al prezzo dell'attributo del prodotto associato?


Posso ottenere aiuto magento.stackexchange.com/q/291238/57334 @TylersSN
zus

Risposte:


18

Quando crei un prodotto configurabile, non importa quale sia il prezzo di prodotti semplici: questi prezzi vengono ignorati completamente. Quindi, se vuoi vendere un prodotto semplice A che ha un prezzo di $ 29,99 e un prodotto semplice B ($ 39,99), devi creare un prodotto configurabile, impostarne il prezzo su $ 29,99 e aprire la scheda Prodotto associato . Aggiungi i prodotti che desideri associare a questo prodotto configurabile. Dopo averli aggiunti, viene visualizzato un blocco denominato Configurazione degli attributi del prodotto Super che contiene opzioni e differenze di prezzo. Lascia vuoto il prezzo del prodotto A e aggiungi 10 (+ $ 10) al campo del prezzo del prodotto B e voilà: un prodotto semplice diverso ha un prezzo diverso.

In realtà esiste un'estensione che ti consente di utilizzare i prezzi dei prodotti semplici anziché le differenze di prezzo, ma è un po 'complicato da configurare. Dal momento che è un'estensione gratuita, spero che nessuno si lamenti di me incollando il suo link qui:

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


Mi hai aiutato a capire il mio problema. Ho aggiornato il mio schema di prezzi in modo che i prodotti siano impostati su un prezzo di 29,99. Dai prodotti associati puntiamo su $ 10 agli attributi manica lunga e $ 2 per attributi> = 2x. Ciò che è interessante è che questo funziona per alcuni prodotti mentre non funziona su altri prodotti configurabili.
TylersSN,

Per i prodotti su cui non funziona, magento preferisce il prezzo del prodotto semplice rispetto al prezzo configurabile, sia impostato sul prodotto stesso sia nel prezzo degli attributi dei prodotti associati.
TylersSN,

5
L'estensione è merda e buggy.
Alireza Fallah,

Posso ottenere assistenza per i prodotti configurabili magento.stackexchange.com/q/291238/57334 @Pronto
zus

16

Quindi, utilizzo il codice seguente in combinazione con un'estensione come i prodotti configurabili semplici di Internet organici.

Il codice seguente è pensato per il processo di carrello / checkout, essenzialmente, è un aggiornamento del modello di prezzo configurabile che passa il calcolo del prezzo a un prodotto semplice nel caso in cui il prodotto sia stato aggiunto al carrello --- questa soluzione NON visualizza i prezzi sulla stessa pagina del prodotto (tuttavia esistono già molte estensioni che lo fanno).

Aggiorna app / codice / core / Mage / Catalog / Model / Product / Type / Configurable / Price.php (idealmente usi un'estensione o una sostituzione locale in app / code / local)

Aggiorna il metodo: getFinalPrice, passa a

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

Quindi aggiungi questa funzione proprio sotto 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);
    }

Puoi vedere, nel caso in cui l'utente abbia "personalizzato" il prodotto (IE, opzioni configurabili selezionate) determiniamo il prodotto semplice associato e passiamo il controllo al suo modello di prezzo, altrimenti se il prodotto non è "personalizzato" (IE, noi navigando nella pagina del prodotto) procediamo normalmente


questa risposta è geniale, bravo!
pixiemedia,

5

Utilizzando Magento versione 1.9.2.2

Potrebbe essere una soluzione leggermente migliore, utilizzare l'approccio 'Observer' invece di hackerare il core o addirittura ignorare la classe di prezzo del modello predefinita, ad esempio app / codice / core / Mage / Catalogue / Model / Product / Type / Configurable / Price.php

Tutto quello che devi fare è usare il codice di Alan all'interno del tuo Observer appena creato, l'unica differenza è invece di tornare

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

Sostituirlo con il seguente:

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

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

Spero che risolva il problema .. :)


2

Se i prodotti semplici hanno un prezzo diverso ma sono impostati rispetto al prodotto configurabile senza un'impostazione del prezzo, fissa o percentuale, verrà preso il prezzo del prodotto configurabile. Non importa quali prodotti semplici vengano acquistati, il loro prezzo non sembra essere preso in considerazione.

Per aggiornarlo basta andare al prodotto principale nella sezione di amministrazione, quindi sotto la scheda Associated Productsè possibile aggiornare il prezzo di ciascun prodotto figlio per aggiungere un prezzo aggiuntivo al prezzo dei prodotti genitori.


Ciao David, ci ho provato. Il mio attuale impegno consiste nell'impostare il prezzo del prodotto configurabile su $ 0,00 e dalla sezione Prodotti associati Sto cercando di impostare un prezzo fisso di $ 29,99 sugli attributi manica corta e $ 39,99 sulle camicie a maniche lunghe. Per qualsiasi motivo, esiste ancora un singolo prodotto configurabile (manica lunga) che vuole addebitare $ 29,99 nonostante il prezzo fisso E il prezzo sia fissato all'interno del semplice prodotto stesso. Grazie per la vostra risposta.
TylersSN,

@ user1812580 puoi vedere questo prodotto nell'amministratore o semplicemente nel front-end?
David Manners,

Posso vederlo come un prodotto semplice separato associato al prodotto configurabile.
TylersSN,

Ciao David, ho aggiornato lo schema dei prezzi come indicato nella mia risposta a @Pronto. Spero che ti possa aiutare?
TylersSN,

@DavidManners Ho provato ad aggiornare i miei prezzi tramite la sezione Configura Super Attributi sul prodotto configurabile. Tuttavia, il prezzo si aggiorna solo sulla casella TOP prezzo-informazioni (dove sku, nome del prodotto ecc.) Quando si fa clic sulla variante. Qualche consiglio su come ottenere anche il prezzo più basso da aggiornare?
Elva Sandoval,

2

Ho anche lo stesso problema e ho risolto utilizzando il codice seguente. Funzionerà anche dal lato amministratore se ordini dall'amministratore (per ordine telefonico)

Osserva questo evento,

sales_quote_item_set_product 

e aggiungi sotto il codice nel tuo 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);

            }

Otterrà il prezzo del prodotto associato e verrà salvato in preventivo.


+1 per $item->setOriginalCustomPrice($sprice);e $item->setOriginalPrice($price);, che consente più articoli configurabili che puntano allo stesso prodotto, nel carrello, con prezzi diversi.
Niloct,

2

Si prega di seguire i passaggi seguenti per modificare il prezzo del super attributo

Osservatori del primo utilizzo "catalog_product_get_final_price". Crea osservatori come questo:

Apri il tuo modulo config.xml e usa il codice seguente:

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

Ora crea il file Observer.php nel modello e passa sotto il codice

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

}

?>

Ora apri l'app / design / frontend / default / yourtheme / template / catalog / product / view / type / options / configurable.phtml e incolla sotto il codice in qualsiasi punto del 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>

Ora apri js / varien / configurable.js e modifica la funzione reloadPrice come di seguito oppure puoi sostituire anche l'intera funzione

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

Codice tratto da: http://chandreshrana.blogspot.in/2016/03/set-simple-product-price-instead-of.html


Posso ottenere assistenza per quanto riguarda i prodotti configurabili magento.stackexchange.com/q/291238/57334 @Chandresh Rana
zus
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.