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 предпочесть простую цену продукта над конфигурируемой ценой продукта или ценой атрибута связанного продукта?

TylersSN
источник
Могу ли я получить помощь magento.stackexchange.com/q/291238/57334 @TylersSN
zus

Ответы:

18

Когда вы создаете настраиваемый продукт, не имеет значения, какова цена простых продуктов - эти цены полностью игнорируются. Поэтому, если вы хотите продать простой продукт A по цене 29,99 долл. США и простой продукт B (39,99 долл. США), необходимо создать настраиваемый продукт, установить его цену в 29,99 долл. США и открыть вкладку « Ассоциированный продукт ». Добавьте продукты, которые вы хотите связать с этим настраиваемым продуктом. После их добавления появляется блок с названием « Супер атрибуты продукта» , в котором содержатся параметры и ценовые различия. Оставьте цену продукта пустой и поместите 10 (+ $ 10) в поле цены продукта В и вуаля: разные простые товары имеют разные цены.

На самом деле есть расширение, которое позволяет вам использовать простые цены на продукты вместо ценовых различий, но это довольно сложно настроить. Поскольку это бесплатное расширение, я надеюсь, что никто не будет жаловаться на то, что я вставил его ссылку здесь:

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

без промедления
источник
Вы помогли мне понять мою проблему. Я обновил свою схему ценообразования, чтобы цены на продукты были установлены на уровне 29,99. От сопутствующих товаров мы добавляем $ 10 к атрибутам с длинным рукавом и $ 2 для атрибутов> = 2x. Интересно то, что это работает для некоторых продуктов, в то время как не работает для других настраиваемых продуктов.
TylersSN
Для продуктов, с которыми он не работает, magento предпочитает простую цену продукта по сравнению с настраиваемой ценой, независимо от того, установлена ​​она на самом продукте или в цене атрибутов связанных продуктов.
TylersSN
5
Расширение дерьмо и глючит.
Алиреза Фалла
Могу ли я получить помощь в отношении настраиваемых продуктов 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
5

Использование Magento версии 1.9.2.2

Может быть, немного лучшее решение, использовать подход «Обозреватель» вместо взлома ядра или даже переопределения стандартного класса Model Price, например app / code / core / Mage / Catalog / Model / Product / Type / Configurable / Price.php

Все, что вам нужно сделать, это использовать код Алана в вашем только что созданном Обозревателе, единственное отличие - это не возвращать

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>

Надеюсь, это решит проблему .. :)

Zeeshan
источник
2

Если простые продукты имеют разную цену, но настроены на конфигурируемый продукт без фиксированной или процентной настройки цены, то будет взята цена конфигурируемого продукта. Независимо от того, какие простые продукты покупаются, их цена не учитывается.

Чтобы обновить его, просто перейдите в родительский продукт в разделе администратора, а затем на вкладке Associated Productsвы можете обновить цену каждого дочернего продукта, чтобы добавить дополнительную цену к цене родительского продукта.

Дэвид Мэннерс
источник
Привет Дэвид, я попробовал это. Мои текущие усилия состоят в том, чтобы установить настраиваемую цену продукта на уровне 0,00 долл. США, а в разделе «Сопутствующие продукты» я пытаюсь установить фиксированную цену в 29,99 долл. США для атрибутов с коротким рукавом и 39,99 долл. США для рубашек с длинным рукавом. По какой-то причине, есть еще один конфигурируемый продукт (с длинным рукавом), который хочет брать $ 29,99, несмотря на фиксированную цену И цену, устанавливаемую в самом простом продукте. Благодарю за ваш ответ.
TylersSN
@ user1812580 Вы можете увидеть этот продукт в админке или просто в интерфейсе?
Дэвид Мэннерс
Я вижу его как отдельный простой продукт, связанный с настраиваемым продуктом.
TylersSN
Привет, Дэвид! Я обновил схему ценообразования, как указано в моем ответе на @Pronto. Надеюсь, это поможет мне помочь?
TylersSN
@DavidManners Я пытался обновить свои цены в разделе «Конфигурация супер-атрибутов» настраиваемого продукта. Однако при нажатии на вариант цены обновляются только в окне ТОП-ценовой информации (где указаны 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);

            }

Он получит цену соответствующего товара и сохранится в цитате.

Elavarasan
источник
+1 за $item->setOriginalCustomPrice($sprice);и $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 Рана
ZUS