Kopiowanie dynamicznych opcji niestandardowych w celu wyceny elementu, zamówienia elementu

13

Mam obserwatora, który dodaje dynamiczne opcje niestandardowe do strony ze szczegółami produktu, która jest wywoływana w catalog_controller_product_viewprzypadku zdarzenia. Umożliwia to klientowi wybranie z listy rozwijanej istniejących kodów licencji.

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

Ale kiedy składam zamówienie, wybrane opcje są zapisywane tylko w info_buyRequest. Czy istnieje sposób, aby zapisać go tak, jakby był opcją produktu utworzoną przez administratora?

Laura
źródło

Odpowiedzi:

6

Zrobiłem coś podobnego, ale nie całkiem. Może to pomaga.
moim zadaniem było nazywanie pola wyboru na każdej stronie produktu gift wrap. Jeśli to zaznaczone, zespół sprzedaży będzie wiedział, jak owinąć produkt (mieli tylko jedną opcję owijania).
Zrobiłem to, aby móc przenieść wrapwartość pola wyboru z produktu do wyceny na zamówienie. (Mógłbym użyć opcji niestandardowej, ale brzydko jest dodać jedną opcję do kilku tysięcy produktów).

Miałem obserwatora tego wydarzenia 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;
}

Przepisałem Mage_Catalog_Helper_Product_Configuration::getCustomOptionspomocnika, aby powiedzieć Magento, że moja opcja jest ważna i powinienem potraktować ją osobno

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

Z tego samego powodu przepisałem, Mage_Sales_Block_Order_Item_Renderer_Default::getItemOptionswięc moja opcja będzie wyświetlana w koszyku

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

oraz kolumna nazwy administratora dla siatki pozycji zamówienia:

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

[EDYCJA]
Wygląda na to, że coś przeoczyłem. Zaimplementowałem opcję dodawania giftwrap, gdy produkt znajdzie się w koszyku.
Myślę jednak, że możesz użyć tego samego kodu w wydarzeniu przed lub po dodaniu produktu do koszyka.

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

Otóż ​​to. Mam nadzieję, że możesz uzyskać z tego coś pożytecznego.

Marius
źródło
Mam problem z uzyskaniem opcji. Kiedy wywołuję $ item-> getOptionByCode ('license_code'), dostaję zero. Moje opcje nawet nie pojawiają się, gdy wywołuję: $ helper = Mage :: helper ('catalog / product_configuration'); $ options = $ helper-> getCustomOptions ($ quoteItem); Jak ustawiasz opcję „zawijania”?
Laura
@Laura. Sprawdzę, czy coś przeoczyłem i skontaktuję się z Tobą.
Marius
@Laura. Sprawdziłem dwukrotnie i wydaje mi się, że coś przeoczyłem. Dla mnie opcja dodania owijania jest pokazywana tylko w koszyku. Zapomniałem, że to zmieniłem, ponieważ klient tego zażądał. Zaktualizowałem odpowiedź kodem, którego użyłem w akcji niestandardowej. Może możesz dodać go do obserwatora zdarzeń koszyka.
Marius
W końcu analizowałem prośbę o zakup. Problem polega na tym, że opcje, które ustawiam w moim oryginalnym bloku kodu, nie były w ogóle przenoszone do pozycji wyceny poza żądaniem zakupu.
Laura
@Marius Chcę dodać produkt do koszyka z opcją generowania w locie bez opcji dodawania produktu po stronie administratora, jak to możliwe
Pushpendra Singh
4

Opierając się na odpowiedzi Mariusza, oto coś, co wymyśliłem:

Mam niestandardowy kontroler, który obsługuje konfigurację niestandardowego typu produktu. Ten kontroler dodaje additional_optionspodczas dodawania do koszyka.

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

W obserwatorze wydarzenia sales_convert_quote_item_to_order_itembiorę następnie additional_optionsi ustawiam jako opcje elementu zamówienia:

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

Korzystając z niego additional_options, nie musisz się martwić o różne bloki / szablony wyświetlające opcje (chociaż możesz preferować zmieniony format), ponieważ te bloki będą wywoływać $options['additional_options']Zobacz tutaj

pspahn
źródło