Copie d'options personnalisées dynamiques pour citer un article, commander un article


13

J'ai un observateur qui ajoute des options personnalisées dynamiques à la page de détails du produit, qui est appelée lors de l' catalog_controller_product_viewévénement. Cela permet au client de choisir parmi une liste déroulante de ses codes de licence existants.

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

Mais, lorsque je passe la commande, les options sélectionnées ne sont enregistrées que dans le info_buyRequest. Existe-t-il un moyen de l'enregistrer comme s'il s'agissait d'une option de produit créée dans l'administrateur?

Réponses:


6

J'ai fait quelque chose de similaire mais pas tout à fait. Peut-être que ça aide.
ma tâche était d'avoir une case à cocher sur chaque page de produit appelée gift wrap. Si cette case était cochée, l'équipe de vente saurait envelopper le produit (elle n'avait qu'une seule option d'emballage).
J'ai donc fait cela afin de pouvoir porter la wrapvaleur de la case à cocher du produit au devis à la commande. (J'aurais pu utiliser une option personnalisée mais c'est moche d'ajouter une option à quelques milliers de produits).

J'avais un observateur pour l'événement 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;
}

J'ai réécrit l' Mage_Catalog_Helper_Product_Configuration::getCustomOptionsaide pour dire à Magento que mon option est importante et que je dois la traiter séparément

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

Pour la même raison que j'ai réécrit Mage_Sales_Block_Order_Item_Renderer_Default::getItemOptions, mon option sera affichée dans le panier

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

et la colonne du nom d'administrateur pour la grille des articles commandés:

<?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]
Il semble que j'ai raté quelque chose. Je n'ai implémenté l'option d'ajouter un emballage cadeau qu'une fois le produit dans le panier.
Mais je pense que vous pouvez utiliser le même code lors d'un événement avant ou après avoir ajouté l'article au panier.

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

C'est ça. J'espère que vous pourrez en tirer quelque chose d'utile.


Là où j'ai du mal, c'est d'obtenir l'option. Lorsque j'appelle $ item-> getOptionByCode ('license_code'), j'obtiens un null. Mes options n'apparaissent même pas lorsque j'appelle ce qui suit: $ helper = Mage :: helper ('catalog / product_configuration'); $ options = $ helper-> getCustomOptions ($ quoteItem); Comment définissez-vous l'option «wrap»?
Laura

@Laura. Je vais vérifier si j'ai raté quelque chose et je vous répondrai.
Marius

@Laura. J'ai revérifié et il me semble que j'ai raté quelque chose. Pour moi, l'option d'ajouter un emballage cadeau est affichée uniquement dans le panier. J'ai oublié d'avoir changé cela parce que le client l'avait demandé. J'ai mis à jour la réponse avec le code que j'ai utilisé dans une action personnalisée. Vous pouvez peut-être l'ajouter dans un observateur d'événement de chariot.
Marius

J'ai fini par analyser la demande d'achat après tout. Le problème est que les options que je définis dans mon bloc de code d'origine n'étaient pas du tout transférées vers l'élément de devis en dehors de la demande d'achat.
Laura

@Marius Je veux ajouter un produit dans le panier avec l'option de génération à la volée sans ajouter l'option de produit dans le côté administrateur, comment cela est possible
Pushpendra Singh

4

En lien avec la réponse de Marius, voici quelque chose que j'ai trouvé:

J'ai un contrôleur personnalisé qui gère la configuration d'un type de produit personnalisé. Ce contrôleur s'ajoute additional_optionslors de l'ajout au panier.

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

Dans un observateur sur l'événement sales_convert_quote_item_to_order_item, je prends ensuite le additional_optionset définit comme options sur l'article de commande:

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

En utilisant, additional_optionsvous ne devriez pas avoir à vous soucier des différents blocs / modèles qui rendent les options (bien que vous puissiez préférer un format modifié) car ces blocs appellent $options['additional_options']See Here

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.