Add delivery date & time at checkout process
zdjl505:
This modification adds a field that allow shopper to select a delivery date & time from a popup calendar. The delivery date & time selection is added in ‘shipping method’ step (checkuot 2nd step). The selected date & time will be shown at order information, order information print & order confirmation email, also can be edited in order admin page. There is an error checking for empty delivery date & time. Delivery date time format follows the format that defined in store info.
Utilize JHTMLBehaviours class to show popup calendar that installed together with joomla. The calendar translation is included in joomla language translation file (languange\en-GB\en-GB.ini). The popup calendar includes script that blocks date before today. You can adjust the appearance of the calendar at media\system\css\calendar-jos.css.
This modification based on VM1.1.3 Joomla 1.5.9 and Ja-Larix template. Modified files from a fresh installation of VM1.1.3 and Joomla 1.5.9 are attached. To see sample of implementation visit:www.roncekembang.com.
The modified files are:
administrator\components\com_virtuemart\languages\common\english.php
components\com_virtuemart\themes\ja_larix\templates\checkout\get_shipping_method.tpl.php
administrator\components\com_virtuemart\html\checkout.index.php
administrator\components\com_virtuemart\classes\ps_checkout.php
components\com_virtuemart\themes\ja_larix\templates\checkout\get_final_confirmation.tpl.php
components\com_virtuemart\themes\ja_larix\templates\checkout\checkout_bar.tpl.php
components\com_virtuemart\themes\ja_larix\templates\pages\account.order_details.tpl.php
administrator\components\com_virtuemart\html\order.order_print.php
administrator\components\com_virtuemart\html\order.order_printdetails.php
components\com_virtuemart\themes\ja_larix\templates\order_emails\confirmation_email.tpl.php
administrator\components\com_virtuemart\classes\ps_order_change.php
administrator\components\com_virtuemart\classes\ps_order_change_html.php
administrator\components\com_virtuemart\sql\sql.virtuemart.php
administrator\components\com_virtuemart\classes\export\ps_olsi.php
The 1st step add new field delivery_date_time in jos_vm_orders table, field type varchar(40). OK let go detail into each file.
File administrator\components\com_virtuemart\languages\common\english.php:
Add 3 following declarations. Add your own translation in language other than English.
After:
Code:
'PHPSHOP_CHECKOUT_CUSTOMER_NOTE' => 'Please leave a note to us with your order if you want to',
Add:
Code:
'PHPSHOP_CHECKOUT_DELIVERY_DATE_TIME' => 'Please select expected delivery date & time',
After:
Code:
'PHPSHOP_INFO_MSG_SHIPPING_PRICE' => 'Price',
Add:
Code:
'PHPSHOP_INFO_MSG_DELIVERY_DATE_TIME' => 'To be delivered at',
After:
Code:
'PHPSHOP_CHECKOUT_ERR_NO_SHIPTO' => 'Please select a Ship To address.',
Add:
Code:
'PHPSHOP_CHECKOUT_ERR_NO_DELIVERY_DATE' => 'Please select delivery date & time.',
File components\com_virtuemart\themes\ja_larix\templates\checkout\get_shipping_method.tpl.php:
After (line 21):
Code:
echo $basket_html;
Add:
Code:
$delivery_date_time = vmGet( $_REQUEST, 'delivery_date_time');
JHTML::_('behavior.calendar');
echo '<br />';
echo '<strong>' . strtoupper($VM_LANG->_('PHPSHOP_CHECKOUT_DELIVERY_DATE_TIME')) . ': </strong>';
?>
<input type="text" class="inputbox" size="40" name="delivery_date_time" id="delivery_date_time_input" value="<?php echo $delivery_date_time; ?>"/>
<script type="text/javascript">
Calendar.setup({
inputField : "delivery_date_time_input",
ifFormat : "<?php echo $vendor_date_format; ?>",
showsTime : true,
timeFormat : "12",
singleClick : false,
dateStatusFunc : function (date) {
var myDate = new Date();
if (date.getTime() < myDate.setDate(myDate.getDate() - 1)) return true;
}
});
</script>
<?php
// Delivery date time end
File administrator\components\com_virtuemart\html\checkout.index.php:
After (line 25):
Code:
$Itemid = $sess->getShopItemid();
Add:
Code:
$delivery_date_time = vmGet( $_REQUEST, 'delivery_date_time'); //delivery date time
Replace (line 109):
Code:
<input type="hidden" name="checkout_last_step" value="'. $current_stage .'" />';
With:
Code:
<input type="hidden" name="checkout_last_step" value="'. $current_stage .'" />
<input type="hidden" name="delivery_date_time" value="'. $delivery_date_time .'" />'; //delivery date time
File administrator\components\com_virtuemart\classes\ps_checkout.php:
Replace (line 230):
Code:
global $sess, $ship_to_info_id, $shipping_rate_id, $VM_LANG;
with:
Code:
global $sess, $ship_to_info_id, $shipping_rate_id, $VM_LANG, $delivery_date_time;
Replace (line 273):
Code:
'shipping_rate_id' => vmGet( $_REQUEST, 'shipping_rate_id')
with:
Code:
'shipping_rate_id' => vmGet( $_REQUEST, 'shipping_rate_id'),
'delivery_date_time' => vmGet( $_REQUEST, 'delivery_date_time')
After (line 402-405):
Code:
if( empty($d['shipping_rate_id']) ) {
$vmLogger->err( $VM_LANG->_('PHPSHOP_CHECKOUT_ERR_NO_SHIP',false) );
return false;
}
Add:
Code:
//start check is delivery date time empty
if (empty($d["delivery_date_time"])) {
$vmLogger->err( $VM_LANG->_('PHPSHOP_CHECKOUT_ERR_NO_DELIVERY_DATE',false) );
return False;
}
//end check
Replace (line 853-856):
Code:
if( $VM_CHECKOUT_MODULES['CHECK_OUT_GET_PAYMENT_METHOD']['order'] != $VM_CHECKOUT_MODULES['CHECK_OUT_GET_FINAL_CONFIRMATION']['order'] ) {
if ($count <= 1 && $cc_payments==false) {
vmRedirect($sess->url(SECUREURL.basename($_SERVER['PHP_SELF'])."?page=checkout.index&payment_method_id=$first_payment_method_id&ship_to_info_id=$ship_to_info_id&shipping_rate_id=".urlencode($shipping_rate_id)."&checkout_stage=".$VM_CHECKOUT_MODULES['CHECK_OUT_GET_FINAL_CONFIRMATION']['order'], false, false ),"");
}
with:
Code:
$delivery_date_time = vmGet($_REQUEST,'delivery_date_time');
if( $VM_CHECKOUT_MODULES['CHECK_OUT_GET_PAYMENT_METHOD']['order'] != $VM_CHECKOUT_MODULES['CHECK_OUT_GET_FINAL_CONFIRMATION']['order'] ) {
if ($count <= 1 && $cc_payments==false) {
vmRedirect($sess->url(SECUREURL.basename($_SERVER['PHP_SELF'])."?page=checkout.index&payment_method_id=$first_payment_method_id&ship_to_info_id=$ship_to_info_id&shipping_rate_id=".urlencode($shipping_rate_id)."&delivery_date_time=$delivery_date_time&checkout_stage=".$VM_CHECKOUT_MODULES['CHECK_OUT_GET_FINAL_CONFIRMATION']['order'], false, false ),"");
}
After (line 994):
Code:
'customer_note' => htmlspecialchars(strip_tags($d['customer_note']), ENT_QUOTES ),
Add:
Code:
'delivery_date_time' => $d['delivery_date_time'], //delivery date time
File components\com_virtuemart\themes\ja_larix\templates\checkout\get_final_confirmation.tpl.php:
After (line 75):
Code:
echo "</td></tr>";
Add:
Code:
//show delivery date time
echo '<tr><td valign="top"><strong>'.$VM_LANG->_('PHPSHOP_INFO_MSG_DELIVERY_DATE_TIME') . ":</strong></td>";
echo '<td>';
$delivery_date_time = vmGet($_REQUEST,'delivery_date_time');
echo $delivery_date_time;
echo "</td></tr>";
File components\com_virtuemart\themes\ja_larix\templates\checkout\checkout_bar.tpl.php:
Replace (line 38):
Code:
echo '<a href="'. $sess->url(SECUREURL."index.php?page=checkout.index&option=com_virtuemart&ship_to_info_id=$ship_to_info_id&shipping_rate_id=".@$shipping_rate_id."&checkout_stage=".$step[0]['step_order'] ).'">';
with:
Code:
echo '<a href="'. $sess->url(SECUREURL."index.php?page=checkout.index&option=com_virtuemart&ship_to_info_id=$ship_to_info_id&shipping_rate_id=".@$shipping_rate_id."&delivery_date_time=$delivery_date_time&checkout_stage=".$step[0]['step_order'] ).'">';
File components\com_virtuemart\themes\ja_larix\templates\pages\account.order_details.tpl.php:
After (line 192-196):
Code:
<td><?php
echo $CURRENCY_DISPLAY->getFullValue($details[3], '', $db->f('order_currency'));
?>
</td>
</tr>
Add:
Code:
<!--Start delivery date time-->
<tr>
<td colspan="3"><br/><strong><?php echo $VM_LANG->_('PHPSHOP_INFO_MSG_DELIVERY_DATE_TIME') ?>: </strong><?php echo $db->f("delivery_date_time"); ?> </td>
</tr>
<!--End delivery date time-->
File administrator\components\com_virtuemart\html\order.order_print.php:
After (line 517-522):
Code:
<tr>
<td align="left">
<strong><?php echo $VM_LANG->_('PHPSHOP_ORDER_PRINT_SHIPPING_MODE_LBL') ?>: </strong>
<?php echo $details[2]; ?>
</td>
</tr>
Add:
Code:
<!--Start delivery date time-->
<tr>
<td align="left">
<?php $ps_order_change_html->html_change_delivery_date_time() ?>
</td>
</tr>
<!--End delivery date time-->
File administrator\components\com_virtuemart\html\order.order_printdetails.php:
After (line188-189):
Code:
<td><?php echo $CURRENCY_DISPLAY->getFullValue($details[3], '', $db->f('order_currency')); ?></td>
</tr>
Add:
Code:
<!--Start delivery date time-->
<tr>
<td colspan="3"><br/><strong><?php echo $VM_LANG->_('PHPSHOP_INFO_MSG_DELIVERY_DATE_TIME') ?>: </strong><?php echo $db->f("delivery_date_time"); ?></td>
</tr>
<!--End delivery date time-->
File components\com_virtuemart\themes\ja_larix\templates\order_emails\confirmation_email.tpl.php:
Replace (line 277):
Code:
<td><?php echo $shipping_info_details ?></td>
With:
Code:
<td valign="top"><?php echo $shipping_info_details ?><br/><strong><?php echo $VM_LANG->_('PHPSHOP_INFO_MSG_DELIVERY_DATE_TIME') ?>: </strong><?php echo $db->f("delivery_date_time"); ?></td><!--Print delivery date time -->
File administrator\components\com_virtuemart\classes\ps_order_change.php:
After end of function change_customer_note() (line 244-260):
Code:
$vmLogger->info( $VM_LANG->_( 'PHPSHOP_ORDER_PRINT_CUSTOMER_NOTE' ) . $VM_LANG->_( 'PHPSHOP_ORDER_EDIT_SOMETHING_HAS_CHANGED' ) ) ;
$this->recalc_order( $this->order_id ) ;
}
add function change_delivery_date_time():
Code:
/**************************************************************************
* name: change_delivery_date_time
* created by: kaltokri modif by ZDJL505
* description: Change order delivery_date_time
* parameters: none
* returns: none
**************************************************************************/
function change_delivery_date_time() {
global $VM_LANG, $vmLogger ;
$db = new ps_DB( ) ;
$delivery_date_time = trim( vmGet( $_REQUEST, 'delivery_date_time' ) ) ;
// Update order
$q = "UPDATE #__{vm}_orders " ;
$q .= "SET delivery_date_time = '" . $delivery_date_time . "' " ;
$q .= "WHERE order_id = '" . $this->order_id . "'" ;
$db->query( $q ) ;
$db->next_record() ;
$this->reload_from_db = 1 ;
$vmLogger->info( $VM_LANG->_( 'PHPSHOP_INFO_MSG_DELIVERY_DATE_TIME' ) . $VM_LANG->_( 'PHPSHOP_ORDER_EDIT_SOMETHING_HAS_CHANGED' ) ) ;
$this->recalc_order( $this->order_id ) ;
}
After (line 1080-1081):
Code:
elseif( vmGet( $_REQUEST, 'change_customer_note' ) != '' )
$ps_order_change->change_customer_note() ;
Add:
Code:
elseif( vmGet( $_REQUEST, 'change_delivery_date_time' ) != '' )
$ps_order_change->change_delivery_date_time() ;
File administrator\components\com_virtuemart\classes\ps_order_change_html.php:
After end of function html_change_customer_note() (line(120-137):
Code:
<input type="hidden" name="order_id" value="<?php echo $this->order_id ?>" />
</form> <?php
}
Add:
Code:
/**************************************************************************
* name: html_change_delivery_date_time
* created by: ?, modified by kaltokrikaltokri modif by ZDJL505
* description: Prints formular to change delivery date and time
* parameters: none
* returns: none
**************************************************************************/
function html_change_delivery_date_time() {
global $VM_LANG;
global $vendor_date_format;
JHTML::_('behavior.calendar');
$db = new ps_DB;
$q = "SELECT * FROM #__{vm}_orders WHERE order_id='".$this->order_id."'";
$db->query($q);
$db->next_record();
?>
<form method="post" action="<?php echo $_SERVER['PHP_SELF'] ?>">
<?php echo $VM_LANG->_('PHPSHOP_INFO_MSG_DELIVERY_DATE_TIME') ?>:
<input type="text" value="<?php $db->p("delivery_date_time") ?>" size="50" name="delivery_date_time" id="delivery_date_time_input"/>
<script type="text/javascript">
Calendar.setup({
inputField : "delivery_date_time_input",
ifFormat : "<?php echo $vendor_date_format; ?>",
showsTime : true,
timeFormat : "12",
singleClick : false,
dateStatusFunc : function (date) {
var today = new Date();
return (date.getDate() < today.getDate() ) ? true : false;
}
});
</script>
<input type="image" title="<?php echo $VM_LANG->_('PHPSHOP_UPDATE') ?>"
src="<?php echo VM_THEMEURL ?>images/edit_f2.gif" border="0" alt="<?php echo $VM_LANG->_('PHPSHOP_UPDATE') ?>" />
<input type="hidden" value="1" name="change_delivery_date_time" />
<input type="hidden" name="page" value="order.order_print" />
<input type="hidden" name="option" value="com_virtuemart" />
<input type="hidden" name="func" value="" />
<input type="hidden" name="order_id" value="<?php echo $this->order_id ?>" />
</form>
<?php
}
File administrator\components\com_virtuemart\sql\sql.virtuemart.php:
After (line1073):
Code:
`customer_note` text NOT NULL,
Add:
Code:
`delivery_date_time` varchar(40) NOT NULL,
File administrator\components\com_virtuemart\classes\export\ps_olsi.php:
After (line 371):
Code:
$OLWebOrder['OLWebOrder']['OrderHeader']['ProcessingOptions']['CarrierCode'] = $this->getCarrierCode($order[$i]['ship_method_id']);
Add:
Code:
$OLWebOrder['OLWebOrder']['OrderHeader']['ProcessingOptions']['CarrierCode'] = $this->getCarrierCode($order[$i]['delivery_date_time']);
Regards,
quodran:
Great job!
Just one problem though, if you have only one payment method, the date doesn't get to the final confirmation checkout page. Any idea how to fix this?
Thanks!
zdjl505:
Hi quodran,
Thanks for quality check. I already modify my 1st post to solve 2 problems:
1. The delivery date can't get to the final confirmation checkout page if there is only one payment method, and
2. Delivery date will blank If you go back to the previous checkout step. This is because checkout bar link can't store delivery date information.
Please apply modification for files:
administrator\components\com_virtuemart\classes\ps_checkout.php
components\com_virtuemart\themes\ja_larix\templates\checkout\get_shipping_method.tpl.php
components\com_virtuemart\themes\ja_larix\templates\checkout\checkout_bar.tpl.php
that already updated. The attached file in the 1st post already updated too.
Regards
Jon Jackson:
Fantastic piece of work... well done.
I need something similar, but I don't want the calendar, just 3 radio buttons. which read "Morning", "Afternoon" and "Evening" - one to be required.
Any suggestions how to do that, please?
zdjl505:
Hi Jon,
Below is the modification that:
Replace calendar with 3 radio button for ‘Morning’, ‘Afternoon’ and ‘Evening’At the beginning, there is no selected button. This can force customer to make their selectionMemorize last customer selection, when they step back in checkout processThe selected delivery time will be shown at order information, order information print & order confirmation email, also can be edited in order admin pageYou can translate ‘Morning’, ‘Afternoon’ and ‘Evening’ to other language
After you implement above modification, add & replace some code below. The modified files are:
administrator\components\com_virtuemart\languages\common\english.php
components\com_virtuemart\themes\ja_larix\templates\checkout\get_shipping_method.tpl.php
components\com_virtuemart\themes\ja_larix\templates\checkout\get_final_confirmation.tpl.php
components\com_virtuemart\themes\ja_larix\templates\pages\account.order_details.tpl.php
administrator\components\com_virtuemart\html\order.order_printdetails.php
components\com_virtuemart\themes\ja_larix\templates\order_emails\confirmation_email.tpl.php
administrator\components\com_virtuemart\classes\ps_order_change_html.php
File administrator\components\com_virtuemart\languages\common\english.php:
Add 3 following declarations. Add your own translation in language other than English.
Code:
'PHPSHOP_CHECKOUT_DELIVERY_DATE_TIME1' => 'Morning',
'PHPSHOP_CHECKOUT_DELIVERY_DATE_TIME2' => 'Afternoon',
'PHPSHOP_CHECKOUT_DELIVERY_DATE_TIME3' => 'Evening',
File components\com_virtuemart\themes\ja_larix\templates\checkout\get_shipping_method.tpl.php:
Replace:
Code:
<input type="text" class="inputbox" size="40" name="delivery_date_time" id="delivery_date_time_input" value="<?php echo $delivery_date_time; ?>"/>
<script type="text/javascript">
Calendar.setup({
inputField : "delivery_date_time_input",
ifFormat : "<?php echo $vendor_date_format; ?>",
showsTime : true,
timeFormat : "12",
singleClick : false,
dateStatusFunc : function (date) {
var myDate = new Date();
if (date.getTime() < myDate.setDate(myDate.getDate() - 1)) return true;
}
});
</script>
<?php
With:
Code:
<br/>
<?php if ($delivery_date_time == "1") { ?>
<input type="radio" name="delivery_date_time" id="delivery_date_time_input" value="1" checked/>
<?php } else {?>
<input type="radio" name="delivery_date_time" id="delivery_date_time_input" value="1"/>
<?php }
echo $VM_LANG->_('PHPSHOP_CHECKOUT_DELIVERY_DATE_TIME1') ?><br/>
<?php if ($delivery_date_time == "2") { ?>
<input type="radio" name="delivery_date_time" id="delivery_date_time_input" value="2" checked/>
<?php } else {?>
<input type="radio" name="delivery_date_time" id="delivery_date_time_input" value="2"/>
<?php }
echo $VM_LANG->_('PHPSHOP_CHECKOUT_DELIVERY_DATE_TIME2') ?><br/>
<?php if ($delivery_date_time == "3") { ?>
<input type="radio" name="delivery_date_time" id="delivery_date_time_input" value="3" checked/>
<?php } else {?>
<input type="radio" name="delivery_date_time" id="delivery_date_time_input" value="3"/>
<?php }
echo $VM_LANG->_('PHPSHOP_CHECKOUT_DELIVERY_DATE_TIME3');
File components\com_virtuemart\themes\ja_larix\templates\checkout\get_final_confirmation.tpl.php:
Replace:
Code:
echo $delivery_date_time;
With:
Code:
echo $VM_LANG->_('PHPSHOP_CHECKOUT_DELIVERY_DATE_TIME' . $delivery_date_time);
File components\com_virtuemart\themes\ja_larix\templates\pages\account.order_details.tpl.php:
Replace:
Code:
<td colspan="3"><br/><strong><?php echo $VM_LANG->_('PHPSHOP_INFO_MSG_DELIVERY_DATE_TIME') ?>: </strong><?php echo $db->f("delivery_date_time"); ?></td>
With:
Code:
<td colspan="3"><br/><strong><?php echo $VM_LANG->_('PHPSHOP_INFO_MSG_DELIVERY_DATE_TIME') ?>: </strong><?php echo $VM_LANG->_('PHPSHOP_CHECKOUT_DELIVERY_DATE_TIME' . $db->f("delivery_date_time")); ?></td>
File administrator\components\com_virtuemart\html\order.order_printdetails.php:
Replace:
Code:
<td colspan="3"><br/><strong><?php echo $VM_LANG->_('PHPSHOP_INFO_MSG_DELIVERY_DATE_TIME') ?>: </strong><?php echo $db->f("delivery_date_time"); ?></td>
With:
Code:
<td colspan="3"><br/><strong><?php echo $VM_LANG->_('PHPSHOP_INFO_MSG_DELIVERY_DATE_TIME') ?>: </strong><?php echo $VM_LANG->_('PHPSHOP_CHECKOUT_DELIVERY_DATE_TIME' . $db->f("delivery_date_time")); ?></td>
File components\com_virtuemart\themes\ja_larix\templates\order_emails\confirmation_email.tpl.php:
Replace:
Code:
<td valign="top"><?php echo $shipping_info_details ?><br/><strong><?php echo $VM_LANG->_('PHPSHOP_INFO_MSG_DELIVERY_DATE_TIME') ?>: </strong><?php echo $db->f("delivery_date_time"); ?></td>
With:
Code:
<td valign="top"><?php echo $shipping_info_details ?><br/><strong><?php echo $VM_LANG->_('PHPSHOP_INFO_MSG_DELIVERY_DATE_TIME') ?>: </strong><?php echo $VM_LANG->_('PHPSHOP_CHECKOUT_DELIVERY_DATE_TIME' . $db->f("delivery_date_time")); ?></td>
File administrator\components\com_virtuemart\classes\ps_order_change_html.php:
Replace:
Code:
<input type="text" value="<?php $db->p("delivery_date_time") ?>" size="50" name="delivery_date_time" id="delivery_date_time_input"/>
<script type="text/javascript">
Calendar.setup({
inputField : "delivery_date_time_input",
ifFormat : "<?php echo $vendor_date_format; ?>",
showsTime : true,
timeFormat : "12",
singleClick : false,
dateStatusFunc : function (date) {
var today = new Date();
return (date.getDate() < today.getDate() ) ? true : false;
}
});
</script>
With:
Code:
<br/>
<?php
$delivery_date_time = $db->f('delivery_date_time');
if ($delivery_date_time == "1") { ?>
<input type="radio" name="delivery_date_time" id="delivery_date_time_input" value="1" checked/>
<?php } else {?>
<input type="radio" name="delivery_date_time" id="delivery_date_time_input" value="1"/>
<?php }
echo $VM_LANG->_('PHPSHOP_CHECKOUT_DELIVERY_DATE_TIME1') ?><br/>
<?php if ($delivery_date_time == "2") { ?>
<input type="radio" name="delivery_date_time" id="delivery_date_time_input" value="2" checked/>
<?php } else {?>
<input type="radio" name="delivery_date_time" id="delivery_date_time_input" value="2"/>
<?php }
echo $VM_LANG->_('PHPSHOP_CHECKOUT_DELIVERY_DATE_TIME2') ?><br/>
<?php if ($delivery_date_time == "3") { ?>
<input type="radio" name="delivery_date_time" id="delivery_date_time_input" value="3" checked/>
<?php } else {?>
<input type="radio" name="delivery_date_time" id="delivery_date_time_input" value="3"/>
<?php }
echo $VM_LANG->_('PHPSHOP_CHECKOUT_DELIVERY_DATE_TIME3');?>
Regards
Navigation
[0] Message Index
[#] Next page