Desciption how to add a drop down list with desired delivery date to your order form [for Zen Cart 1.3.7]

Note: in the following description I use the table prefix zen_
If you have no prefix, or another then you'll have to change it yourself.
The file & directory names were taken from a local Win XP + XAMPP environment. At linux webhosting all "\" should be the other way "/"

Note2: I have to check the email confirmation.
The desired order date seems to be missing in the email confirmation.

1. Add field to zen_orders table
Code:
 ALTER TABLE zen_orders ADD order_delivery_date date AFTER ip_address;

* FRONT-END *


2. tpl_checkout_shipping_default.php
File: includes\templates\classic\templates\tpl_checkout_shipping_default.php
In the checkout form I added a dropdown field with dates.
Note that I excluded some dates (1st & 2nd Christmas day and 1st January) because there won't be any deliveries.
Just before <fieldset class="shipping" id="comments"> I added:

Code:
<fieldset class="shipping" id="delivery_date">
<legend><?php echo TABLE_HEADING_DELIVERY_DATE; ?></legend>
<select name="delivery_date">
<?php
for ($i=0, $n=50; $i < $n; $i++) {
    $now[$i] = strtotime ("+$i day", time());
    if ( strftime ("%w",$now[$i])<>0
        AND strftime ("%m-%d",$now[$i])<>"12-25"
        AND strftime ("%m-%d",$now[$i])<>"12-26"
        AND strftime ("%m-%d",$now[$i])<>"01-01"
    ){
        echo '<option value="'.strftime ("%Y-%m-%d",$now[$i]).'">'.strftime ("%A %d %B %Y",$now[$i]).'</option>';
    }
}
?>
</select>
</fieldset>
3. order.php
File: \includes\classes\order.php
I added the order_delivery_date field in some queries:
Code:
$order_query = "select customers_id, customers_name, customers_company,
customers_street_address, customers_suburb, customers_city,
customers_postcode, customers_state, customers_country,
customers_telephone, customers_email_address, customers_address_format_id,
delivery_name, delivery_company, delivery_street_address, delivery_suburb,
delivery_city, delivery_postcode, delivery_state, delivery_country,
delivery_address_format_id, billing_name, billing_company,
billing_street_address, billing_suburb, billing_city, billing_postcode,
billing_state, billing_country, billing_address_format_id,
payment_method, payment_module_code, shipping_method, shipping_module_code,
coupon_code, cc_type, cc_owner, cc_number, cc_expires, currency, currency_value,
date_purchased, orders_status, last_modified, order_total, order_tax, ip_address
from " . TABLE_ORDERS . "
where orders_id = '" . (int)$order_id . "'";
the last 3 lines:
Code:
date_purchased, orders_status, last_modified, order_total, order_tax, ip_address, order_delivery_date
from " . TABLE_ORDERS . "
where orders_id = '" . (int)$order_id . "'";
and

Code:
$this->info = array('currency' => $order->fields['currency'],
'currency_value' => $order->fields['currency_value'],
'payment_method' => $order->fields['payment_method'],
'payment_module_code' => $order->fields['payment_module_code'],
'shipping_method' => $order->fields['shipping_method'],
'shipping_module_code' => $order->fields['shipping_module_code'],
'coupon_code' => $order->fields['coupon_code'],
'cc_type' => $order->fields['cc_type'],
'cc_owner' => $order->fields['cc_owner'],
'cc_number' => $order->fields['cc_number'],
'cc_expires' => $order->fields['cc_expires'],
'date_purchased' => $order->fields['date_purchased'],
'orders_status' => $order_status->fields['orders_status_name'],
'last_modified' => $order->fields['last_modified'],
'total' => $order->fields['order_total'],
'tax' => $order->fields['order_tax'],
'ip_address' => $order->fields['ip_address']
);
the last 3 lines:
Code:
'ip_address' => $order->fields['ip_address'],
'delivery_date' => $order->fields['delivery_date']
);
and

