Копіювання динамічних спеціальних параметрів для цитування товару, товару для замовлення


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::getCustomOptionsпомічника, щоб сказати Магенто, що мій варіант важливий і слід розглядати його окремо

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

[EDIT]
Здається, я щось пропустив. Я реалізував варіант додавання подарункової упаковки лише після того, як товар знаходиться в кошику.
Але я думаю, що ви можете використовувати той самий код у випадку до або після додавання товару до кошика.

$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'), я отримую нуль. Мої параметри навіть не відображаються, коли я викликаю наступне: $ helper = Mage :: helper ('каталог / product_configuration'); $ options = $ helper-> getCustomOptions ($ quoteItem); Як ви встановлюєте параметр "обгортання"?
Лора

@Laura. Я перевірю, чи щось я пропустив, і повернуся до вас.
Маріус

@Laura. Я двічі перевірив, і це здається, я щось пропустив. Для мене варіант додавання упаковки подарунків показаний лише у кошику. Я забув, що змінив це, тому що клієнт просив його. Я оновив відповідь кодом, який використовував у спеціальній дії. Можливо, ви можете додати його у спостерігача за подіями у кошику.
Маріус

Я врешті-решт розібрав запит на купівлю. Проблема полягає в тому, що параметри, які я встановлюю у своєму вихідному кодовому блоці, взагалі не надходили до котирувального пункту поза запитом на покупку.
Лаура

@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']Див.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.