Teklif öğesi, sipariş öğesi için dinamik özel seçenekleri kopyalama


13

catalog_controller_product_viewOlayda çağrılan ürün ayrıntıları sayfasına dinamik özel seçenekler ekleyen bir gözlemcim var . Bu, müşterinin mevcut lisans kodlarının açılır listesinden seçim yapmasına olanak tanır.

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

Ancak, siparişi verdiğimde, seçilen seçenekler sadece info_buyRequest. Yönetici olarak oluşturulmuş bir ürün seçeneği gibi kaydetmek için bir yolu var mı?

Yanıtlar:


6

Benzer bir şey yaptım ama pek de değil. Belki yardımcı olur.
benim görevim her ürün sayfasında bir onay kutusu olmasıydı gift wrap. Daha sonra işaretlenirse, satış ekibi ürünü sarmayı bilebilir (sadece tek bir sarma seçeneği vardı).
Bu yüzden wraponay kutusunun değerini üründen alıntıya kadar sipariş edebilmek için yaptım . (Özel bir seçenek kullanabilirdim, ancak birkaç bin ürüne bir seçenek eklemek çirkin).

Olay için bir gözlemcim vardı 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'ya seçeneğimin önemli olduğunu ve ayrı ayrı ele alınması gerektiğini söylemek için yardımcıyı yeniden yazdım

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

Aynı nedenden ötürü yeniden Mage_Sales_Block_Order_Item_Renderer_Default::getItemOptionsyazdım, böylece seçeneğim sepette görüntülenecek

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

ve sipariş öğeleri ızgarasının yönetici adı sütununu:

<?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]
Bir şeyi kaçırdığım dikişler. Hediye paketini yalnızca ürün sepete girdikten sonra uyguladım.
Ancak, aynı kodu bir öğeyi sepete eklemeden önce veya sonra bir etkinlikte kullanabileceğinizi düşünüyorum.

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

Bu kadar. Umarım faydalı bir şey elde edebilirsiniz.


Sorun yaşadığım yer seçeneği bulmak. $ İtem-> getOptionByCode ('license_code') öğesini çağırdığımda null alıyorum. Aşağıdakileri çağırdığımda seçeneklerim bile görünmüyor: $ helper = Mage :: helper ('catalog / product_configuration'); $ options = $ helper-> getCustomOptions ($ quoteItem); 'Sarma' seçeneğini nasıl ayarlıyorsunuz?
Laura

@Laura. Bir şeyi özlediğimi kontrol edip size döneceğim.
Marius

@Laura. Çift kontrol ve bir şey özledim dikişler. Benim için hediye paketleme ekleme seçeneği sadece alışveriş sepetinde gösterilir. Müşteri istediğim için bunu değiştirdiğimi unuttum. Cevabı özel bir işlemde kullandığım kodla güncelledim. Belki bunu bir sepet etkinliği gözlemcisine ekleyebilirsiniz.
Marius

Sonuçta satın alma talebini ayrıştırdım. Sorun, orijinal kod bloğumda belirlediğim seçeneklerin, satın alma talebinin dışındaki teklif öğesine aktarılmamasıydı.
Laura

@Marius Ben yönetici tarafında ürün seçeneği eklemek olmadan anında üretmek seçeneği ile sepeti ürün eklemek istiyorum
Pushpendra Singh

4

Marius'un cevabına dayanarak, işte bulduğum bir şey:

Özel bir ürün türünün yapılandırmasını işleyen özel bir denetleyicim var. Bu denetleyici additional_optionssepete ekleme sırasında ekler .

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

Olaydaki bir gözlemcide, sales_convert_quote_item_to_order_itemdaha sonra additional_optionssipariş kaleminde seçenekler olarak ayarladım:

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

Kullanarak additional_options, seçenekleri değiştiren çeşitli bloklar / şablonlar hakkında endişelenmenize gerek kalmamalı (değiştirilmiş bir formatı tercih etmenize rağmen), bu bloklar $options['additional_options']Burada Göreceksiniz

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.