Dynamische benutzerdefinierte Optionen kopieren, um Artikel zu zitieren, Artikel bestellen

13

Ich habe einen Beobachter, der der Produktdetailseite, die für das catalog_controller_product_viewEreignis aufgerufen wird, dynamische benutzerdefinierte Optionen hinzufügt . Auf diese Weise kann der Kunde aus einer Dropdown-Liste seiner vorhandenen Lizenzcodes auswählen.

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

Wenn ich die Bestellung aufgebe, werden die ausgewählten Optionen jedoch nur in der gespeichert info_buyRequest. Gibt es eine Möglichkeit, es so zu speichern, als wäre es eine im Administrator erstellte Produktoption?

Laura
quelle

Antworten:

6

Ich habe etwas Ähnliches gemacht, aber nicht ganz. Vielleicht hilft es.
Meine Aufgabe war es, auf jeder Produktseite ein Kontrollkästchen mit dem Namen zu haben gift wrap. Wenn diese Option aktiviert ist, weiß das Verkaufsteam, dass es das Produkt verpacken muss (es gab nur eine einzige Verpackungsoption).
Also habe ich das gemacht, um den wrapWert der Checkbox vom Produkt zum Angebot zur Bestellung zu portieren . (Ich hätte eine benutzerdefinierte Option verwenden können, aber es ist hässlich, ein paar tausend Produkten eine Option hinzuzufügen).

Ich hatte einen Beobachter für das Ereignis 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;
}

Ich habe den Mage_Catalog_Helper_Product_Configuration::getCustomOptionsHelfer umgeschrieben , um Magento mitzuteilen, dass meine Option wichtig ist und separat behandelt werden sollte

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

Aus dem gleichen Grund habe ich umgeschrieben, Mage_Sales_Block_Order_Item_Renderer_Default::getItemOptionsso dass meine Option im Warenkorb angezeigt wird

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

und die Spalte mit dem Administratornamen für das Bestellpositionengitter:

<?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]
Es scheint, als hätte ich etwas verpasst. Ich habe die Option zum Hinzufügen einer Geschenkverpackung erst implementiert, wenn sich das Produkt im Warenkorb befindet.
Aber ich denke, Sie können den gleichen Code in einem Ereignis vor oder nach dem Hinzufügen des Artikels in den Warenkorb verwenden.

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

Das ist es. Ich hoffe, Sie können etwas Nützliches daraus machen.

Marius
quelle
Wo ich Probleme habe, bekomme ich die Option. Wenn ich $ item-> getOptionByCode ('license_code') aufrufe, erhalte ich eine Null. Meine Optionen werden nicht einmal angezeigt, wenn ich Folgendes aufrufe: $ helper = Mage :: helper ('catalog / product_configuration'); $ options = $ helper-> getCustomOptions ($ quoteItem); Wie stellen Sie die Option "Wrap" ein?
Laura
@Laura. Ich werde nachsehen, ob ich etwas verpasst habe und mich bei Ihnen melden.
Marius
@Laura. Ich habe doppelt nachgesehen und es scheint, als hätte ich etwas verpasst. Für mich ist die Option, Geschenkverpackungen hinzuzufügen, nur im Warenkorb sichtbar. Ich habe vergessen, dass ich dies geändert habe, weil der Kunde es angefordert hat. Ich habe die Antwort mit dem Code aktualisiert, den ich in einer benutzerdefinierten Aktion verwendet habe. Vielleicht können Sie es in einem Warenkorb Ereignisbeobachter hinzufügen.
Marius
Schließlich habe ich die Kaufanfrage analysiert. Das Problem ist, dass die Optionen, die ich in meinem ursprünglichen Codeblock einstelle, außerhalb der Kaufanfrage überhaupt nicht auf den Angebotsposten übertragen wurden.
Laura
@Marius Ich möchte Produkt in den Warenkorb mit on the fly generieren Option ohne Hinzufügen in Produktoption in Admin-Seite, wie es möglich ist
Pushpendra Singh
4

In Anlehnung an Marius 'Antwort habe ich mir Folgendes ausgedacht:

Ich habe einen benutzerdefinierten Controller, der die Konfiguration eines benutzerdefinierten Produkttyps verwaltet. Dieser Controller fügt additional_optionswährend des Hinzufügens zum Warenkorb hinzu.

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

Bei einem Beobachter des Ereignisses sales_convert_quote_item_to_order_itemgreife ich dann zu additional_optionsund setze als Optionen auf die Bestellposition:

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

Wenn additional_optionsSie diese Option verwenden, müssen Sie sich nicht um verschiedene Blöcke / Vorlagen kümmern, die die Optionen rendern (obwohl Sie möglicherweise ein geändertes Format bevorzugen), da diese Blöcke die Option " Hier sehen" aufrufen$options['additional_options']

pspahn
quelle