Instead of using a custom controller it's easier (and perhaps cleaner) to do this from a controller. So, we'll need to build a little module for that
config.xml
<?xml version="1.0"?>
<config>
[...]
<global>
<fieldsets>
<sales_convert_quote_item>
<custom_attribute_column>
<to_order_item>*</to_order_item>
</custom_attribute_column>
</sales_convert_quote_item>
</fieldsets>
<resources>
<[namespace]_[module]_setup>
<setup>
<module>[Namespace]_[Module]</module>
<class>Mage_Sales_Model_Mysql4_Setup</class>
</setup>
</[namespace]_[module]_setup>
</resources>
<models>
<[namespace]_[module]>
<class>[namespace]_[module]_Model</class>
</[namespace]_[module]>
</models>
<events>
<checkout_cart_product_add_after>
<observers>
<[namespace]_[module]_checkout_cart_product_add_after>
<type>model</type>
<class>[Namespace]_[Module]_Model_Observer</class>
<method>checkoutCartProductAddAfter</method>
</[namespace]_[module]_checkout_cart_product_add_after>
</observers>
</checkout_cart_product_add_after>
</events>
</global>
[...]
</config>
your setup script
$installer = $this;
$installer->getConnection()->addColumn($this->getTable('sales_flat_quote_item'), 'custom_attribute_column', 'varchar(255) NOT NULL');
$installer->getConnection()->addColumn($this->getTable('sales_flat_order_item'), 'custom_attribute_column', 'varchar(255) NOT NULL');
$installer->endSetup();
And the observer [Namespace]/[Module]/Model/Observer.php
class [Namespace]_[Module]_Model_Observer
{
public function checkoutCartProductAddAfter($observer)
{
$item = $observer->getEvent()->getQuoteItem();
$item->setData('custom_attribute_column', 'the value');
$item->save();
return $this;
}
}