항목, 주문 항목을 인용하기 위해 동적 사용자 정의 옵션 복사


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. 이 옵션을 선택하면 영업 팀은 제품을 포장하는 것을 알게됩니다 (단일 포장 옵션 만 있음).
그래서 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::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); '랩'옵션을 어떻게 설정합니까?
Laura

@Laura. 내가 놓친 것이 있는지 확인하고 다시 연락 드리겠습니다.
Marius

@Laura. 나는 두 번 확인하고 뭔가를 놓친 솔기가 있습니다. 나에게 선물 포장을 추가하는 옵션은 장바구니에만 표시됩니다. 클라이언트가 요청했기 때문에 이것을 변경하는 것을 잊었습니다. 사용자 지정 작업에 사용한 코드로 답변을 업데이트했습니다. 카트 이벤트 관찰자에 추가 할 수 있습니다.
Marius

결국 구매 요청을 파싱했습니다. 문제는 원래 코드 블록에서 설정하는 옵션이 구매 요청 외부에서 견적 항목으로 전송되지 않았다는 것입니다.
Laura

@Marius 관리 측에서 제품 옵션에 추가하지 않고 즉시 생성 옵션을 사용하여 장바구니에 제품을 추가하고 싶습니다.
Pushpendra Singh

4

Marius의 답변과 관련하여 다음은 내가 생각해 낸 것입니다.

맞춤형 제품 유형의 구성을 처리하는 맞춤형 컨트롤러가 있습니다. 이 컨트롤러는 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.