将动态自定义选项复制到报价项目,订单项目


13

我有一个观察者,它将动态自定义选项添加到产品详细信息页面(在catalog_controller_product_view事件中调用)。这允许客户从其现有许可证代码的下拉列表中进行选择。

public function addLicenseOptions(Varien_Event_Observer $observer) {
    $product = $observer->getEvent()->getProduct();
    if ($product->isSubscriptionProduct()) {
        $optionModel = Mage::getModel('catalog/product_option')
            ->setTitle('License Code')
            ->setProductId($product->getId())
            ->setStoreId($product->getStoreId())
            ->setId('license_code')
            ->setType('drop_down')
            ->setPrice(null)
            ->setPriceType(null)
            ->setIsRequire(true);

        $customer = Mage::getSingleton('customer/session')->getCustomer();
        if ($customer->getId()) {
            $linksPurchased = Mage::getResourceModel('downloadable/link_purchased_collection')
                        ->addFieldToFilter('customer_id', $customer->getId());

            if ($linksPurchased->count() > 0) {
                foreach ($linksPurchased as $linkPurchased) {
                    $valueModel = Mage::getModel('catalog/product_option_value')
                        ->setTitle($linkPurchased->getData('key_code'))
                        ->setProduct($product)
                        ->setOption($optionModel)
                        ->setId($linkPurchased->getData('license_code'))
                        ->setPrice(null)
                        ->setPriceType('fixed')
                        ->setSku(null);
                    $optionModel->addValue($valueModel);
                }
                $product->setHasOptions(1);
                $product->addOption($optionModel);
            }
        }
    }
}

但是,当我下订单时,选定的选项仅保存在中info_buyRequest。有没有办法像保存在管理员中创建的产品一样保存它?

Answers:


6

我做了类似但不太完全的事情。也许有帮助。
我的任务是在每个名为的产品页面上都有一个复选框gift wrap。如果选中,则销售团队将知道要包装产品(他们只有一个包装选项)。
因此,我这样做是为了能够将wrap复选框值从产品移植到报价到订单。(我本可以使用自定义选项,但是将一个选项添加到几千种产品中是很丑陋的)。

我有一个观察员sales_convert_quote_item_to_order_item

public function checkGiftWrap($observer)
{
    $orderItem = $observer->getEvent()->getOrderItem();
    $item = $observer->getEvent()->getItem();
    $wrap = $item->getOptionByCode('wrap');
    if ($wrap){
        $options = $orderItem->getProductOptions();
        $options['wrap'] = unserialize($wrap->getValue());
        $orderItem->setProductOptions($options);
    }
    return $this;
}

我已经重写了Mage_Catalog_Helper_Product_Configuration::getCustomOptions助手,以便告诉Magento我的选择很重要,应该分开对待

<?php
class [Namespace]_[Module]_Helper_Product_Configuration extends Mage_Catalog_Helper_Product_Configuration
{
    public function getCustomOptions(Mage_Catalog_Model_Product_Configuration_Item_Interface $item){
        $options = parent::getCustomOptions($item);
        $wrap = $item->getOptionByCode('wrap');
        if ($wrap){
            $options = array_merge($options, array(unserialize($wrap->getValue())));
        }
        return $options;
    }
}

出于相同的原因,我已经进行了重写,Mage_Sales_Block_Order_Item_Renderer_Default::getItemOptions因此我的选项将显示在购物车中

<?php
class [Namespace]_[Module]_Block_Sales_Order_Item_Renderer_Default extends Mage_Sales_Block_Order_Item_Renderer_Default
{
    public function getItemOptions(){
        $result = parent::getItemOptions();
        $options = $this->getOrderItem()->getProductOptions();
        if (isset($options['wrap'])){
            $result = array_merge($result, array($options['wrap']));
        }
        return $result;
    }
}

以及订单项网格的管理员名称列:

<?php
class [Namespace]_[Module]_Block_Adminhtml_Sales_Items_Column_Name extends Mage_Adminhtml_Block_Sales_Items_Column_Name
{
    public function getOrderOptions(){
        $result = parent::getOrderOptions();
        if ($options = $this->getItem()->getProductOptions()) {
            if (isset($options['wrap'])) {
                $result = array_merge($result, array($options['wrap']));
            }
        }
        return $result;
    }
}

[编辑]
似乎我错过了一些东西。我只实现了将产品放入购物车后添加礼品包装的选项。
但我认为您可以在将商品添加到购物车之前或之后的事件中使用相同的代码。

$data = array();
$data['label'] = Mage::helper('helper_alias')->__('Giftwrapping');
$data['value'] = Mage::helper('helper_alias')->__('Yes');
$product->addCustomOption('wrap', serialize($data));
$item->addOption($product->getCustomOption('wrap'));
$item->save(); //this line should be called only if it's not called by default after your event is dispatched.

而已。希望您能从中受益。


我遇到麻烦的地方是选择。当我调用$ item-> getOptionByCode('license_code')时,我得到的是null。当我调用以下命令时,我的选项甚至都没有显示:$ helper = Mage :: helper('catalog / product_configuration'); $ options = $ helper-> getCustomOptions($ quoteItem); 您如何设置“包装”选项?
劳拉

@劳拉 我会检查我是否错过了某件事,然后回覆您。
马里斯(Marius)

@劳拉 我仔细检查了一下,发现我错过了一些东西。对我来说,添加礼品包装的选项仅在购物车中显示。我忘记更改此设置是因为客户要求。我用自定义操作中使用的代码更新了答案。也许您可以将其添加到购物车事件观察器中。
马里斯(Marius)

我最终还是解析了购买请求。问题是我在原始代码块中设置的选项在购买请求之外的所有地方都没有转移到报价项目中。
劳拉

@Marius我想通过快速生成选项将产品添加到购物车中,而无需在管理端添加产品选项,这是怎么可能的
Pushpendra Singh 16-10-1

4

引用马吕斯的答案,这是我想到的:

我有一个自定义控制器,用于处理自定义产品类型的配置。该控制器additional_options在添加到购物车期间添加。

// My_Module_CartController::addToCartAction
// Get your product model
$product = $this->getProduct();

// Create options
$options = array();
$options['my_option'] = array(
    'label' => 'My Label',
    'value' => 'my_value'
);

$cartRequest = array(
    'product' => $product->getId(),
    'qty' => '1'
);

$cart = Mage::getModel('checkout/cart');
$cart->init();

// Add options
$product->addCustomOption('additional_options', serialize($options));

// Add to cart
$cart->addProduct($product, $cartRequest);
$cart->save();

sales_convert_quote_item_to_order_item然后在事件的观察者中,我抓住additional_options并在订单项上设置为选项:

// My_Module_Model_Order_Observer::convertQuoteToOrder(Varien_Event_Observer $o)
// Get quote and order items
$orderItem = $o->getEvent()->getOrderItem();
$quoteItem = $o->getEvent()->getItem();

// Get serialized options set on product earlier
$myOptions = $item->getProduct()->getCustomOption('additional_options')->getValue();

// Add these options into the order item's options
$options = $orderItem->getProductOptions();
$options['additional_options'] = unserialize($myOptions);
$orderItem->setProductOptions($options);

return $this;

通过使用,additional_options您不必担心会呈现各种选项的各种块/模板(尽管您可能更喜欢更改格式),因为这些块将调用$options['additional_options']See Here

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.