Prix ​​du produit configurable Magento remplaçant le prix du produit simple

21

J'ai des produits configurés à l'identique (pour autant que je sache) et ils ont tous été importés avec un modèle CSV universel.

  • Le prix configurable est de 29,99
  • Le produit à manches courtes associé simple est 29,99
  • Produit à manches longues associé simple est 39,99

Une facture a récemment facturé un produit à manches longues ( ZTWS-SBLS-XL ) qui a un prix de 39,99 avec le prix du produit configurable de 29,99. Comment puis-je forcer le prix du produit simple à remplacer le prix du produit configurable? Les deux produits ci-dessous sont configurés de manière identique avec leur produit configurable parent et en tant que produits simples.

Facture d'achat:

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

EDIT: Toujours en train de résoudre ce problème. Qu'est-ce qui pousserait Magento à préférer le prix de produit simple au prix de produit configurable ou au prix d'attribut de produit associé?

TylersSN
la source
Puis-je obtenir de l'aide magento.stackexchange.com/q/291238/57334 @TylersSN
zus

Réponses:

18

Lorsque vous créez un produit configurable, peu importe le prix des produits simples - ces prix sont complètement ignorés. Donc, si vous voulez vendre un produit simple A au prix de 29,99 $ et un produit simple B (39,99 $), vous devez créer un produit configurable, définir son prix à 29,99 $ et ouvrir l' onglet Produit associé . Ajoutez les produits que vous souhaitez associer à ce produit configurable. Après leur ajout, un bloc nommé Configuration des attributs du produit Super apparaît, qui contient des options et des différences de prix. Laissez le prix du produit A vide et mettez 10 (+ 10 $) dans le champ de prix du produit B et le tour est joué: différents produits simples ont des prix différents.

Il existe en fait une extension qui vous permet d'utiliser des prix de produits simples au lieu de différences de prix, mais c'est un peu difficile à configurer. Puisqu'il s'agit d'une extension gratuite, j'espère que personne ne se plaint que j'ai collé son lien ici:

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

Pronto
la source
Vous m'avez aidé à comprendre mon problème. J'ai mis à jour mon barème de prix pour que les produits soient fixés à 29,99. Des produits associés, nous plaçons 10 $ pour les attributs à manches longues et 2 $ pour les attributs> = 2x. Ce qui est intéressant, c'est que cela fonctionne pour certains produits alors qu'il ne fonctionne pas sur d'autres produits configurables.
TylersSN
Pour les produits sur lesquels il ne fonctionne pas, magento préfère le prix du produit simple au prix configurable, qu'il soit défini sur le produit lui-même ou dans le prix des attributs des produits associés.
TylersSN
5
L'extension est de la merde et du buggy.
Alireza Fallah
Puis-je obtenir de l'aide concernant les produits configurables magento.stackexchange.com/q/291238/57334 @Pronto
zus
16

Donc, j'utilise le code ci-dessous en combinaison avec une extension comme les produits configurables simples Internet organiques.

Le code ci-dessous est destiné au processus de panier / paiement, essentiellement, c'est une mise à jour du modèle de prix configurable qui transmet le calcul du prix à un produit simple dans le cas où le produit a été ajouté au panier --- cette solution N'AFFICHE PAS les prix sur la page du produit lui-même (mais il existe déjà de nombreuses extensions qui le font).

Mettre à jour app / code / core / Mage / Catalogue / Model / Product / Type / Configurable / Price.php (idéalement, vous utilisez une extension ou un remplacement local dans app / code / local)

Mettez à jour la méthode: getFinalPrice, passez à

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

Ajoutez ensuite cette fonction juste en dessous 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);
    }

Vous pouvez voir, dans le cas où l'utilisateur a "personnalisé" le produit (IE, les options configurables sélectionnées) que nous déterminons le produit simple associé et passons le contrôle à son modèle de tarification, sinon si le produit n'est pas "personnalisé" (IE, nous naviguons sur la page du produit) nous procédons normalement

Alan
la source
cette réponse est géniale, bravo!
pixiemedia du
5

