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

EDIT: Все ще працюю над вирішенням цього питання. Що б змусило Magento віддати перевагу простій ціні товару перед налаштованою ціною товару або пов’язаною ціною атрибута товару?


Чи можу я отримати допомогу magento.stackexchange.com/q/291238/57334 @TylersSN
zus

Відповіді:


18

Коли ви створюєте продукт, що настроюється, не має значення, яка ціна простих продуктів - ці ціни ігноруються повністю. Так що якщо ви хочете продати простий продукт А , який має ціну $ 29,99 і простий продукт В ($ 39,99) , то ви повинні створити настроюється продукт, встановити свою ціну до $ 29,99 і відкритого продукту , пов'язаної вкладки. Додайте продукти, які потрібно пов’язати з цим настроюваним продуктом. Після додавання до них з'являється блок з назвою Конфігурація атрибутів продукту Super, який містить варіанти та різниці в ціні. Залиште продукт порожньою ціною і поставте 10 (+ 10 доларів) у поле ціни та вуаля B: різні прості товари мають різну ціну.

Насправді є розширення, яке дозволяє використовувати прості ціни на продукцію замість розбіжностей у цінах, але налаштувати це досить складно. Оскільки це безкоштовне розширення, я сподіваюся, що ніхто не скаржиться на те, щоб я вставив його посилання тут:

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

Таким чином, я використовую наведений нижче код у поєднанні з розширенням, як органічні Інтернет, просто налаштовані продукти.

Код нижче призначений для кошика / оформлення замовлення, по суті, це оновлення настроюваної цінової моделі, яка передає розрахунок ціни на простий товар у випадку, якщо товар був доданий у кошик --- це рішення НЕ відображає ціноутворення на самій сторінці продукту (проте є вже багато розширень, які вже роблять це).

Оновіть додаток / код / ​​core / Mage / Каталог / Модель / Продукт / Тип / Налаштовується / Price.php (в ідеалі ви використовуєте розширення або локальне перевизначення в додатку / коді / локальному)

Оновіть метод: 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

Може бути дещо кращим рішенням, використовуйте підхід «спостерігача» замість злому ядра або навіть перекриття типового класу Модель за замовчуванням, тобто додаток / код / ​​ядро ​​/ Mage / Каталог / Модель / Продукт / Тип / Налаштування / Ціна.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>

Сподіваюся, це вирішує проблему .. :)


2

Якщо прості вироби відрізняються ціною, але налаштовані на продукт, що може настроюватися, без встановлення ціни, фіксованої або відсоткової, тоді буде прийнята ціна продукту, що може настроюватися. Незалежно від того, які прості товари купуються, їх ціна, здається, не враховується.

Щоб оновити це, просто перейдіть до материнського продукту в розділі адміністратора, тоді на вкладці Associated Productsви можете оновити ціну кожного дочірнього продукту, щоб додати додаткову ціну на ціну батьківських продуктів.


Привіт, Девіде, я спробував це. Мої поточні зусилля полягають у встановленні налаштованої ціни товару на 0,00 доларів, а з розділу асоційованих товарів я намагаюся встановити фіксовану ціну в розмірі 29,99 дол. США на атрибути з короткими рукавами та 39,99 дол. США на сорочки з довгими рукавами. З будь-якої причини, все ще є один конфігуруваний продукт (довгий рукав), який хоче стягнути $ 29,99, незважаючи на фіксовану ціну І ціну, встановлену в межах простого товару. Спасибі за вашу відповідь.
TylersSN

@ user1812580 Ви можете бачити цей продукт у адміністратора або просто в передній частині?
Девід Маннерс

Я бачу це як окремий простий продукт, пов’язаний із продуктом, що може настроюватися.
TylersSN

Привіт, Девіде, я оновив схему цін, як сказано у моїй відповіді на @Pronto. Сподіваємось, це допоможе вам допомогти мені?
TylersSN

@DavidManners Я спробував оновити свої ціни за допомогою розділу Super Attributes Config у налаштованому продукті. Однак ціна оновлюється лише у полі ТОП-ціна інформації (де sku, назва товару тощо), коли ви натискаєте на варіант. Будь-які поради щодо того, як отримати нижчу ціну для оновлення?
Elva Sandoval

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

            }

Він отримає пов’язану ціну товару і заощадить у котируванні.


+1 для $item->setOriginalCustomPrice($sprice);і $item->setOriginalPrice($price);, що дозволяє кілька налаштованих елементів, які вказують на той самий товар, у кошику, з різними цінами.
Нілокт

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

}

?>

Тепер відкрийте додаток / дизайн / frontend / за замовчуванням / yourtheme / шаблон / каталог / продукт / view / type / options / options / configigurable.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 / configigurable.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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.