Code:
$this->info = array('order_status' => DEFAULT_ORDERS_STATUS_ID,
'currency' => $_SESSION['currency'],
'currency_value' => $currencies->currencies[$_SESSION['currency']]['value'],
'payment_method' => $GLOBALS[$class]->title,
'payment_module_code' => $GLOBALS[$class]->code,
'coupon_code' => $coupon_code->fields['coupon_code'],
    // 'cc_type' => (isset($GLOBALS['cc_type']) ? $GLOBALS['cc_type'] : ''),
    // 'cc_owner' => (isset($GLOBALS['cc_owner']) ? $GLOBALS['cc_owner'] : ''),
    // 'cc_number' => (isset($GLOBALS['cc_number']) ? $GLOBALS['cc_number'] : ''),
    // 'cc_expires' => (isset($GLOBALS['cc_expires']) ? $GLOBALS['cc_expires'] : ''),
    // 'cc_cvv' => (isset($GLOBALS['cc_cvv']) ? $GLOBALS['cc_cvv'] : ''),
'shipping_method' => $_SESSION['shipping']['title'],
'shipping_module_code' => $_SESSION['shipping']['id'],
'shipping_cost' => $_SESSION['shipping']['cost'],
'subtotal' => 0,
'tax' => 0,
'total' => 0,
'tax_groups' => array(),
'comments' => (isset($_SESSION['comments']) ? $_SESSION['comments'] : ''),
'ip_address' => $_SESSION['customers_ip_address'] . ' - ' . $_SERVER['REMOTE_ADDR']
);
the last 3 lines
Code:
'ip_address' => $_SESSION['customers_ip_address'] . ' - ' . $_SERVER['REMOTE_ADDR'],
'delivery_date' => $_SESSION['delivery_date']
);
and

Code:
   'ip_address' => $_SESSION['customers_ip_address'] . ' - ' . $_SERVER['REMOTE_ADDR']
   );

    zen_db_perform(TABLE_ORDERS, $sql_data_array);
changed into:
Code:
   'ip_address' => $_SESSION['customers_ip_address'] . ' - ' . $_SERVER['REMOTE_ADDR'],
   'delivery_date' => $this->info['delivery_date']
   );

    zen_db_perform(TABLE_ORDERS, $sql_data_array);
4. header_php.php
File: \includes\modules\pages\checkout_shipping\header_php.php
I added some lines of code after:
Code:
  if (isset($_SESSION['comments'])) {
    $comments = $_SESSION['comments'];
  }
I added:
Code:
  if (isset($_SESSION['delivery_date'])) {
    $delivery_date = $_SESSION['delivery_date'];
  }
and after
Code:
$comments = $_SESSION['comments'];
I added:
Code:
    if (zen_not_null($_POST['delivery_date'])) {
      $_SESSION['delivery_date'] = zen_db_prepare_input($_POST['delivery_date']);
    }
    $delivery_date = $_SESSION['delivery_date'];
5. language file checkout_shipping.php
File: \includes\languages\english\checkout_shipping.php
For every language you'll have to insert:
Code:
define('TABLE_HEADING_DELIVERY_DATE', 'Desired Delivery Date');
* BACK-END *

6. order.php
File: \admin\includes\classes\order.php
I added to:
Code:
$order = $db->Execute("select cc_cvv, customers_name, customers_company, customers_street_address,
customers_suburb, customers_city, customers_postcode, customers_id,
customers_state, customers_country, customers_telephone,
customers_email_address, customers_address_format_id, delivery_name,
delivery_company, delivery_street_address, delivery_suburb,
delivery_city, delivery_postcode, delivery_state, delivery_country,
delivery_address_format_id, billing_name, billing_company,
billing_street_address, billing_suburb, billing_city, billing_postcode,
billing_state, billing_country, billing_address_format_id,
coupon_code, payment_method, payment_module_code, shipping_method, shipping_module_code,
cc_type, cc_owner, cc_number, cc_expires, currency,
currency_value, date_purchased, orders_status, last_modified,
order_total, order_tax, ip_address
I added the order_delivery_date to the query:
Code:
order_total, order_tax, ip_address, order_delivery_date
and
Code:
$this->info = array('currency' => $order->fields['currency'],
  'currency_value' => $order->fields['currency_value'],
  'payment_method' => $order->fields['payment_method'],
  'payment_module_code' => $order->fields['payment_module_code'],
  'shipping_method' => $order->fields['shipping_method'],
  'shipping_module_code' => $order->fields['shipping_module_code'],
  'coupon_code' => $order->fields['coupon_code'],
  'cc_type' => $order->fields['cc_type'],
  'cc_owner' => $order->fields['cc_owner'],
  'cc_number' => $order->fields['cc_number'],
  'cc_cvv' => $order->fields['cc_cvv'],
  'cc_expires' => $order->fields['cc_expires'],
  'date_purchased' => $order->fields['date_purchased'],
  'orders_status' => $order->fields['orders_status'],
  'total' => $order->fields['order_total'],
  'tax' => $order->fields['order_tax'],
  'last_modified' => $order->fields['last_modified'],
  'ip_address' => $order->fields['ip_address']
   );
the last 3 lines:
Code:
  'ip_address' => $order->fields['ip_address'],
  'delivery_date' => $order->fields['order_delivery_date']
  );
