Pages

Monday, July 1, 2013

Magento – Add custom comment box to each product in Cart

Are you looking for the solution i.e. customer can provide their inputs or comments along with the products they are going to order. To make it easier, one way is to allow them enter the comments for each individual item they order.

On the other hand, admin should be able to view the comment on the order page.

Adding a custom comment box for each item in the cart is actually very easy. First lets add the textarea field for each item.

In your theme, for the file: template/checkout/cart.phtml
Add the new heading along with other heading for cart items.
    <th><?php echo $this->__('Comments') ?></th>

In the file: template/checkout/cart/item/default.phtml
Add a new column
    <td class="a-center">
    <textarea name="cart[<?php echo $_item->getId() ?>][comments]" rows="3" cols="20"><?php echo $_item->getItemcomment() ?></textarea>
    </td>

For Older version of Magento it would be:
    <td class="a-center">
    <textarea name="cart[<?php echo $_item->getId() ?>][comments]" rows="3" cols="20"><?php echo $this->getItemItemcomment($_item) ?></textarea>
    </td>

Doing upto this. shoul show the text area added

The next step is to save the comment in DB, when customer update the cart.

So add a new field ‘itemcomment’ in the tabel ‘sales_flat_quote_item’. (For older version of Magento the table would be ‘sales_quote_item’)

Now we are going to add the code which will do the DB operation. For this we will need to modify the file:
app/code/core/Mage/Checkout/Model/Cart.php (Note: If you are planning to upgrade your Magento setup, copy this file to local & modify.)

Here we need to add some code to the function updateItems(), such a way that the function should now look like below:
    public function updateItems($data)
    {
        Mage::dispatchEvent('checkout_cart_update_items_before', array('cart'=>$this, 'info'=>$data));
   
        foreach ($data as $itemId => $itemInfo) {
   
            $item = $this->getQuote()->getItemById($itemId);
            if (!$item) {
                continue;
            }
   
            if (!empty($itemInfo['remove']) || (isset($itemInfo['qty']) && $itemInfo['qty']=='0')) {
                $this->removeItem($itemId);
                continue;
            }
   
            $qty = isset($itemInfo['qty']) ? (float) $itemInfo['qty'] : false;
            if ($qty > 0) {
                $item->setQty($qty);
            }
   
        /* Start: Custom code added for comments */
        if(!empty($itemInfo['comments'])) {
   
            $write = Mage::getSingleton('core/resource')->getConnection('core_write');
   
            # make the frame_queue active
            $query = "UPDATE `sales_flat_quote_item` SET itemcomment = '".$itemInfo['comments']."' where item_id = $itemId";
            $write->query($query);
   
            $item->setItemcomment($itemInfo['comments']);
        }
        /* End: Custom code added for comments */
   
        }
   
        Mage::dispatchEvent('checkout_cart_update_items_after', array('cart'=>$this, 'info'=>$data));
        return $this;
    }

Showing the comment in Admin -> View Order

Add a new function getItemcomment() to the file below:
app/code/core/Mage/Adminhtml/Block/Sales/Order/View/Items.php

If you are on verstion 1.5 or later.. add it to the file below.
app/code/core/Mage/Adminhtml/Block/Sales/Order/View/Items.php
        public function getItemcomment($item) {
            $itemId = $item->getId();

            $write = Mage::getSingleton('core/resource')->getConnection('core_write');
   
            $query = "SELECT q.* FROM `sales_flat_order_item` o
            LEFT JOIN `sales_flat_quote_item` q on o.quote_item_id = q.item_id
            WHERE o.item_id = $itemId";
   
            # For older versions of Magento
    /*      $query = "SELECT q.* FROM `sales_order_entity_int` o
            LEFT JOIN `sales_flat_quote_item` q on o.value = q.entity_id
            WHERE o.entity_id = $itemId AND o.attribute_id = 343";       */   
   
        $res = $write->query($query);

        while ($row = $res->fetch() ) {
            if(key_exists('itemcomment',$row)) {
                echo nl2br($row['itemcomment']);
     }
   }
   }  

To add the comments column to the items edit the .phtml file below:
app/design/adminhtml/default/default/template/sales/order/view/items.phtml

Adding header for items to make it look like below:

<tr class="headings">
    <th><?php echo $this->helper('sales')->__('Product') ?></th>
        <th><?php echo $this->helper('sales')->__('Comments') ?></th>
    <th><?php echo $this->helper('sales')->__('Item Status') ?></th>


Adding Column with comments. app/design/adminhtml/default/default/template/sales/order/view/items/renderer/default.phtml
Add a column for item comments juts before status columns to make it look a like below.

<td><?php echo $this->getItemcomment($_item) ?></td> <!-- New column added for item comments -->
<td class="a-center"><?php echo $_item->getStatus() ?></td>


Doing upto this will show the comments column in the item table.

No comments:

Post a Comment