Preço do produto configurável Magento substituindo o preço simples do produto

21

Tenho produtos configurados de forma idêntica (pelo que sei) e todos foram importados com um modelo CSV universal.

  • O preço configurável é 29,99
  • O produto simples associado de manga curta é 29,99
  • A manga comprida do produto simples associado é 39,99

Recentemente, uma fatura faturou um produto de manga comprida ( ZTWS-SBLS-XL ) que tem um preço de 39,99 com o preço configurável do produto de 29,99. Como forçar o preço simples do produto a substituir o preço configurável do produto? Ambos os produtos abaixo são configurados de forma idêntica ao produto configurável pai e como produtos simples.

Fatura:

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

Edição: Ainda trabalhando para resolver isso. O que faria com que o Magento preferisse o preço simples do produto ao preço configurável ou ao atributo do produto associado?

TylersSN
fonte
Posso obter ajuda magento.stackexchange.com/q/291238/57334 @TylersSN
zus 16/10

Respostas:

18

Quando você cria um produto configurável, não importa qual é o preço de produtos simples - esses preços são completamente ignorados. Portanto, se você deseja vender um produto simples A com preço de US $ 29,99 e um produto simples B (US $ 39,99), crie um produto configurável, defina seu preço como US $ 29,99 e abra a guia Produto associado . Adicione produtos que você deseja associar a este produto configurável. Após adicioná-los, aparece um bloco chamado Configuração dos atributos do super produto, que contém opções e diferenças de preço. Deixe o preço do produto A vazio e coloque 10 (+ $ 10) no campo de preço do produto B e pronto: diferentes produtos simples têm preços diferentes.

Na verdade, existe uma extensão que permite usar preços simples de produtos em vez de diferenças de preço, mas é um pouco complicado de configurar. Como é uma extensão gratuita, espero que ninguém se queixe de colar o link aqui:

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

Pronto
fonte
Você me ajudou a entender meu problema. Atualizei meu esquema de preços para que os produtos sejam definidos para um preço de 29,99. Dos produtos associados, atribuímos US $ 10 a atributos de manga comprida e US $ 2 para atributos => 2x. O interessante é que isso funciona para alguns produtos enquanto não funciona em outros produtos configuráveis.
precisa saber é o seguinte
Para os produtos nos quais ele não funciona, o magento prefere o preço simples do produto ao preço configurável, seja no próprio produto ou nos atributos associados a preço.
precisa saber é o seguinte
5
A extensão é uma porcaria e buggy.
Alireza Fallah
Posso obter ajuda para considerar produtos configuráveis magento.stackexchange.com/q/291238/57334 @Pronto
zus 9/10
16

Então, eu uso o código abaixo em combinação com uma extensão como produtos configuráveis ​​simples da Internet orgânica.

O código abaixo destina-se ao processo de carrinho / caixa, essencialmente, é uma atualização do modelo de preço configurável que passa o cálculo de preço para um produto simples, caso o produto tenha sido adicionado ao carrinho --- esta solução NÃO exibe preços na própria página do produto (no entanto, existem muitas extensões que já fazem isso).

Atualize app / code / core / Mage / Catalog / Model / Product / Type / Configurable / Price.php (o ideal é usar uma extensão ou substituição local em app / code / local)

Atualize o método: getFinalPrice, altere para

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

Em seguida, adicione esta função logo abaixo de 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);
    }

Você pode ver, se o usuário "personalizou" o produto (IE, opções configuráveis ​​selecionadas), determinamos o produto simples associado e passamos o controle ao seu modelo de precificação, caso contrário, se o produto não for "personalizado" (IE, navegamos na página do produto), procedemos normalmente

Alan
fonte
esta resposta é genial, bravo!
pixiemedia 12/12
5

Usando o Magento Versão 1.9.2.2

Pode ser uma solução um pouco melhor, use a abordagem 'Observer' em vez de invadir o núcleo ou mesmo substituir a classe padrão do Preço do Modelo, por exemplo, app / code / core / Mage / Catalog / Model / Product / Type / Configurable / Price.php

Tudo o que você precisa fazer é usar o código de Alan no seu recém-criado Observador, a única diferença é que, em vez de retornar

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

Substitua-o pelo seguinte:

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

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

Espero que resolva o problema .. :)

Zeeshan
fonte
2

Se os produtos simples tiverem preços diferentes, mas estiverem configurados com relação ao produto configurável sem uma configuração de preço, fixa ou percentual, o preço do produto configurável será calculado. Independentemente de quais produtos simples sejam comprados, seu preço não parece ser levado em consideração.

Para atualizar isso, basta acessar o produto pai na seção admin e, na guia, Associated Productsvocê pode atualizar o preço de cada produto filho para adicionar um preço adicional ao preço dos produtos pais.

David Manners
fonte
Oi David, eu tentei isso. Meu esforço atual consiste em definir o preço do produto configurável para US $ 0,00 e, na seção Produtos associados, estou tentando definir um preço fixo de US $ 29,99 em atributos de manga curta e US $ 39,99 em camisas de manga longa. Por qualquer motivo, ainda existe um único produto configurável (manga longa) que deseja cobrar US $ 29,99, apesar do preço fixo E do preço definido no próprio produto simples. Obrigado pela sua resposta.
TylersSN
@ user1812580 você consegue ver este produto no administrador ou simplesmente no front end?
David Manners
Eu posso vê-lo como um produto simples separado associado ao produto configurável.
TylersSN
Olá David, atualizei o esquema de preços conforme indicado na minha resposta ao @Pronto. Espero que isso ajude você a me ajudar?
precisa saber é o seguinte
@DavidManners Tentei atualizar meus preços na seção Super Attributes Config no produto configurável. No entanto, o preço é atualizado apenas na caixa de informações sobre preços SUPERIOR (onde estão o sku, o nome do produto etc.) quando você clica na variação. Alguma dica sobre como atualizar a caixa de preço mais baixo também?
Elva Sandoval
2

Também estou tendo o mesmo problema e resolvi usando o código abaixo. Também funcionará no lado do administrador se você solicitar do administrador (por ordem telefônica)

Observe este evento,

sales_quote_item_set_product 

e adicione o código abaixo no seu 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);

            }

Ele receberá o preço do produto associado e será salvo na cotação.

Elavarasan
fonte
+1 para $item->setOriginalCustomPrice($sprice);e $item->setOriginalPrice($price);, que permite vários itens configuráveis ​​que apontam para o mesmo produto, no carrinho, com preços diferentes.
Niloct 19/08/2015
2

Siga as etapas abaixo para alterar o preço do super atributo

Observadores do primeiro uso "catalog_product_get_final_price". Faça observadores assim:

Abra seu módulo config.xml e use o código abaixo:

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

Agora crie o arquivo Observer.php no modelo e no código abaixo abaixo

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

}

?>

Agora abra app / design / frontend / default / yourtheme / template / catalog / product / view / type / options / configurable.phtml e cole o código abaixo em qualquer lugar do arquivo

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

Agora abra js / varien / configurable.js e altere a função reloadPrice conforme abaixo ou você pode substituir toda esta função

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

Código Retirado de: http://chandreshrana.blogspot.in/2016/03/set-simple-product-price-instead-of.html

Chandresh Rana
fonte
Posso obter ajuda para considerar produtos configuráveis? Magento.stackexchange.com/q/291238/57334 @Chandresh Rana
09/10