Magento – Failing to add new attribute to order

adminhtmlmagento-1.9PHP

I am using Magento 1.9.0.1 and right now i am developing a magento extension to add new custom attribute to the order.

I am doing everything by this guide: https://stackoverflow.com/questions/12936470/adding-a-new-attribute-to-order-in-magento You can see the guide as an answer to the question.

So let me show all the files i've created:

1: /app/code/community/VivasIndustries/Vshippingone/etc/config.xml:

<?xml version="1.0"?>
<config>
    <modules>
        <VivasIndustries_Vshippingone>
            <version>1.1</version>
        </VivasIndustries_Vshippingone>
    </modules>

    <global> 
         <fieldsets>
            <sales_convert_quote>                           
                <my_custom_input_field_one><to_order>*</to_order></my_custom_input_field_one>
            </sales_convert_quote>

            <sales_convert_order>                                              
                <my_custom_input_field_one><to_quote>*</to_quote></my_custom_input_field_one>
            </sales_convert_order>
        </fieldsets>
        <helpers>
            <vshippingone>
                <class>VivasIndustries_Vshippingone_Helper</class>
            </vshippingone>            
        </helpers>

        <models>
            <vshippingone>
                <class>VivasIndustries_Vshippingone_Model</class>
                <resourceModel>vshippingone_mysql4</resourceModel>
            </vshippingone>
        </models>
        <resources>
            <vshippingone_setup>
                <setup>
                    <module>VivasIndustries_Vshippingone</module>
                    <class>Mage_Sales_Model_Mysql4_Setup</class>
                </setup>
                <connection>
                    <use>core_setup</use>
                </connection>
            </vshippingone_setup>
            <vshippingone_write>
                <connection>
                    <use>core_write</use>
                </connection>
            </vshippingone_write>
            <vshippingone_read>
                <connection>
                    <use>core_read</use>
                </connection>
            </vshippingone_read>
        </resources>

        <events>
            <adminhtml_sales_order_create_process_data_before>
                <observers>
                    <vshippingone>
                        <type>singleton</type>
                        <class>vshippingone/observer</class>
                        <method>saveCustomDataOne</method>
                    </vshippingone>
                </observers>
            </adminhtml_sales_order_create_process_data_before>
        </events>

        <blocks>
            <vshippingone>
                <class>VivasIndustries_Vshippingone_Block</class>
            </vshippingone>
        </blocks>
    </global>
</config>

2: /app/code/community/VivasIndustries/Vshippingone/Model/Observer.php:

<?PHP
class VivasIndustries_Vshippingone_Model_Observer 
{
    public function saveCustomDataOne($event)
    {
        $quote = $event->getSession()->getQuote();
        $quote->setData('my_custom_input_field_one', $event->getRequestModel()->getPost('my_custom_input_field_one'));

        return $this;
    }
}

3: /app/code/community/VivasIndustries/Vshippingone/sql/vshippingone_setup/mysql4-install-1.1.php

<?php
$installer = $this;
$installer->startSetup();

$installer->addAttribute("order", "my_custom_input_field_one", array("type"=>"varchar"));
$installer->addAttribute("quote", "my_custom_input_field_one", array("type"=>"varchar"));
$installer->endSetup();

4: /app/etc/modules/VivasIndustries_Vshippingone.xml:

<?xml version="1.0"?>
<config>
  <modules>
    <VivasIndustries_Vshippingone>
      <active>true</active>
      <codePool>community</codePool>
      <version>1.1</version>
    </VivasIndustries_Vshippingone>
  </modules>
</config>

By my understanding i've added the following:

In: /app/design/frontend/base/default/template/checkout/onepage/shipping_method/available.phtml – I've added the following line so i can see the input field in the checkout page:

<input type="text" name="my_custom_input_field_one" id="my_custom_input_field_one"></input>

Then in: /app/design/adminhtml/default/default/template/sales/order/view/tab/info.phtml:

