There are many things to consider when taking this approach, and there are several ways you can do this. If something is not so simple.
A) First, see if this can be done using existing custom product options. If you can do it in any way without having to change a lot of kernel functionality, it will make your life easier.
B) Personally, I would consider creating a model for your custom content and the relationship between this content and sales/quote_item and sales/order_item . You will need to change the external interface to enable this, as well as the admin area to display information, and give administrators the ability to add custom content to items. This is probably the most thorough way to do this.
C) Alternatively, you can add an array of data to the quote when the item is added to the quote. To do this, you will have to completely grab the additional basket controller. To get started, take all the functions from an existing controller. Look at the function Mage_Sales_Model_Quote :: addProduct (), and you will see that it takes two parameters:
$quote->addProduct($product, $request);
where $request is of type Varien_Object , formatted as follows:
$request = new Varien_Object(array( 'qty'=>$qty, 'options'=>$options, 'custom_options'=>$custom_options ));
and where $custom_options is an array of user data.
This method may be useful, but fraught with danger. You need to make sure that you duplicate all the functionality of the original controller to add to the cart, including sending an event and setting all the session flags. There are other considerations. If your data has a specific position, we can safely assume that you do not want Magento to simply increase the number of positions in the basket, since specific data refers to a specific position. To do this, you must override Mage_Sales_Model_Quote and duplicate the getItemByProduct() function to run another set of checks in position to determine whether to increase qty.
If you can't do A, B is my recommended approach. This is probably more time for a short-term but better solution in the long run.