Magento可配置产品价格超越简单产品价格


21

我已经对产品进行了完全相同的设置(据我所知),并且它们都是通过通用CSV模板导入的。

  • 可配置的价格是29.99
  • 关联的简单产品短袖为29.99
  • 关联的简单产品长袖为39.99

最近,有一张发票开出了长袖产品(ZTWS-SBLS-XL)的价格,该产品的价格为39.99,可配置产品的价格为29.99。如何强制简单产品价格超越可配置产品价格?以下两个产品与其父级可配置产品和简单产品的设置相同。

发票:

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

编辑:仍在努力解决这个问题。是什么导致Magento偏爱简单产品价格而不是可配置产品价格或相关产品属性价格?


我可以得到帮助吗magento.stackexchange.com/q/291238/57334 @TylersSN
zus

Answers:


18

当您创建可配置产品时,简单产品的价格并不重要-这些价格将被完全忽略。因此,如果您要出售价格为29.99美元的简单产品A和价格为29.99美元的简单产品B,则必须创建一个可配置产品,将其价格设置为29.99美元,然后打开“ 关联产品”标签。添加您要与此可配置产品关联的产品。添加它们后,将出现一个名为“ 超级产品属性配置 ” 的块,其中包含选项和价格差异。将产品A的价格留空,然后将10(+ $ 10)放入产品B的价格字段,瞧:不同的简单产品的价格不同。

实际上有一个扩展,允许您使用简单的产品价格而不是价格差异,但是设置起来有点棘手。由于它是免费扩展,我希望没有人抱怨我在这里粘贴其链接:

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


你帮助我理解了我的问题。我已经更新了定价方案,以便产品设置为29.99的价格。从关联产品中,我们将10美元设置为长袖属性,将2美元用于> = 2x属性。有趣的是,这适用于某些产品,而不适用于其他可配置产品。
TylersSN 2014年

对于无法使用的产品,无论是在产品本身上还是在关联的产品属性价格中设置,magento都更喜欢简单的产品价格而不是可配置的价格。
TylersSN 2014年

5
扩展名是胡扯和越野车。
Alireza Fallah 2015年

我可否获得有关可配置产品的帮助magento.stackexchange.com/q/291238/57334 @Pronto
zus

16

因此,我将以下代码与诸如有机互联网简单可配置产品的扩展程序结合使用。

下面的代码用于购物车/结帐流程,从本质上讲,它是对可配置价格模型的更新,如果产品已添加到购物车,该价格模型会将价格计算传递给简单商品---此解决方案不显示价格在产品页面本身上(但是已经有许多扩展程序可以这样做)。

更新app / code / core / Mage / Catalog / Model / Product / Type / Configurable / Price.php(最好在app / code / local中使用扩展名或本地替代)

更新方法:getFinalPrice,更改为

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

然后在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);
    }

您可以看到,如果用户已经“定制”了产品(即IE,选择了可配置的选项),我们将确定相关的简单产品并将控制权传递给其定价模型,否则,如果产品不是“定制”的(即IE,在产品页面上浏览),我们照常进行


这个答案真是天才,好极了!
pixiemedia 2015年

5

使用Magento版本1.9.2.2

可能是更好的解决方案,请使用“观察者”方法而不是破解核心,甚至覆盖默认的Model Price类,例如app / code / core / Mage / Catalog / Model / Product / Type / Configurable / Price.php

您要做的就是在新创建的Observer中使用Alan的代码,唯一的区别是无需返回

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

将其替换为以下内容:

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

遵循此 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>

希望它能解决问题.. :)


2

如果简单产品的价格不同,但针对可配置产品设置价格而没有固定或百分比的价格,则将采用可配置产品的价格。无论购买哪种简单产品,似乎都不会考虑它们的价格。

要对此进行更新,只需在管理部分中进入父产品,然后在选项卡下,Associated Products您可以更新每个子产品的价格,以在父产品价格上添加一个额外的价格。


大卫,您好,我已经尝试过了。我目前的工作包括将可配置产品的价格设置为0.00美元,从“关联产品”部分中,我尝试将短袖属性的固定价格设置为29.99美元,长袖衬衫的固定价格设置为39.99美元。无论出于何种原因,尽管有固定价格和简单产品本身的价格设置,但仍有一个可配置产品(长袖)要收取29.99美元的费用。感谢您的答复。
TylersSN 2014年

@ user1812580您可以在管理员中还是在前端看到此产品?
David Manners

我可以将其视为与可配置产品相​​关联的单独的简单产品。
TylersSN 2014年

大卫,您好,我已经更新了我 @Pronto的回复中所述的定价方案。希望能对您有所帮助吗?
TylersSN 2014年

@DavidManners我尝试通过可配置产品的“超级属性配置”部分更新价格。但是,当您单击变体时,定价只会在TOP价格信息框中(sku,产品名称等所在的位置)更新。关于如何获得更低价格框的任何提示吗?
埃尔瓦·桑多瓦尔

2

我也遇到了同样的问题,并通过使用以下代码修复了问题。如果您从管理员那里订购(对于电话订购),它也将在管理员方面起作用。

观察这个事件,

sales_quote_item_set_product 

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

            }

它将获取关联的产品价格并保存在报价中。


$item->setOriginalCustomPrice($sprice);和+1 $item->setOriginalPrice($price);,这允许多个可配置的商品以不同的价格指向购物车中的同一产品。
Niloct

2

请按照以下步骤更改超级属性价格

首次使用观察者“ catalog_product_get_final_price”。使观察者像这样:

打开您的模块config.xml并使用以下代码:

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

现在在模型中以及下面的代码中制作Observer.php文件

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

}

?>

现在打开app / design / frontend / default / yourtheme / template / catalog / product / view / type / options / configurable.phtml并将以下代码粘贴到文件中的任何位置

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

现在打开js / varien / configurable.js并按如下所示更改reloadPrice函数,或者也可以替换整个函数

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

代码摘自:http : //chandreshrana.blogspot.in/2016/03/set-simple-product-price-instead-of.html


我可否获得有关可配置产品的帮助magento.stackexchange.com/q/291238/57334 @Chandresh Rana
zus
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.