prepareContinueLink();
if (VmConfig::get('use_as_catalog',0)) {
vmInfo('This is a catalogue, you cannot access the cart');
$app->redirect($this->continue_link);
}
$pathway = $app->getPathway();
$document = vFactory::getDocument();
$document->setMetaData('robots','NOINDEX, NOFOLLOW, NOARCHIVE, NOSNIPPET');
$this->layoutName = $this->getLayout();
if (!$this->layoutName) $this->layoutName = vRequest::getCmd('layout', 'default');
$format = vRequest::getCmd('format');
if (!class_exists('VirtueMartCart'))
require(VMPATH_SITE . DS . 'helpers' . DS . 'cart.php');
$this->cart = VirtueMartCart::getCart();
$this->cart->prepareVendor();
if ($this->layoutName == 'select_shipment') {
$this->cart->prepareCartData();
$this->lSelectShipment();
$pathway->addItem(vmText::_('COM_VIRTUEMART_CART_OVERVIEW'), JRoute::_('index.php?option=com_virtuemart&view=cart', FALSE));
$pathway->addItem(vmText::_('COM_VIRTUEMART_CART_SELECTSHIPMENT'));
$document->setTitle(vmText::_('COM_VIRTUEMART_CART_SELECTSHIPMENT'));
} else if ($this->layoutName == 'select_payment') {
$this->cart->prepareCartData();
$this->lSelectPayment();
$pathway->addItem(vmText::_('COM_VIRTUEMART_CART_OVERVIEW'), JRoute::_('index.php?option=com_virtuemart&view=cart', FALSE));
$pathway->addItem(vmText::_('COM_VIRTUEMART_CART_SELECTPAYMENT'));
$document->setTitle(vmText::_('COM_VIRTUEMART_CART_SELECTPAYMENT'));
} else if ($this->layoutName == 'order_done') {
VmConfig::loadJLang( 'com_virtuemart_shoppers', true );
$this->lOrderDone();
$pathway->addItem( vmText::_( 'COM_VIRTUEMART_CART_THANKYOU' ) );
$document->setTitle( vmText::_( 'COM_VIRTUEMART_CART_THANKYOU' ) );
} else {
VmConfig::loadJLang('com_virtuemart_shoppers', true);
$this->renderCompleteAddressList();
if (!class_exists ('VirtueMartModelUserfields')) {
require(VMPATH_ADMIN . DS . 'models' . DS . 'userfields.php');
}
$userFieldsModel = VmModel::getModel ('userfields');
$userFieldsCart = $userFieldsModel->getUserFields(
'cart'
, array('captcha' => true, 'delimiters' => true) // Ignore these types
, array('delimiter_userinfo','user_is_vendor' ,'username','password', 'password2', 'agreed', 'address_type') // Skips
);
$this->userFieldsCart = $userFieldsModel->getUserFieldsFilled(
$userFieldsCart
,$this->cart->cartfields
);
if (!class_exists ('CurrencyDisplay'))
require(VMPATH_ADMIN . DS . 'helpers' . DS . 'currencydisplay.php');
$this->currencyDisplay = CurrencyDisplay::getInstance($this->cart->pricesCurrency);
$customfieldsModel = VmModel::getModel ('Customfields');
$this->assignRef('customfieldsModel',$customfieldsModel);
$this->lSelectCoupon();
$totalInPaymentCurrency = $this->getTotalInPaymentCurrency();
$this->checkoutAdvertise = $this->cart->getCheckoutAdvertise();
if ($this->cart->getDataValidated()) {
if($this->cart->_inConfirm){
$pathway->addItem(vmText::_('COM_VIRTUEMART_CANCEL_CONFIRM_MNU'));
$document->setTitle(vmText::_('COM_VIRTUEMART_CANCEL_CONFIRM_MNU'));
$text = vmText::_('COM_VIRTUEMART_CANCEL_CONFIRM');
$this->checkout_task = 'cancel';
} else {
$pathway->addItem(vmText::_('COM_VIRTUEMART_ORDER_CONFIRM_MNU'));
$document->setTitle(vmText::_('COM_VIRTUEMART_ORDER_CONFIRM_MNU'));
$text = vmText::_('COM_VIRTUEMART_ORDER_CONFIRM_MNU');
$this->checkout_task = 'confirm';
}
} else {
$pathway->addItem(vmText::_('COM_VIRTUEMART_CART_OVERVIEW'));
$document->setTitle(vmText::_('COM_VIRTUEMART_CART_OVERVIEW'));
$text = vmText::_('COM_VIRTUEMART_CHECKOUT_TITLE');
$this->checkout_task = 'checkout';
}
$dynUpdate = '';
if( VmConfig::get('oncheckout_ajax',false)) {
$dynUpdate=' data-dynamic-update="1" ';
}
$this->checkout_link_html = '';
$forceMethods=vRequest::getInt('forceMethods',false);
if (VmConfig::get('oncheckout_opc', 1) or $forceMethods) {
if (!class_exists('vmPSPlugin')) require(JPATH_VM_PLUGINS . DS . 'vmpsplugin.php');
vPluginHelper::importPlugin('vmshipment');
vPluginHelper::importPlugin('vmpayment');
//vmdebug('cart view oncheckout_opc ');
$lSelectShipment=$this->lSelectShipment() ;
$lSelectPayment=$this->lSelectPayment();
if(!$lSelectShipment or !$lSelectPayment){
if (!VmConfig::get('oncheckout_opc', 1)) {
vmInfo('COM_VIRTUEMART_CART_ENTER_ADDRESS_FIRST');
}
$this->pointAddress = true;
}
} else {
$this->checkPaymentMethodsConfigured();
$this->checkShipmentMethodsConfigured();
}
if ($this->cart->virtuemart_shipmentmethod_id) {
$shippingText = vmText::_('COM_VIRTUEMART_CART_CHANGE_SHIPPING');
} else {
$shippingText = vmText::_('COM_VIRTUEMART_CART_EDIT_SHIPPING');
}
$this->assignRef('select_shipment_text', $shippingText);
if ($this->cart->virtuemart_paymentmethod_id) {
$paymentText = vmText::_('COM_VIRTUEMART_CART_CHANGE_PAYMENT');
} else {
$paymentText = vmText::_('COM_VIRTUEMART_CART_EDIT_PAYMENT');
}
$this->assignRef('select_payment_text', $paymentText);
$this->cart->prepareAddressFieldsInCart();
$this->layoutName = $this->cart->layout;
if(empty($this->layoutName)) $this->layoutName = 'default';
if ($this->cart->layoutPath) {
$this->addTemplatePath($this->cart->layoutPath);
}
if(!empty($this->layoutName) and $this->layoutName!='default'){
$this->setLayout( strtolower( $this->layoutName ) );
}
//set order language
$lang = vFactory::getLanguage();
$order_language = $lang->getTag();
$this->assignRef('order_language',$order_language);
}
$this->useSSL = VmConfig::get('useSSL', 0);
$this->useXHTML = false;
$this->assignRef('totalInPaymentCurrency', $totalInPaymentCurrency);
//We set the valid content time to 2 seconds to prevent that the cart shows wrong entries
$document->setMetaData('expires', '1',true);
//We never want that the cart is indexed
$document->setMetaData('robots','NOINDEX, NOFOLLOW, NOARCHIVE, NOSNIPPET');
if ($this->cart->_inConfirm) vmInfo('COM_VIRTUEMART_IN_CONFIRM');
$current = vFactory::getUser();
$this->allowChangeShopper = false;
$this->adminID = false;
if(VmConfig::get ('oncheckout_change_shopper')){
$this->allowChangeShopper = vmAccess::manager('user');
}
if($this->allowChangeShopper){
$this->userList = $this->getUserList();
}
if(VmConfig::get('oncheckout_ajax',false)){
vmJsApi::jDynUpdate();
}
parent::display($tpl);
}
private function lSelectCoupon() {
$this->couponCode = (!empty($this->cart->couponCode) ? $this->cart->couponCode : '');
$this->coupon_text = $this->cart->couponCode ? vmText::_('COM_VIRTUEMART_COUPON_CODE_CHANGE') : vmText::_('COM_VIRTUEMART_COUPON_CODE_ENTER');
}
/**
* lSelectShipment
* find al shipment rates available for this cart
*
* @author Valerie Isaksen
*/
private function lSelectShipment() {
$found_shipment_method=false;
$shipment_not_found_text = vmText::_('COM_VIRTUEMART_CART_NO_SHIPPING_METHOD_PUBLIC');
$this->assignRef('shipment_not_found_text', $shipment_not_found_text);
$this->assignRef('found_shipment_method', $found_shipment_method);
$shipments_shipment_rates=array();
if (!$this->checkShipmentMethodsConfigured()) {
$this->assignRef('shipments_shipment_rates',$shipments_shipment_rates);
return;
}
$selectedShipment = (empty($this->cart->virtuemart_shipmentmethod_id) ? 0 : $this->cart->virtuemart_shipmentmethod_id);
$shipments_shipment_rates = array();
if (!class_exists('vmPSPlugin')) require(JPATH_VM_PLUGINS . DS . 'vmpsplugin.php');
vPluginHelper::importPlugin('vmshipment');
$dispatcher = vDispatcher::getInstance();
$returnValues = $dispatcher->trigger('plgVmDisplayListFEShipment', array( $this->cart, $selectedShipment, &$shipments_shipment_rates));
// if no shipment rate defined
$found_shipment_method =count($shipments_shipment_rates);
$ok = true;
if ($found_shipment_method == 0) {
$validUserDataBT = $this->cart->validateUserData();
if ($validUserDataBT===-1) {
if (VmConfig::get('oncheckout_opc', 1)) {
vmdebug('lSelectShipment $found_shipment_method === 0 show error');
$ok = false;
} else {
$mainframe = vFactory::getApplication();
$mainframe->redirect(JRoute::_('index.php?option=com_virtuemart&view=user&task=editaddresscart&addrtype=BT'), vmText::_('COM_VIRTUEMART_CART_ENTER_ADDRESS_FIRST'));
}
}
}
if(empty($selectedShipment)){
if($s_id = VmConfig::get('set_automatic_shipment',false)){
$j = 'radiobtn = document.getElementById("shipment_id_'.$s_id.'");
if(radiobtn!==null){ radiobtn.checked = true;}';
vmJsApi::addJScript('autoShipment',$j);
}
}
$shipment_not_found_text = vmText::_('COM_VIRTUEMART_CART_NO_SHIPPING_METHOD_PUBLIC');
$this->assignRef('shipment_not_found_text', $shipment_not_found_text);
$this->assignRef('shipments_shipment_rates', $shipments_shipment_rates);
$this->assignRef('found_shipment_method', $found_shipment_method);
return $ok;
}
/*
* lSelectPayment
* find al payment available for this cart
*
* @author Valerie Isaksen
*/
private function lSelectPayment() {
$this->payment_not_found_text='';
$this->payments_payment_rates=array();
$this->found_payment_method = 0;
$selectedPayment = empty($this->cart->virtuemart_paymentmethod_id) ? 0 : $this->cart->virtuemart_paymentmethod_id;
$this->paymentplugins_payments = array();
if (!$this->checkPaymentMethodsConfigured()) {
return;
}
if(!class_exists('vmPSPlugin')) require(JPATH_VM_PLUGINS.DS.'vmpsplugin.php');
vPluginHelper::importPlugin('vmpayment');
$dispatcher = vDispatcher::getInstance();
$returnValues = $dispatcher->trigger('plgVmDisplayListFEPayment', array($this->cart, $selectedPayment, &$this->paymentplugins_payments));
$this->found_payment_method =count($this->paymentplugins_payments);
if (!$this->found_payment_method) {
$link=''; // todo
$this->payment_not_found_text = vmText::sprintf('COM_VIRTUEMART_CART_NO_PAYMENT_METHOD_PUBLIC', ''.$link.'');
}
$ok = true;
if ($this->found_payment_method == 0 ) {
$validUserDataBT = $this->cart->validateUserData();
if ($validUserDataBT===-1) {
if (VmConfig::get('oncheckout_opc', 1)) {
$ok = false;
} else {
$mainframe = vFactory::getApplication();
$mainframe->redirect( JRoute::_( 'index.php?option=com_virtuemart&view=user&task=editaddresscart&addrtype=BT' ), vmText::_('COM_VIRTUEMART_CART_ENTER_ADDRESS_FIRST') );
}
}
}
if(empty($selectedPayment)){
if($p_id = VmConfig::get('set_automatic_payment',false)){
$j = 'radiobtn = document.getElementById("payment_id_'.$p_id.'");
if(radiobtn!==null){ radiobtn.checked = true;}';
vmJsApi::addJScript('autoPayment',$j);
}
}
return $ok;
}
private function getTotalInPaymentCurrency() {
if (empty($this->cart->virtuemart_paymentmethod_id)) {
return null;
}
if (!$this->cart->paymentCurrency or ($this->cart->paymentCurrency==$this->cart->pricesCurrency)) {
return null;
}
$paymentCurrency = CurrencyDisplay::getInstance($this->cart->paymentCurrency);
$totalInPaymentCurrency = $paymentCurrency->priceDisplay( $this->cart->cartPrices['billTotal'],$this->cart->paymentCurrency) ;
$this->currencyDisplay = CurrencyDisplay::getInstance($this->cart->pricesCurrency);
return $totalInPaymentCurrency;
}
private function lOrderDone() {
$this->display_title = !isset($this->display_title) ? vRequest::getBool('display_title', true) : $this->display_title;
$this->display_loginform = !isset($this->display_loginform) ? vRequest::getBool('display_loginform', true) : $this->display_loginform;
//Do not change this. It contains the payment form
$this->html = !isset($this->html) ? vRequest::get('html', vmText::_('COM_VIRTUEMART_ORDER_PROCESSED')) : $this->html;
//Show Thank you page or error due payment plugins like paypal express
}
private function checkPaymentMethodsConfigured() {
//For the selection of the payment method we need the total amount to pay.
$paymentModel = VmModel::getModel('Paymentmethod');
$payments = $paymentModel->getPayments(true, false);
if (empty($payments)) {
$text = '';
if(vmAccess::manager() or vmAccess::isSuperVendor()) {
$link = vUri::root() . 'administrator/index.php?option=com_virtuemart&view=paymentmethod';
$text = vmText::sprintf('COM_VIRTUEMART_NO_PAYMENT_METHODS_CONFIGURED_LINK', '' . $link . '');
}
vmInfo('COM_VIRTUEMART_NO_PAYMENT_METHODS_CONFIGURED', $text);
$this->cart->virtuemart_paymentmethod_id = 0;
return false;
}
return true;
}
private function checkShipmentMethodsConfigured() {
//For the selection of the shipment method we need the total amount to pay.
$shipmentModel = VmModel::getModel('Shipmentmethod');
$shipments = $shipmentModel->getShipments();
if (empty($shipments)) {
$text = '';
$user = vFactory::getUser();
if(vmAccess::manager() or vmAccess::isSuperVendor()) {
$uri = vFactory::getURI();
$link = $uri->root() . 'administrator/index.php?option=com_virtuemart&view=shipmentmethod';
$text = vmText::sprintf('COM_VIRTUEMART_NO_SHIPPING_METHODS_CONFIGURED_LINK', '' . $link . '');
}
vmInfo('COM_VIRTUEMART_NO_SHIPPING_METHODS_CONFIGURED', $text);
$tmp = 0;
$this->assignRef('found_shipment_method', $tmp);
$this->cart->virtuemart_shipmentmethod_id = 0;
return false;
}
return true;
}
/**
* Todo, works only for small stores, we need a new solution there with a bit filtering
* For example by time, if already shopper, and a simple search
* @return object list of users
*/
function getUserList() {
$result = false;
if($this->allowChangeShopper){
$this->adminID = vmAccess::getBgManagerId();
$superVendor = vmAccess::isSuperVendor($this->adminID);
if($superVendor){
$uModel = VmModel::getModel('user');
$result = $uModel->getSwitchUserList($superVendor,$this->adminID);
}
}
if(!$result) $this->allowChangeShopper = false;
return $result;
}
function renderCompleteAddressList(){
$addressList = false;
if($this->cart->user->virtuemart_user_id){
$addressList = array();
$newBT = ''.vmText::_('COM_VIRTUEMART_ACC_BILL_DEF').'';
foreach($this->cart->user->userInfo as $userInfo){
$address = $userInfo->loadFieldValues(false);
if($address->address_type=='BT'){
$address->virtuemart_userinfo_id = 0;
$address->address_type_name = $newBT;
array_unshift($addressList,$address);
} else {
$address->address_type_name = ''.$address->address_type_name.'';
$addressList[] = $address;
}
}
if(count($addressList)==0){
$addressList[0] = new stdClass();
$addressList[0]->virtuemart_userinfo_id = 0;
$addressList[0]->address_type_name = $newBT;
}
$_selectedAddress = (
empty($this->cart->selected_shipto)
? $addressList[0]->virtuemart_userinfo_id // Defaults to 1st BillTo
: $this->cart->selected_shipto
);
$this->cart->lists['shipTo'] = vHtml::_('select.radiolist', $addressList, 'shipto', null, 'virtuemart_userinfo_id', 'address_type_name', $_selectedAddress);
$this->cart->lists['billTo'] = empty($addressList[0]->virtuemart_userinfo_id)? 0 : $addressList[0]->virtuemart_userinfo_id;
} else {
$this->cart->lists['shipTo'] = false;
$this->cart->lists['billTo'] = false;
}
}
static public function addCheckRequiredJs(){
$updF = '';
if( VmConfig::get('oncheckout_ajax',false)) {
$updF = 'Virtuemart.updForm();';
}
$j='jQuery(document).ready(function(){
jQuery(".output-shipto").find(":radio").change(function(){
var form = jQuery("#checkoutFormSubmit");
form.attr("task","checkout");
'.$updF.'
form.submit();
});
jQuery("#checkoutForm").change(function(){
jQuery("#checkoutFormSubmit").attr("name","checkout");
jQuery("#checkoutFormSubmit").html("'.vmText::_('COM_VIRTUEMART_CHECKOUT_TITLE').'");
});
jQuery(".required").change(function(){
var count = 0;
var hit = 0;
jQuery.each(jQuery(".required"), function (key, value){
count++;
if(jQuery(this).attr("checked")){
hit++;
}
});
if(count==hit){
var form = jQuery("#checkoutFormSubmit");
form.attr("task","checkout");
'.$updF.'
form.submit();
}
});
});';
vmJsApi::addJScript('autocheck',$j);
}
}
//no closing tag