Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Add a custom option to a quote item (product in the cart)?

I'm running Magento 1.7.

I'm trying to add a quote item option, a custom one, in sales_flat_quote_item_option.

I have tried with addOption and addCustomOption functions, but it seems no query is launched to the database.

This is my code right now (in a custom module helper) :

public function assignDocumentToQuoteItem(Mage_Sales_Model_Quote_Item $quoteItem, $documentid)
{
    if (is_numeric($documentid) && $documentid > 0) {
        /** @var Mage_Catalog_Model_Product */
        $product = $quoteItem->getProduct();

        $quoteItem->addOption(array(
            'product_id' => $product->getId(),
            'product'    => $product,
            'code'       => 'documentid',
            'value'      => $documentid
        ));
        $quoteItem->save();
        return true;
    }

    throw new Exception(__METHOD__.' - Document id has to be a numeric value.');
}
like image 294
guillaume_shm Avatar asked Jun 06 '12 08:06

guillaume_shm


People also ask

How do you add a free product in cart automatically when any other product added in CART in Magento 2?

To make gifts automatically add to the shopping cart in the Action tab, shop admins need to choose Automatic in the Type field. The number of gifts allowed field support to limit the number of free gifts a client can receive when applying the rule.


1 Answers

Yes this is possible, you need to use the observer

I have been adding Delivery date with each product in the orders

So you can change this to be the Option you want to add to each product or so.

         <controller_action_predispatch_checkout>
            <observers>
                <options_observer>
                    <class>YOUR_CLASS_NAME</class>
                    <method>setProductInfo</method>
                </options_observer>
            </observers>
        </controller_action_predispatch_checkout>

public function setProductInfo($observer)
{
    if ('checkout_cart_add' != $observer->getEvent()->getControllerAction()->getFullActionName()) {
        return;
    }
    $request = Mage::app()->getRequest();
    $prId = $request->getParams();
    $product = Mage::getModel('catalog/product')->load($prId['product']);
    // fixed spelling of cofigurable/configurable
    if ($product->getTypeId() == 'configurable') {
        return $this;
    }

    if (!$product->getHasOptions()) {
        $optionID = $this->saveProductOption($product);
    } else {
        $options = $product->getOptions();
        if ($options) {
            foreach ($options as $option) {
                if ($option->getTitle() == 'Delivery Date') {
                    $optionID = $option->getOptionId();
                }
            }
        }
        if (empty($optionID)) {
            $optionID = $this->saveProductOption($product);
        }
    }

    $deliveryDate = $prId['delivery_date'];
    if (!empty($deliveryDate)) {
        $opt['options'] = array($optionID => $deliveryDate);
        $request->setParams($opt);
    }

    return $this;
}

function saveProductOption($product)
{

    $store = Mage::app()->getStore()->getId();
    $opt = Mage::getModel('catalog/product_option');
    $opt->setProduct($product);
    $option = array(
        'is_delete' => 0,
        'is_require' => false,
        'previous_group' => 'text',
        'title' => 'Delivery Date',
        'type' => 'field',
        'price_type' => 'fixed',
        'price' => '0.0000'
    );
    $opt->addOption($option);
    $opt->saveOptions();
    Mage::app()->setCurrentStore(Mage::getModel('core/store')->load(Mage_Core_Model_App::ADMIN_STORE_ID));
    $product->setHasOptions(1);
    $product->save();

    $options = $product->getOptions();
    if ($options) {
        foreach ($options as $option) {
            if ($option->getTitle() == 'Delivery Date') {
                $optionID = $option->getOptionId();
            }
        }
    }
    Mage::app()->setCurrentStore(Mage::getModel('core/store')->load($store));
    return $optionID;
}
like image 106
Meabed Avatar answered Sep 23 '22 19:09

Meabed