Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Add a Custom Field on Opencart admin 'Order Info' page

I want to add custom field on opencart admin order pages.

  1. compare value like if oc_order.order_id = oc_custom_table.order_id then display oc_custom_table.comment on admin order list.
  2. display same thing on admin order info page.

I added a custom function in admin_model_order.php page where there all all queries.

public function getCustomTable($order_id) {
        $query = $this->db->query("SELECT * FROM " . DB_PREFIX . "custom_table WHERE order_id = '" . (int)$order_id . "'");

        return $query->rows;
    }

The controller page is pretty crowded and i have no idea where to add variables so it displays order specific info.

In the language, I just have to define language variables like $_text_custom_variable = 'test'; right? and template files, I just choose a place to display the value.

I am using Opencart 2.0 version.

[EDIT]: Okay so i was able to write a VQMOD by referencing one of the vqmod for it but still cannot pull up data. I get error Trying to get property of non-object

I tried first adding the data in order list.

<!--Template File -->
<file name="admin/view/template/sale/order_list.tpl">
        <operation>
            <search position="before"><![CDATA[
            <td class="text-left"><?php echo $order['date_added']; ?></td>
            ]]></search>
            <add><![CDATA[
            <td class="text-right"><?php echo 'CO'. $order['custom_orders'];?></td>
            ]]></add>
        </operation>
        <operation>
            <search position="before"><![CDATA[
            <td class="text-left"><?php if ($sort == 'o.date_added') { ?>
            ]]></search>
            <add><![CDATA[
            <td class="text-right">custom orders  <i class="fa fa-shopping-cart"></i></td>
            ]]></add>
        </operation>         
    </file>
<!--Model File -->
    <file name="admin/model/sale/order.php">
        <operation>
            <search position="before"><![CDATA[
            public function getTotalEmailsByProductsOrdered($products) {
            ]]></search>
            <add><![CDATA[
            public function getCustomOrderNumber($order_id) {
            $custom_orders ='';
            $query = $this->db->query("SELECT   o.order_id, s.external_order_number, s.custom_order_number
                                        FROM oc_order o 
                                        LEFT JOIN " . DB_PREFIX . "custom_orders s ON (s.external_order_number = o.order_id) 
                                        WHERE o.order_id = '" . (int)$order_id . "'");   
                 foreach ($query->rows as $row) {

                $custom_orders += $this->custom_orders->$row['custom_orders'];
                }
                return $custom_orders;
                } 


            ]]></add>
        </operation>        
    </file> 
<!--Controller File -->
    <file name="admin/controller/sale/order.php">   
        <operation>
            <search position="before"><![CDATA[
                'delete'        => $this->url->link('sale/order/delete', 'token=' . $this->session->data['token'] . '&order_id=' . $result['order_id'] . $url, 'SSL')
            ]]></search>
            <add><![CDATA[
                'custom_orders'     => $this->model_sale_order->getCustomOrderNumber($result['order_id']), 
            ]]></add>
        </operation>        
    </file>
like image 713
Syed Mudabbir Avatar asked Oct 04 '16 22:10

Syed Mudabbir


People also ask

How to create additional field in OpenCart?

Log into OpenCart as an administrator. On the Dashboard in the left sidebar, click Customers, and then click Custom Fields: Click on Add New button to add new fields: Fill in the name, location to display the field, input type and all other required fields.


1 Answers

I was able to figure this out myself. And this is what I understood. I maybe wrong but the simple code worked.

I was doing changes in Admin order section and it is important to figure out which method the change is being done in. For Model section, use apropriate method and add query or edit present query. Same with Controller. If you are trying to display as a list - order_list(getList()) or order_info(getInfo) section. It may be simple to people who are good at it but for me, this was my first, so it took lot of time.

below is the working code in VQMOD format.

<modification>
  <id><![CDATA[custom order list]]></id>
    <version>1</version>
    <vqmver>2.X</vqmver>
    <author>customAuthor</author>
    <file name="admin/language/english/sale/order.php">
         <operation>
            <search position="after"><![CDATA[
            $_['text_order_id']                           = 'Order ID:';
            ]]></search>
            <add><![CDATA[
            $_['text_custom_order_number']                           = 'custom:';
            ]]></add>
        </operation>
        <operation>
            <search position="after"><![CDATA[
            $_['column_order_id']                         = 'Order ID';
            ]]></search>
            <add><![CDATA[
            $_['column_custom_order_number']                         = 'custom <i class="fa fa-shopping-cart"></i>';
            ]]></add>
        </operation>

    </file>
    <file name="admin/view/template/sale/order_list.tpl">

        <operation>
            <search position="after"><![CDATA[
            <a href="<?php echo $sort_order; ?>"><?php echo $column_order_id; ?></a>
            ]]></search>
            <add><![CDATA[
            <!-- custom -->
                    <td class="text-left">
                        <?php echo $column_custom_order_number; ?></a>
                    </td>

            <!-- custom -->
            ]]></add>
        </operation>
        <operation>
            <search position="after"><![CDATA[
            <td class="text-right"><?php echo $order['order_id']; ?></td>
            ]]></search>
            <add><![CDATA[
            <td class="text-left"><?php if(!empty($order['cu_orders'])){echo "CU".$order['cu_orders'];} else{echo "  ";} ?></td>
            ]]></add>
        </operation>

    </file>
    <file name="admin/view/template/sale/order_info.tpl">

        <operation>
            <search position="after" offset="1"><![CDATA[
            <td>#<?php echo $order_id; ?></td>
            ]]></search>
            <add><![CDATA[
            <!-- Shopgate -->
                    <tr>
                        <td><?php echo $text_custom_order_number; ?></td>
                        <td><?php if (!empty($custom_order_number)) { ?>
                          <?php echo 'CU'.$custom_order_number; ?>
                          <?php } else { ?>
                          <?php echo " "; ?> 
                          <?php } ?>
                        </td>

                    </tr>

            <!-- Shopgate -->
            ]]></add>
        </operation>         
    </file>
    <file name="admin/model/sale/order.php">
    <!-- getOrder() Modifications -->
        <operation>
            <search position="replace"><![CDATA[
            (SELECT CONCAT(c.firstname, ' ', c.lastname) FROM " . DB_PREFIX . "customer c WHERE c.customer_id = o.customer_id) AS customer
            ]]></search>
            <add><![CDATA[
            (SELECT CONCAT(c.firstname, ' ', c.lastname) FROM " . DB_PREFIX . "customer c WHERE c.customer_id = o.customer_id) AS customer, (SELECT s.custom_order_number FROM " . DB_PREFIX . "custom_orders s WHERE s.custom_order_number = o.order_id) AS custom_order_number 
            ]]></add>
        </operation>
        <operation>
            <search position="after"><![CDATA[
            'order_id'                => $order_query->row['order_id'],
            ]]></search>
            <add><![CDATA[
            'custom_order_number'                => $order_query->row['custom_order_number'],
            ]]></add>
        </operation>
        <!-- getOrderS() Modifications -->
        <operation>
            <search position="replace"><![CDATA[
            CONCAT(o.firstname, ' ', o.lastname) AS customer,
            ]]></search>
            <add><![CDATA[
            CONCAT(o.firstname, ' ', o.lastname) AS customer, (SELECT s.custom_order_number FROM " . DB_PREFIX . "custom_orders s WHERE s.custom_order_number = o.order_id) AS custom_order_number,
            ]]></add>
        </operation>

    </file> 
    <file name="admin/controller/sale/order.php">   
    <!-- getList() Modifications -->
        <operation>
            <search position="after"><![CDATA[
                'order_id'      => $result['order_id'],
            ]]></search>
            <add><![CDATA[
                'cu_orders'      => $result['custom_order_number'], 
            ]]></add>
        </operation>
    <!-- getForm() Modifications -->
        <operation>
            <search position="after"><![CDATA[
                $data['store_id'] = $order_info['store_id'];
            ]]></search>
            <add><![CDATA[
                $data['custom_order_number'] = $order_info['custom_order_number'];
            ]]></add>
        </operation>
        <!-- getInfo() Modifications -->
        <operation>
            <search position="after"><![CDATA[
                $data['text_order_id'] = $this->language->get('text_order_id');
            ]]></search>
            <add><![CDATA[
                $data['text_custom_order_number'] = $this->language->get('text_custom_order_number');
            ]]></add>
        </operation>
        <operation>
            <search position="after"><![CDATA[
                $data['store_name'] = $order_info['store_name'];
            ]]></search>
            <add><![CDATA[
                $data['custom_order_number'] = $order_info['custom_order_number'];
            ]]></add>
        </operation>

    </file>         
</modification>
like image 155
Syed Mudabbir Avatar answered Nov 14 '22 22:11

Syed Mudabbir