Пользовательский вариант продукта — изменение логики ценообразования на основе процентов: Magento

У меня возникла реальная проблема с Пользовательскими параметрами, которые включают тип цены "процент".

В продуктах Simple процентные пользовательские опции работают как положено, но в Configurable или Bundled окончательная цена определяется исходя из базовой цены, а не базовой цены + дополнительных опций (что диктуют бизнес-требования):

Config/Bundle Product

base price = $1000
option 1 + $100 
option 2 + 5%
_____________________________
= $1150 (instead of $1155);

Я не смог найти ничего, что касалось бы этой большой проблемы.

Я нашел и реализовал этот ответ, но $finalPrice, возвращенный в Mage_Catalog_Model_Product_Type_Price -> _applyOptionsPrice, неправильно оценивает базовую цену + дополнительную плату за пользовательские параметры. Кроме того, во внешнем интерфейсе в Products.Options решение также не включает базовую цену в расчет. Я предполагаю, что исправление предназначено для предыдущих версий magento (у меня v1.11).

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

Любые мысли будут приветствоваться.

Ваше здоровье


обновить

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

Вот что у меня есть на серверной части (что не меняет никакого поведения. Я отмечу, что я только что скопировал их в каталог app/local atm, но я переопределю их должным образом, как только я разработаю эту логику .

Mage_Catalog_Model_Product_Type_Price

    public function getFinalPrice($qty=null, $product)
    {
        //... aggregate tier and special pricing, then apply custom options

        $finalPrice = $product->getData('final_price');
        $finalPrice = $this->_applyOptionsPrice($product, $qty, $finalPrice);

        return max(0, $finalPrice);
    }

    protected function _applyOptionsPrice($product, $qty, $finalPrice)
    {
        if ($optionIds = $product->getCustomOption('option_ids')) {
            $basePrice = $finalPrice;
            foreach (explode(',', $optionIds->getValue()) as $optionId) {
                if ($option = $product->getOptionById($optionId)) {

                    $confItemOption = $product->getCustomOption('option_'.$option->getId());
                    $group = $option->groupFactory($option->getType())
                        ->setOption($option)
                        ->setConfigurationItemOption($confItemOption);
                    // grab option value based on finalprice 
                    $finalPrice += $group->getOptionPrice($confItemOption->getValue(), $finalPrice);
                }
            };
        }

        Mage::log('base price :'.$basePrice.'  final price :'.$finalPrice); 

        return $finalPrice;
    }

Насколько я могу судить, в Mage_Catalog_Model_Product_Type_Configurable_Price и Mage_Catalog_Model_Product_Type_Grouped_Price нечего переопределять, потому что каждый из них вызывает Parent::getFinalPrice для определения значений на каждом этапе...

Остается вопрос: как изменить модели ценообразования, чтобы они соответствовали пользовательскому варианту, основанному на процентах??

50 баллов тому, кто поможет мне разобраться с этим. ...

Любой?


person Community    schedule 24.09.2012    source источник
comment
Что вы применили в javascript, чтобы все заработало во внешнем интерфейсе?   -  person Syed Ibrahim    schedule 30.04.2019
comment
без понятия, если честно. Это старый проект (почти 7 лет), я уже не знаю, какие там подробности. Это кажется не решаемым. Не уверен, что я сделал, чтобы удовлетворить потребности бизнеса. удачи   -  person Bosworth99    schedule 30.04.2019


Ответы (1)


Если я вас правильно понял, вам нужно для настраиваемых и сгруппированных продуктов, чтобы каждое следующее изменение цены опциона применялось к значению, рассчитанному на предыдущем (после применения предыдущего изменения цены опциона). В этом случае вы должны переопределить метод _applyOptionsPrice() в классах Mage_Catalog_Model_Product_Type_Configurable_Price и Mage_Catalog_Model_Product_Type_Grouped_Price следующим образом:

protected function _applyOptionsPrice($product, $qty, $finalPrice)
{
    if ($optionIds = $product->getCustomOption('option_ids')) {
        foreach (explode(',', $optionIds->getValue()) as $optionId) {
            if ($option = $product->getOptionById($optionId)) {
                $confItemOption = $product->getCustomOption('option_'.$option->getId());

                $group = $option->groupFactory($option->getType())
                    ->setOption($option)
                    ->setConfigurationItemOption($confItemOption);
                $finalPrice += $group->getOptionPrice($confItemOption->getValue(), $finalPrice);
            }
        }
    }

    return $finalPrice;
}
person Dmytro Zavalkin    schedule 27.09.2012
comment
Zyava == спасибо за ответ, но я уже пробовал это решение (это в моем вопросе...). Я применил это изменение как к стандартным Price.php, так и к configurable/Price.php. Grouped использует свои дочерние продукты для определения стоимости пользовательских опций (поэтому Price.php должно быть исправлением). Однако... цены не успешно обновляются (например, в корзине). Не знаю, чего мне не хватает, но мне действительно нужно разобраться в этом. - person Bosworth99; 01.10.2012