0

我想从购物车中的商品更新自定义选项。我有项目 ID,所以我可以在我的控制器中加载项目。这就是我卡住的地方,我可以从购物车中删除该项目并添加一个带有更新选项的新项目,但这不是我想要的。

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

谢谢!

4

2 回答 2

0

我对可配置产品有确切的问题。

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

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

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

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

于 2013-05-23T17:02:04.257 回答
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 部分

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

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

于 2015-07-16T12:16:40.090 回答