Copia di opzioni personalizzate dinamiche per quotare l'articolo, ordinare l'articolo


13

Ho un osservatore che sta aggiungendo opzioni personalizzate dinamiche alla pagina dei dettagli del prodotto, che viene chiamata catalog_controller_product_viewall'evento. Ciò consente al cliente di selezionare da un elenco a discesa dei codici di licenza esistenti.

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

Ma quando inserisco l'ordine, le opzioni selezionate vengono salvate solo in info_buyRequest. C'è un modo per farlo salvare come se fosse un'opzione di prodotto creata nell'amministratore?

Risposte:


6

Ho fatto qualcosa di simile ma non del tutto. Forse aiuta.
il mio compito era di avere una casella di controllo su ogni pagina del prodotto chiamata gift wrap. Se controllato quindi, il team di vendita saprebbe avvolgere il prodotto (avevano solo una singola opzione di avvolgimento).
Quindi l'ho fatto per poter trasferire il wrapvalore della casella di controllo dal prodotto al preventivo all'ordine. (Avrei potuto usare un'opzione personalizzata ma è brutto aggiungere un'opzione a poche migliaia di prodotti).

Ho avuto un osservatore per l'evento 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;
}

Ho riscritto l' Mage_Catalog_Helper_Product_Configuration::getCustomOptionshelper per dire a Magento che la mia opzione è importante e dovrebbe trattarla separatamente

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

Per lo stesso motivo che ho riscritto, Mage_Sales_Block_Order_Item_Renderer_Default::getItemOptionsquindi la mia opzione verrà visualizzata nel carrello

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

e la colonna del nome dell'amministratore per la griglia degli articoli dell'ordine:

<?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]
Sembra che mi sia perso qualcosa. Ho implementato l'opzione per aggiungere una confezione regalo una volta che il prodotto è nel carrello.
Ma penso che puoi utilizzare lo stesso codice in un evento prima o dopo aver aggiunto l'articolo al carrello.

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

Questo è tutto. Spero che tu possa ricavarne qualcosa di utile.


Dove ho problemi è ottenere l'opzione. Quando chiamo $ item-> getOptionByCode ('license_code') ricevo un valore null. Le mie opzioni non vengono nemmeno visualizzate quando chiamo quanto segue: $ helper = Mage :: helper ('catalog / product_configuration'); $ options = $ helper-> getCustomOptions ($ quoteItem); Come si imposta l'opzione "a capo"?
Laura,

@Laura. Verificherò se mi sono perso qualcosa e tornerò da te.
Marius

@Laura. Ho ricontrollato e sembra che mi sia perso qualcosa. Per me, l'opzione per aggiungere la confezione regalo è mostrata solo nel carrello. Ho dimenticato di averlo modificato perché il client lo ha richiesto. Ho aggiornato la risposta con il codice che ho usato in un'azione personalizzata. Forse puoi aggiungerlo in un osservatore di eventi carrello.
Marius

Alla fine ho analizzato la richiesta di acquisto. Il problema è che le opzioni che sto impostando nel mio blocco di codice originale non venivano affatto trasferite all'oggetto del preventivo al di fuori della richiesta di acquisto.
Laura,

@Marius Voglio aggiungere il prodotto nel carrello con l'opzione di generare al volo senza aggiungere l'opzione di prodotto nel lato amministratore come possibile
Pushpendra Singh

4

Legando alla risposta di Marius, ecco qualcosa che ho escogitato:

Ho un controller personalizzato che gestisce la configurazione di un tipo di prodotto personalizzato. Questo controller aggiunge additional_optionsdurante l'aggiunta al carrello.

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

In un osservatore sull'evento sales_convert_quote_item_to_order_item, quindi afferro additional_optionse imposto come opzioni sull'ordine:

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

Usando additional_optionsnon dovresti preoccuparti di vari blocchi / modelli che rendono le opzioni (anche se potresti preferire un formato alterato) in quanto questi blocchi chiameranno $options['additional_options']Vedi qui

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.