I've added the following:

<?php if($_order->getMyCustomInputFieldOne()): ?>
<tr>
    <td class="label"><label><?php echo Mage::helper('sales')->__('My Custom Input Field One') ?></label></td>
    <td class="value"><strong><?php echo $_order->getMyCustomInputFieldOne() ?></strong></td>
</tr>
<?php endif; ?>         

Then i go and submit a new order. Then i go back in the admin panel to see that new order and i can not see the information shown in the admin order view page.

When i remove the if statements i simply see this text My Custom Input Field One but nothing more. I can not see the information inserted in the input field in the checkout page before submiting the order.

This are all the files i have created and edited. Nothing else was made or changed. Perhaps i am forgetting something, but i do not know what, or i have mistake somewhere.

Can you help me out fix it ?

Best Answer

For Adding custom attribute, we have to create new column for custom attribute field in sales_flat_order and sales_flat_quote

We can create it By 2 ways

  1. By custom Module Mysql setup file (file path- app/code/local/pwt/singlepagecheckout/sql/singlepagecheckout_setup/mysql4-install-1.1.php)

Here (pwt -NameSpace, singlepagecheckout-Module)

    $installer = $this;
    $installer->startSetup();
    $installer->addAttribute("order", "delivery_date", array("type"=>"varchar"));
    $installer->addAttribute("quote", "delivery_date", array("type"=>"varchar"));
    $installer->endSetup();
  1. If you don't have a own module, simply create a php file in the project's root folder with the below code and run this file manually

     <?php require_once('app/Mage.php');
     Mage::app()->setCurrentStore(Mage::getModel('core/store')->load(Mage_Core_Model_App::ADMIN_STORE_ID));
     $installer = new Mage_Sales_Model_Mysql4_Setup;
     $attribute  = array(
         'type'          => 'varchar',
         'backend_type'  => 'varchar',
         'frontend_input' => 'varchar',
         'is_user_defined' => true,
         'label'         => 'Delivery Date,
         'visible'       => true,
         'required'      => false,
         'user_defined'  => false,
         'searchable'    => false,
         'filterable'    => false,
         'comparable'    => false,
         'default'       => ""
     );
     $installer->addAttribute('order', 'delivery_date', $attribute);
     $installer->addAttribute('quote', 'delivery_date', $attribute);
     $installer->endSetup();
    
     echo "success";
    

Run this file on root folder

Now we have allotted a space for our custom attribute in DB (Created new column in sales_flat_order and sales_flat_quote table)

After this, we have to add this custom attribute to global scope in config.xml.

(if you have been using custom module file path is-app/code/local/pwt/singlepagecheckout/etc/config.xml

if not, app/code/core/mage/sales/etc/config.xml. But editing core file isn't good practice )

<global>
   ...
    <fieldsets>
        <sales_convert_quote>                           
            <delivery_date><to_order>*</to_order></delivery_date>
        </sales_convert_quote>

        <sales_convert_order>                                              
            <delivery_date><to_quote>*</to_quote></delivery_date>
        </sales_convert_order>
    </fieldsets>
    ...
</global>

Then create an event in this same config.xml file

<global>
    ...
    <events>
        <checkout_type_onepage_save_order>
        <observers>
            <delivery_date_observer>
                <type>singleton</type>
                <class>singlepagecheckout/observer</class>
                <method>saveCustomData</method>
            </delivery_date_observer>
        </observers>
        </checkout_type_onepage_save_order>
    </events>
    ...
</global>

<class>singlepagecheckout/observer</class> –Edit as per your custom module name (in core file you can simply put sales/observer)

The above event triggers the following observer method

public function saveCustomData($observer)
{
    $event = $observer->getEvent();
    $order = $event->getOrder();
    $fieldVal = Mage::app()->getFrontController()->getRequest()->getParams();
    $order->setDeliveryDate($fieldVal['delivery_date']);
}