7. orders.php
File: \admin\orders.php

I changed:
Code:
EMAIL_TEXT_DATE_ORDERED . ' ' . zen_date_long($check_status->fields['date_purchased']) . "\n\n" .
strip_tags($notify_comments) .
to:
Code:
EMAIL_TEXT_DATE_ORDERED . ' ' . zen_date_long($check_status->fields['date_purchased']) . "\n\n" .
EMAIL_TEXT_DELIVERY_DATE . ' ' . zen_date_long($check_status->fields[' delivery_date']) . "\n\n" .
strip_tags($notify_comments) .
and
Code:
$html_msg['EMAIL_TEXT_DATE_ORDERED'] = EMAIL_TEXT_DATE_ORDERED . ' ' . zen_date_long($check_status->fields['date_purchased']);
$html_msg['EMAIL_TEXT_STATUS_COMMENTS'] = nl2br($notify_comments);
into:
Code:
$html_msg['EMAIL_TEXT_DATE_ORDERED'] = EMAIL_TEXT_DATE_ORDERED . ' ' . zen_date_long($check_status->fields['date_purchased']);
$html_msg['EMAIL_TEXT_DELIVERY_DATE'] = EMAIL_TEXT_DELIVERY_DATE . ' ' . zen_date_long($check_status->fields['delivery_date']);
$html_msg['EMAIL_TEXT_STATUS_COMMENTS'] = nl2br($notify_comments);
and
Code:
        <tr>
           <td class="main"><strong><?php echo ENTRY_DATE_PURCHASED; ?></strong></td>
           <td class="main"><?php echo zen_date_long($order->info['date_purchased']); ?></td>
        </tr>
into
Code:
        <tr>
           <td class="main"><strong><?php echo ENTRY_DATE_PURCHASED; ?></strong></td>
           <td class="main"><?php echo zen_date_long($order->info['date_purchased']); ?></td>
        </tr>
        <tr>
           <td class="main"><strong><?php echo ENTRY_DELIVERY_DATE; ?></strong></td>
           <td class="main"><?php echo zen_date_long($order->info['delivery_date']); ?></td>
        </tr>
and
Code:
                <td class="dataTableHeadingContent" align="center"><?php echo TABLE_HEADING_DATE_PURCHASED; ?></td>
                <td class="dataTableHeadingContent" align="right"><?php echo TABLE_HEADING_STATUS; ?></td>
into:
Code:
                <td class="dataTableHeadingContent" align="center"><?php echo TABLE_HEADING_DATE_PURCHASED; ?></td>
                <td class="dataTableHeadingContent" align="center"><?php echo TABLE_HEADING_DELIVERY_DATE; ?></td>
                <td class="dataTableHeadingContent" align="right"><?php echo TABLE_HEADING_STATUS; ?></td>
and
Code:
                <td class="dataTableContent" align="center"><?php echo zen_datetime_short($orders->fields['date_purchased']); ?></td>
                <td class="dataTableContent" align="right"><?php echo $orders->fields['orders_status_name']; ?></td>
into
Code:
                <td class="dataTableContent" align="center"><?php echo zen_datetime_short($orders->fields['date_purchased']); ?></td>
                <td class="dataTableContent" align="center"><?php echo zen_datetime_short($orders->fields['order_delivery_date']); ?></td>
                <td class="dataTableContent" align="right"><?php echo $orders->fields['orders_status_name']; ?></td>
and
Code:
      $orders_query_raw = "select o.orders_id, o.customers_id, o.customers_name, o.payment_method, o.shipping_method, o.date_purchased, o.last_modified,
into:
Code:
      $orders_query_raw = "select o.orders_id, o.customers_id, o.customers_name, o.payment_method, o.shipping_method, o.date_purchased, o.order_delivery_date, o.last_modified,
and
Code:
      $orders_query_raw = "select o.orders_id, o.customers_id, o.customers_name, o.payment_method, o.shipping_method, o.date_purchased, o.last_modified,
