Sao chép tùy chọn động tùy chỉnh để trích dẫn mục, mục đặt hàng


13

Tôi có một người quan sát đang thêm các tùy chọn tùy chỉnh động vào trang chi tiết sản phẩm, được gọi trong catalog_controller_product_viewsự kiện này. Điều này cho phép khách hàng chọn từ danh sách mã giấy phép hiện có.

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

Nhưng, khi tôi đặt hàng, các tùy chọn đã chọn chỉ được lưu trong info_buyRequest. Có cách nào để khiến nó lưu lại như thể đó là một tùy chọn sản phẩm được tạo trong quản trị viên không?

Câu trả lời:


6

Tôi đã làm một cái gì đó tương tự nhưng không hoàn toàn. Có lẽ nó giúp.
Nhiệm vụ của tôi là có một hộp kiểm trên mỗi trang sản phẩm được gọi gift wrap. Nếu được kiểm tra sau đó, nhóm bán hàng sẽ biết bọc sản phẩm (họ chỉ có một tùy chọn gói duy nhất).
Vì vậy, tôi đã làm điều này để có thể chuyển wrapgiá trị hộp kiểm từ sản phẩm để báo giá để đặt hàng. (Tôi có thể đã sử dụng một tùy chọn tùy chỉnh nhưng thật tệ khi thêm một tùy chọn vào vài nghìn sản phẩm).

Tôi đã có một người quan sát cho sự kiện này 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;
}

Tôi đã viết lại người Mage_Catalog_Helper_Product_Configuration::getCustomOptionstrợ giúp để nói với Magento rằng lựa chọn của tôi rất quan trọng và nên xử lý riêng

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

Vì lý do tương tự tôi đã viết lại Mage_Sales_Block_Order_Item_Renderer_Default::getItemOptionsđể tùy chọn của tôi sẽ được hiển thị trong giỏ hàng

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

và cột tên quản trị viên cho lưới các mục đơn hàng:

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

[EDIT]
Nó đường may tôi đã bỏ lỡ một cái gì đó. Tôi chỉ thực hiện tùy chọn để thêm một món quà sau khi sản phẩm được đưa vào giỏ hàng.
Nhưng tôi nghĩ bạn có thể sử dụng cùng một mã trong một sự kiện trước hoặc sau khi thêm vật phẩm vào giỏ hàng.

$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.

Đó là nó. Tôi hy vọng bạn có thể nhận được một cái gì đó hữu ích từ nó.


Trường hợp tôi gặp khó khăn là nhận được tùy chọn. Khi tôi gọi $ item-> getOptionByCode ('License_code') tôi sẽ nhận được null. Các tùy chọn của tôi thậm chí không hiển thị khi tôi gọi như sau: $ helper = Mage :: helper ('catalog / sản phẩm_configuration'); $ tùy chọn = $ helper-> getCustomOptions ($ quoteItem); Làm thế nào bạn thiết lập tùy chọn 'bọc'?
Laura

@Laura. Tôi sẽ kiểm tra nếu tôi bỏ lỡ điều gì đó và lấy lại cho bạn.
Marius

@Laura. Tôi đã kiểm tra lại và nó đã bỏ lỡ điều gì đó. Đối với tôi, tùy chọn để thêm quà tặng chỉ hiển thị trong giỏ hàng. Tôi quên tôi đã thay đổi điều này bởi vì khách hàng yêu cầu nó. Tôi đã cập nhật câu trả lời với mã tôi đã sử dụng trong một hành động tùy chỉnh. Có lẽ bạn có thể thêm nó trong một người quan sát sự kiện giỏ hàng.
Marius

Tôi cuối cùng đã phân tích yêu cầu mua. Vấn đề là các tùy chọn tôi đang đặt trong khối mã ban đầu của mình không được chuyển sang mục báo giá ở bên ngoài yêu cầu mua.
Laura

@Marius Tôi muốn thêm sản phẩm vào giỏ hàng với tùy chọn tạo nhanh mà không cần thêm tùy chọn sản phẩm ở phía quản trị viên nếu có thể
Pushpendra Singh

4

Dựa vào câu trả lời của Marius, đây là điều tôi đã nghĩ ra:

Tôi có một bộ điều khiển tùy chỉnh xử lý cấu hình của loại sản phẩm tùy chỉnh. Bộ điều khiển này thêm additional_optionstrong quá trình thêm vào giỏ hàng.

// 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();

Trong một người quan sát về sự kiện sales_convert_quote_item_to_order_item, sau đó tôi lấy additional_optionsvà đặt làm tùy chọn cho mục đặt hàng:

// 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;

Bằng cách sử dụng, additional_optionsbạn không phải lo lắng về các khối / mẫu khác nhau hiển thị các tùy chọn (mặc dù bạn có thể thích một định dạng đã thay đổi) vì các khối này sẽ gọi $options['additional_options']Xem tại đây

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.