動的カスタムオプションを見積品目、注文品目にコピーする


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。管理者で作成された製品オプションであるかのように保存する方法はありますか?

回答:


6

私は似たようなことをしましたが、完全ではありません。たぶんそれが役立ちます。
私の仕事は、各製品ページにと呼ばれるチェックボックスを持つことでしたgift wrap。チェックすると、営業チームは製品をラップすることを認識します(ラップオプションは1つしかありませんでした)。
そのため、wrapチェックボックスの値を製品から見積もり、注文に移植できるようにするためにこれを行いました。(カスタムオプションを使用することもできましたが、数千の製品に1つのオプションを追加するのはいです)。

イベントにオブザーバーがいました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::getCustomOptionsMagentoにオプションが重要であり、個別に処理する必要があることを伝えるために、ヘルパーを書き直しました。

<?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管理者側で製品オプションを追加せずに、その場で生成オプションを使用してカートに製品を追加したい
Pushpendra Singh

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']参照してくださいここに

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.