Utilisation de Magento version 1.9.2.2

Peut être une solution légèrement meilleure, utilisez l'approche 'Observer' au lieu de pirater le noyau ou même de remplacer la classe de prix par défaut du modèle, c'est-à-dire application / code / noyau / Mage / Catalogue / Modèle / Produit / Type / Configurable / Price.php

Tout ce que vous avez à faire est d'utiliser le code d'Alan dans votre Observateur nouvellement créé, la seule différence est au lieu de revenir

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

Remplacez-le par ce qui suit:

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

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

J'espère que cela résout le problème .. :)

Zeeshan
la source
2

Si les produits simples ont un prix différent mais sont configurés par rapport au produit configurable sans fixation de prix, fixe ou en pourcentage, le prix du produit configurable sera pris. Peu importe les produits simples achetés, leur prix ne semble pas être pris en compte.

Pour mettre à jour cela, allez simplement dans le produit parent dans la section d'administration, puis sous l'onglet, Associated Productsvous pouvez mettre à jour le prix de chaque produit enfant pour ajouter un prix supplémentaire sur le prix des produits parents.

David Manners
la source
Salut David, j'ai essayé ça. Mon effort actuel consiste à fixer le prix du produit configurable à 0,00 $ et dans la section Produits associés, j'essaie de fixer un prix fixe de 29,99 $ sur les attributs à manches courtes et de 39,99 $ sur les chemises à manches longues. Pour une raison quelconque, il existe toujours un seul produit configurable (manches longues) qui veut facturer 29,99 $ malgré le prix fixe ET le prix étant fixé dans le produit simple lui-même. Merci pour votre réponse.
TylersSN
@ user1812580 pouvez-vous voir ce produit dans l'administrateur ou simplement dans le frontal?
David Manners
Je peux le voir comme un produit simple distinct associé au produit configurable.
TylersSN
Bonjour David, j'ai mis à jour le barème de prix comme indiqué dans ma réponse à @Pronto. J'espère que cela vous aidera à m'aider?
TylersSN
@DavidManners J'ai essayé de mettre à jour mes prix via la section Super Attributes Config sur le produit configurable. Cependant, les prix ne sont mis à jour que dans la case TOP price-info (où se trouvent le sku, le nom du produit, etc.) lorsque vous cliquez sur la variation. Des conseils sur la façon de mettre à jour la boîte de prix inférieure?
Elva Sandoval
2

J'ai également le même problème et j'ai résolu en utilisant le code ci-dessous. Cela fonctionnera également du côté administrateur si vous commandez auprès de l'administrateur (pour la commande téléphonique)

Observez cet événement,

sales_quote_item_set_product 

et ajoutez le code ci-dessous dans votre 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);

            }

Il obtiendra le prix du produit associé et sera enregistré dans le devis.

Elavarasan
la source
+1 pour $item->setOriginalCustomPrice($sprice);et $item->setOriginalPrice($price);, qui permet plusieurs articles configurables qui pointent vers le même produit, dans le panier, avec des prix différents.
Niloct
2

Veuillez suivre les étapes ci-dessous pour modifier le prix du super attribut

Utilisez d'abord les observateurs "catalog_product_get_final_price". Faites des observateurs comme ça:

Ouvrez votre module config.xml et utilisez le code ci-dessous:

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

Maintenant, créez le fichier Observer.php dans le modèle et le code ci-dessous

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

}

?>

Maintenant, ouvrez app / design / frontend / default / yourtheme / template / catalogue / product / view / type / options / configurable.phtml et collez le code ci-dessous n'importe où dans le fichier

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

Maintenant, ouvrez js / varien / configurable.js et modifiez la fonction reloadPrice comme ci-dessous ou vous pouvez également remplacer cette fonction entière

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 extrait de: http://chandreshrana.blogspot.in/2016/03/set-simple-product-price-instead-of.html

Chandresh Rana
la source
Puis-je obtenir de l'aide concernant les produits configurables magento.stackexchange.com/q/291238/57334 @Chandresh Rana
zus