Magento:以编程方式更新购物车中的商品自定义选项?

时间:2013-04-05 14:39:58

标签: magento shopping-cart

我想从购物车中的商品更新自定义选项。我有项目ID,所以我可以在我的控制器中加载项目。多数民众赞成在哪里,我可以从购物车中删除该商品并添加一个带有更新选项的新商品,但这不是我想要的。

我想直接更新购物车中的现有商品。任何想法如何做到这一点?

谢谢!

2 个答案:

答案 0 :(得分:0)

我遇到了可配置产品的确切问题。

目前,我知道Magento在“编辑购物车项目”页面上显示可配置的产品选项,并且生成的选项列表没有预先选择可配置属性。该属性由javascript设置,javascript采用

生成的数据
 <script type="text/javascript">
    var spConfig = new Product.Config(<?php echo $this->getJsonConfig() ?>);
</script>

但它仅在“编辑购物车项目”页面上显示所选属性。 如果我手动调用它,它不会显示当前的属性选择。

一些结账模块也会在购物车中显示所选属性,据我所知 - 因此,可以从Magento获取该数据(但我不确定它是直接从数据库中获取还是以更友好的方式获取)

答案 1 :(得分:0)

config.xml部分

<events>
    <checkout_cart_update_items_after>
        <observers>
            <update_items_specific_option>
                <class>mycompany_checkout/observer</class>
                <method>updateItemsSpecificOption</method>
            </update_items_specific_option>
        </observers>
    </checkout_cart_update_items_after>
</events>

app / code / local / MyCompany / Observer.php part

<?php

class MyCompany_Checkout_Model_Observer
    extends Varien_Event_Observer
{
    public function updateItemsSpecificOption($observer)
    {
        $event  = $observer->getEvent();
        $cart   = $event->getCart();
        $data   = $event->getInfo();

        foreach ($data as $itemId => $itemInfo) {
            $item = $cart->getQuote()->getItemById($itemId);
            if (!$item) {
                continue;
            }

            $optionData = $this->_getSpecificOptionDataFromItem($item);
            if(!$optionData) {
                continue;
            }

            $params = clone $item->getBuyRequest();
            $options = $params->getOptions() ? $params->getOptions() : array();

            $updateItem = false;
            if($shouldIRemoveOption) {
                unset($options[$optionData['option_id']]);
                $updateItem = true;
            } elseif($shouldIAddOption) {
                $options[$optionData['option_id']] = array($optionData['value_id']);
                $updateItem = true;
            }

            if($updateItem) {
                $params->setOptions($options);
                $cart->updateItem($itemId, $params);
            }
        }
    }

    protected function _getSpecificOptionDataFromItem($item)
    {
        foreach($item->getProduct()->getOptions() as $option) {
            if($this->_isMyNeededOption($option)) {
                foreach($option->getValues() as $valueId => $value) {
                    if($this->_isMyNeededValue($value)) {
                        return array(
                            'option_id' => $option->getId(),
                            'value_id'  => $valueId,
                            'price'     => $value->getPrice()
                        );
                    }
                }
            }
        }

        return false;
    }
}

我不知道您想要更改自定义选项的位置,所以在这里您有一个观察者在购物车更新操作期间执行此操作