Magento – Adding a custom entity value in Order table

magento-1.7

I need to do relatively a small thing with magento. But confused since I am a beginner in module development.

  • I added 2 columns named percentorder and commission into table
    sales_flat_order
  • Now I need to add values to those two columns when user creates an Order.

How can I do that? Should I override the order related models? or write an event Observer?

Best Answer

You can do this easily with an Observer.

Firstly, I would add this to your config.xml:

<config>
...
  <global>
  ...
    <events>
      <sales_order_save_before>
        <observers>
          <module_order_save_before>
            <type>singleton</type>
            <class>module/observer</class>
            <method>orderSaveBefore</method>
          </module_order_save_before>
        </observers>
      </sales_order_save_before>
    </events>
  ...
  </global>
...
</config>

If you are calculating the values of these 2 columns, you can do the following in your Observer.

Observer.php:

public function orderSaveBefore($obs) {
  $event = $obs->getEvent();
  $order = $event->getOrder();

  $order->setPercentorder(value);
  $order->setCommission(value);
  return $this;
}

If however, you're relying on input from a form that you can attach to with an event, you can do something similar to this:

Observer.php

public function orderSaveBefore($obs) {
  $event = $obs->getEvent();
  $order = $event->getOrder();
  $request = Mage::app()->getFrontController()->getRequest();
  $percentorder = $request->getParam('percentorder');
  $commission = $request->getParam('commission');

  $order->setPercentorder(value);
  $order->setCommission(value);
  return $this;
}

If you hook into the models save_before event, you can set the values for the columns before the order actually gets saved, reducing the cost of having to use save() again.