into:
Code:
      $orders_query_raw = "select o.orders_id, o.customers_id, o.customers_name, o.payment_method, o.shipping_method, o.date_purchased, o.order_delivery_date, o.last_modified,
and
Code:
      $orders_query_raw = "select o.orders_id, o.customers_id, o.customers_name, o.payment_method, o.shipping_method, o.date_purchased, o.last_modified,
into:
Code:
      $orders_query_raw = "select o.orders_id, o.customers_id, o.customers_name, o.payment_method, o.shipping_method, o.date_purchased, o.order_delivery_date, o.last_modified,
8. the invoice invoice.php
File: \admin\invoice.php
I changed
Code:
$order_check = $db->Execute("select cc_cvv, customers_name, customers_company, customers_street_address,
customers_suburb, customers_city, customers_postcode,
customers_state, customers_country, customers_telephone,
customers_email_address, customers_address_format_id, delivery_name,
delivery_company, delivery_street_address, delivery_suburb,
delivery_city, delivery_postcode, delivery_state, delivery_country,
delivery_address_format_id, billing_name, billing_company,
billing_street_address, billing_suburb, billing_city, billing_postcode,
billing_state, billing_country, billing_address_format_id,
payment_method, cc_type, cc_owner, cc_number, cc_expires, currency,
currency_value, date_purchased, orders_status, last_modified
the last line into:
Code:
currency_value, date_purchased, orders_status, last_modified, order_delivery_date
and
Code:
      <tr>
        <td class="main"><strong><?php echo ENTRY_DATE_PURCHASED; ?></strong></td>
        <td class="main"><?php echo zen_date_long($order->info['date_purchased']); ?></td>
      </tr>
into
Code:
      <tr>
        <td class="main"><strong><?php echo ENTRY_DATE_PURCHASED; ?></strong></td>
        <td class="main"><?php echo zen_date_long($order->info['date_purchased']); ?></td>
      </tr>
      <tr>
        <td class="main"><strong><?php echo ENTRY_DELIVERY_DATE; ?></strong></td>
        <td class="main"><?php echo zen_date_long($order->info['delivery_date']); ?></td>
      </tr>
9. packingslip: packingslip.php
File: \admin\packingslip.php
In:
Code:
$order_check = $db->Execute("select cc_cvv, customers_name, customers_company, customers_street_address,
customers_suburb, customers_city, customers_postcode,
customers_state, customers_country, customers_telephone,
customers_email_address, customers_address_format_id, delivery_name,
delivery_company, delivery_street_address, delivery_suburb,
delivery_city, delivery_postcode, delivery_state, delivery_country,
delivery_address_format_id, billing_name, billing_company,
billing_street_address, billing_suburb, billing_city, billing_postcode,
billing_state, billing_country, billing_address_format_id,
payment_method, cc_type, cc_owner, cc_number, cc_expires, currency,
currency_value, date_purchased, orders_status, last_modified
I changed the last line in:
Code:
currency_value, date_purchased, orders_status, last_modified, order_delivery_date
and changed
Code:
      <tr>
        <td class="main"><strong><?php echo ENTRY_DATE_PURCHASED; ?></strong></td>
        <td class="main"><?php echo zen_date_long($order->info['date_purchased']); ?></td>
      </tr>
into:
Code:
      <tr>
        <td class="main"><strong><?php echo ENTRY_DATE_PURCHASED; ?></strong></td>
        <td class="main"><?php echo zen_date_long($order->info['date_purchased']); ?></td>
      </tr>
      <tr>
        <td class="main"><strong><?php echo ENTRY_DELIVERY_DATE; ?></strong></td>
        <td class="main"><?php echo zen_date_long($order->info['delivery_date']); ?></td>
      </tr>
10. language file for orders
File: \includes\languages\english\orders.php
add:
Code:
define('TABLE_HEADING_DELIVERY_DATE', 'Desired Delivery Date');
define('ENTRY_DELIVERY_DATE', 'Desired Delivery Date:');
11. language file for invoice
File: \includes\languages\english\invoice.php
add:
Code:
define('ENTRY_DELIVERY_DATE', 'Desired Delivery Date:');
12. language file for packingslip
File: \includes\languages\english\packingslip.php
add:
Code:
define('ENTRY_DELIVERY_DATE', 'Desired Delivery Date:');
I hope that other people can use this description of the modification that I made. If you have any comments / additions / corrections: please post in this thread....