diff --git a/classes/Cart.php b/classes/Cart.php index 3b2822d8d..cdc6abfc1 100644 --- a/classes/Cart.php +++ b/classes/Cart.php @@ -1717,7 +1717,7 @@ class CartCore extends ObjectModel 'carrier_list' => $best_price_carrier, 'is_best_price' => true, 'is_best_grade' => false, - 'unique_carrier' => false + 'unique_carrier' => (count($best_price_carrier) <= 1) ); $best_grade_carrier = array(); @@ -1742,7 +1742,7 @@ class CartCore extends ObjectModel $delivery_option_list[$id_address][$key] = array( 'carrier_list' => $best_grade_carrier, 'is_best_price' => false, - 'unique_carrier' => false + 'unique_carrier' => (count($best_grade_carrier) <= 1) ); $delivery_option_list[$id_address][$key]['is_best_grade'] = true; @@ -1769,7 +1769,7 @@ class CartCore extends ObjectModel $delivery_option_list[$id_address][$key] = array( 'is_best_price' => false, 'is_best_grade' => false, - 'unique_carrier' => false, + 'unique_carrier' => true, 'carrier_list' => array( $id_carrier => array( 'price_with_tax' => $price_with_tax, @@ -1780,7 +1780,7 @@ class CartCore extends ObjectModel ) ); else - $delivery_option_list[$id_address][$key]['unique_carrier'] = true; + $delivery_option_list[$id_address][$key]['unique_carrier'] = (count($delivery_option_list[$id_address][$key]['carrier_list']) <= 1); } foreach ($delivery_option_list as $id_address => $delivery_option) @@ -1810,6 +1810,23 @@ class CartCore extends ObjectModel $cache = $delivery_option_list; return $delivery_option_list; } + + public function carrierIsSelected($id_carrier, $id_address) + { + $delivery_option = $this->getDeliveryOption(); + $delivery_option_list = $this->getDeliveryOptionList(); + + if (!isset($delivery_option[$id_address])) + return false; + + if (!isset($delivery_option_list[$id_address][$delivery_option[$id_address]])) + return false; + + if (!in_array($id_carrier, array_keys($delivery_option_list[$id_address][$delivery_option[$id_address]]['carrier_list']))) + return false; + + return true; + } /** * Get all deliveries options available for the current cart formated like Carriers::getCarriersForOrder @@ -3137,4 +3154,33 @@ class CartCore extends ObjectModel } return true; } + + /** + * + * Execute hook displayCarrierList (extraCarrier) and merge theme to the $array + * @param array $array + */ + public static function addExtraCarriers(&$array) + { + $first = true; + $hook_extracarrier_addr = array(); + foreach (Context::getContext()->cart->getAddressCollection() as $address) + { + $hook = Hook::exec('displayCarrierList', array('address' => $address)); + $hook_extracarrier_addr[$address->id] = $hook; + + if ($first) + { + $array = array_merge( + $array, + array('HOOK_EXTRACARRIER' => $hook) + ); + $first = false; + } + $array = array_merge( + $array, + array('HOOK_EXTRACARRIER_ADDR' => $hook_extracarrier_addr) + ); + } + } } diff --git a/controllers/front/CartController.php b/controllers/front/CartController.php index 09e462087..dc8365982 100644 --- a/controllers/front/CartController.php +++ b/controllers/front/CartController.php @@ -268,7 +268,7 @@ class CartControllerCore extends FrontController $deliveryAddress = new Address($this->context->cart->id_address_delivery); $id_country = (isset($deliveryAddress) && $deliveryAddress->id) ? $deliveryAddress->id_country : Configuration::get('PS_COUNTRY_DEFAULT'); - $result['HOOK_EXTRACARRIER'] = Hook::exec('displayCarrierList', array('address' => (isset($deliveryAddress) && (int)$deliveryAddress->id) ? $deliveryAddress : null)); + Cart::addExtraCarriers($result); } $result['summary'] = $this->context->cart->getSummaryDetails(); $result['customizedDatas'] = Product::getAllCustomizedDatas($this->context->cart->id, null, true); diff --git a/controllers/front/OrderController.php b/controllers/front/OrderController.php index 1e3059dab..48334deac 100644 --- a/controllers/front/OrderController.php +++ b/controllers/front/OrderController.php @@ -92,6 +92,23 @@ class OrderControllerCore extends ParentOrderController { global $isVirtualCart; + if (Tools::isSubmit('ajax') && Tools::getValue('method') == 'updateExtraCarrier') + { + // Change virtualy the currents delivery options + $delivery_option = $this->context->cart->getDeliveryOption(); + $delivery_option[(int)Tools::getValue('id_address')] = Tools::getValue('id_delivery_option'); + $this->context->cart->setDeliveryOption($delivery_option); + $return = array( + 'content' => Hook::exec( + 'displayCarrierList', + array( + 'address' => new Address((int)Tools::getValue('id_address')) + ) + ) + ); + die(Tools::jsonEncode($return)); + } + if ($this->nbProducts) $this->context->smarty->assign('virtual_cart', $isVirtualCart); diff --git a/controllers/front/OrderOpcController.php b/controllers/front/OrderOpcController.php index da87275d7..dce157435 100644 --- a/controllers/front/OrderOpcController.php +++ b/controllers/front/OrderOpcController.php @@ -68,12 +68,16 @@ class OrderOpcControllerCore extends ParentOrderController { if ($this->_processCarrier()) { + $carriers = $this->context->cart->simulateCarriersOutput(); + $address_delivery = new Address($this->context->cart->id_address_delivery); $return = array( 'summary' => $this->context->cart->getSummaryDetails(), 'HOOK_TOP_PAYMENT' => Hook::exec('displayPaymentTop'), 'HOOK_PAYMENT' => $this->_getPaymentMethods(), 'carrier_data' => $this->_getCarrierList(), + 'HOOK_BEFORECARRIER' => Hook::exec('displayBeforeCarrier', array('carriers' => $carriers)) ); + Cart::addExtraCarriers($return); die(Tools::jsonEncode($return)); } else @@ -436,8 +440,7 @@ class OrderOpcControllerCore extends ParentOrderController $link_conditions .= '&content_only=1'; $carriers = $this->context->cart->simulateCarriersOutput(); - - $this->context->smarty->assign(array( + $vars = array( 'checkedTOS' => (int)($this->context->cookie->checkedTOS), 'recyclablePackAllowed' => (int)(Configuration::get('PS_RECYCLABLE_PACK')), 'giftAllowed' => (int)(Configuration::get('PS_GIFT_WRAPPING')), @@ -451,7 +454,17 @@ class OrderOpcControllerCore extends ParentOrderController 'checked' => $this->context->cart->simulateCarrierSelectedOutput(), 'delivery_option' => $this->context->cart->getDeliveryOption(), 'address_collection' => $this->context->cart->getAddressCollection(), - 'opc' => true)); + 'opc' => true, + 'HOOK_BEFORECARRIER' => Hook::exec('displayBeforeCarrier', array( + 'carriers' => $carriers, + 'delivery_option_list' => $this->context->cart->getDeliveryOptionList(), + 'delivery_option' => $this->context->cart->getDeliveryOption() + )) + ); + + Cart::addExtraCarriers($vars); + + $this->context->smarty->assign($vars); if ($this->context->customer->id) $groups = $this->context->customer->getGroups(); @@ -469,9 +482,9 @@ class OrderOpcControllerCore extends ParentOrderController 'delivery_option_list' => $this->context->cart->getDeliveryOptionList(), 'delivery_option' => $this->context->cart->getDeliveryOption() )), - 'carrier_block' => $this->context->smarty->fetch(_PS_THEME_DIR_.'order-carrier.tpl'), - 'HOOK_EXTRACARRIER' => Hook::exec('displayCarrierList', array('address' => $address_delivery)) + 'carrier_block' => $this->context->smarty->fetch(_PS_THEME_DIR_.'order-carrier.tpl') ); + Cart::addExtraCarriers($result); return $result; } if (sizeof($this->errors)) diff --git a/controllers/front/ParentOrderController.php b/controllers/front/ParentOrderController.php index 4b73911a3..499c375ba 100644 --- a/controllers/front/ParentOrderController.php +++ b/controllers/front/ParentOrderController.php @@ -406,15 +406,19 @@ class ParentOrderControllerCore extends FrontController 'checked' => $checked, 'delivery_option' => $this->context->cart->getDeliveryOption() )); - $this->context->smarty->assign(array( - 'HOOK_EXTRACARRIER' => Hook::exec('displayCarrierList', array('address' => $address)), + + $vars = array( 'HOOK_BEFORECARRIER' => Hook::exec('displayBeforeCarrier', array( 'carriers' => $carriers, 'checked' => $checked, 'delivery_option_list' => $delivery_option_list, 'delivery_option' => $this->context->cart->getDeliveryOption() )) - )); + ); + + Cart::addExtraCarriers($vars); + + $this->context->smarty->assign($vars); } protected function _assignWrappingAndTOS() diff --git a/themes/default/css/global.css b/themes/default/css/global.css index 1b15e0eed..2a64132c0 100644 --- a/themes/default/css/global.css +++ b/themes/default/css/global.css @@ -860,7 +860,7 @@ table#cart_summary .cart_total_price .total_price_container { color:#666 } -#orderopc #login_form_content label { +#order-opc #login_form_content label { display:block; margin:0 0 10px 0 } @@ -889,7 +889,7 @@ table#cart_summary .cart_total_price .total_price_container { } .lost_password a {color:#666} -#orderopc .lost_password { +#order-opc .lost_password { display:block; float:none; margin:5px 0 10px; @@ -962,12 +962,12 @@ table#cart_summary .cart_total_price .total_price_container { /* step 4 - paiement ************************************************************************** */ /* #################### CSS MAXENCE ######################## -#order .delivery_options_address, #orderopc .delivery_options_address { +#order .delivery_options_address, #order-opc .delivery_options_address { width: 541px; margin-left: 7px; } */ -#order .delivery_options_address h3, #orderopc .delivery_options_address h3 { +#order .delivery_options_address h3, #order-opc .delivery_options_address h3 { /*background: url("../img/table_header.gif") no-repeat; color: #374853; font-weight: bold; @@ -981,51 +981,51 @@ margin: 10px 0 0 0;*/ text-transform: uppercase; background: none repeat scroll 0 0 #383838; } -#order .delivery_option_radio, #orderopc .delivery_option_radio { +#order .delivery_option_radio, #order-opc .delivery_option_radio { float: left; margin: 12px; } -#order .delivery_option label, #orderopc .delivery_option label { +#order .delivery_option label, #order-opc .delivery_option label { display: block; padding-bottom: 5px; } -#order .delivery_option label > table.resume, #orderopc .delivery_option label > table.resume { +#order .delivery_option label > table.resume, #order-opc .delivery_option label > table.resume { height: 40px; width: 685px; } -#order .delivery_option.item, #orderopc .delivery_option.item { +#order .delivery_option.item, #order-opc .delivery_option.item { background: #fafafa; } -#order .delivery_option.alternate_item, #orderopc .delivery_option.alternate_item { +#order .delivery_option.alternate_item, #order-opc .delivery_option.alternate_item { border-top: 1px solid #bdc2c9; background: #f1f2f4; border-bottom: 1px solid #bdc2c9; } -#order .delivery_option label > table.resume td, #orderopc .delivery_option label > table.resume td { +#order .delivery_option label > table.resume td, #order-opc .delivery_option label > table.resume td { padding: 0 8px; } -#order .delivery_option label > table.resume td + td, #orderopc .delivery_option label > table.resume td + td { +#order .delivery_option label > table.resume td + td, #order-opc .delivery_option label > table.resume td + td { width: 300px; } -#order .delivery_option label > table.resume td + td + td, #orderopc .delivery_option label > table.resume td + td + td { +#order .delivery_option label > table.resume td + td + td, #order-opc .delivery_option label > table.resume td + td + td { width: 100px; text-align: right; } #order .delivery_option_carrier td {width:200px} #order .delivery_option_carrier td + td {width:280px;} #order .delivery_option_carrier td + td + td {width:200px} -#order .delivery_options_address .delivery_option_logo, #order .delivery_option_carrier .delivery_option_logo, #orderopc .delivery_options_address .delivery_option_logo { +#order .delivery_options_address .delivery_option_logo, #order .delivery_option_carrier .delivery_option_logo, #order-opc .delivery_options_address .delivery_option_logo { padding-left:10px; width: 160px; } -#order .delivery_options_address .delivery_option_logo img, #orderopc .delivery_options_address .delivery_option_logo img { /*height: 40px;*/ } -#orderopc .delivery_option_carrier { +#order .delivery_options_address .delivery_option_logo img, #order-opc .delivery_options_address .delivery_option_logo img { /*height: 40px;*/ } +#order-opc .delivery_option_carrier { margin: 0 0 0 45px; padding: 5px; width: 680px; background: white; } -#order .delivery_option_carrier .first_item { +#order .delivery_option_carrier .first_item, #order-opc .delivery_option_carrier .first_item { padding:0 0 0 5px; background:url(../img/arrow_right_2.png) no-repeat 0 2px } @@ -1060,11 +1060,11 @@ margin: 10px 0 0 0;*/ #carrierTable th { padding:0 15px; height: 29px; - font-weight: bold; - line-height:29px; - color:#fff; + font-weight: bold; + line-height:29px; + color:#fff; text-transform:uppercase; - background:url(../img/bg_address_title.png) repeat-x 0 0 #989898 + background:url(../img/bg_address_title.png) repeat-x 0 0 #989898 } #carrierTable td { padding:15px; @@ -1129,56 +1129,60 @@ a.iframe {font-weight:bold} /* ************************************************************************************************ PAGE ORDER-OPC ************************************************************************************************ */ -#orderopc #left_column {display:none} -#orderopc #center_column{width:757px} +#order-opc #left_column {display:none} +#order-opc #center_column{width:757px} -#orderopc h2 {} -#orderopc h2 span { +#order-opc h2 {} +#order-opc h2 span { display:inline-block; padding:5px 7px; color:#fff; background:#333; } -#orderopc #login_form fieldset { +#order-opc #login_form fieldset { background: none repeat scroll 0 0 #FFFFE0; - border: 1px solid #E6DB55; - font-size: 13px; - margin: 0 0 10px; - padding: 10px; + border: 1px solid #E6DB55; + font-size: 13px; + margin: 0 0 10px; + padding: 10px; } -#orderopc #login_form fieldset p {padding:0} -#orderopc #login_form fieldset p a {padding:0} +#order-opc #login_form fieldset p {padding:0} +#order-opc #login_form fieldset p a {padding:0} -#orderopc #new_account_form p.submit { +#order-opc #new_account_form p.submit { margin-right: 120px; text-align:right } -#orderopc #new_account_form p.opc-required {margin-left:20px} +#order-opc #new_account_form p.opc-required {margin-left:20px} -#orderopc .addresses {margin-bottom:20px} +#order-opc .addresses {margin-bottom:20px} -#orderopc #opc_delivery_methods h3 {margin-top:20px;} -#orderopc #opc_delivery_methods textarea { +#order-opc #opc_delivery_methods h3 {margin-top:20px;} +#order-opc #opc_delivery_methods textarea { height:60px; width:755px; border:1px solid #ccc } -#orderopc #opc_payment_methods {margin-bottom:20px} -#orderopc #opc_payment_methods #opc_payment_methods-content p{margin:0} +#order-opc #opc_payment_methods {margin-bottom:20px} +#order-opc #opc_payment_methods #opc_payment_methods-content p{margin:0} -#orderopc .delivery_option_carrier td {width:200px} -#orderopc .delivery_option_carrier td + td {width:280px;} -#orderopc .delivery_option_carrier td + td + td {width:200px} -#orderopc .delivery_option_carrier { +#order-opc .delivery_option_carrier td {width:200px} +#order-opc .delivery_option_carrier td + td {width:280px;} +#order-opc .delivery_option_carrier td + td + td {width:200px} +#order-opc .delivery_option_carrier { margin: 0 0 0 45px; padding: 5px; width: 680px; background: white; + display: none; } -#orderopc .delivery_option_carrier .first_item {padding:0 0 0 5px} +#order-opc .delivery_option_carrier.selected { + display: table; +} +#order-opc .delivery_option_carrier .first_item {padding:0 0 0 5px} /* ************************************************************************************************ diff --git a/themes/default/js/cart-summary.js b/themes/default/js/cart-summary.js index 20f57f181..e493f6c9f 100644 --- a/themes/default/js/cart-summary.js +++ b/themes/default/js/cart-summary.js @@ -615,7 +615,15 @@ function refreshDeliveryOptions() { $.each($('.delivery_option_radio'), function() { if ($(this).attr('checked')) + { $(this).parent().find('.delivery_option_carrier').show(); + var carrier_id_list = $(this).val().split(','); + carrier_id_list.pop(); + var it = this; + $(carrier_id_list).each(function() { + $(it).parent().find('input[value="'+this.toString()+'"]').change(); + }); + } else $(this).parent().find('.delivery_option_carrier').hide(); }); @@ -658,3 +666,25 @@ $(document).ready(function() { } ); }); + +function updateExtraCarrier(id_delivery_option, id_address) +{ + if(typeof(orderOpcUrl) != 'undefined') + var url = orderOpcUrl; + else + var url = orderUrl; + + $.ajax({ + type: 'POST', + url: url, + async: true, + cache: false, + dataType : "json", + data: 'ajax=true&method=updateExtraCarrier&id_address='+id_address+'&id_delivery_option='+id_delivery_option+'&token=' + static_token, + success: function(jsonData) + { + console.log(jsonData); + $('#HOOK_EXTRACARRIER_'+id_address).html(jsonData['content']); + } + }); +} \ No newline at end of file diff --git a/themes/default/js/order-opc.js b/themes/default/js/order-opc.js index 24b4d256f..6e8b7e507 100644 --- a/themes/default/js/order-opc.js +++ b/themes/default/js/order-opc.js @@ -28,8 +28,9 @@ function updateCarrierList(json) { var html = json.carrier_block; - if (json.HOOK_EXTRACARRIER !== null && json.HOOK_EXTRACARRIER != undefined) - html += json.HOOK_EXTRACARRIER; + // @todo check with theme 1.4 + //if ($('#HOOK_EXTRACARRIER').length == 0 && json.HOOK_EXTRACARRIER !== null && json.HOOK_EXTRACARRIER != undefined) + // html += json.HOOK_EXTRACARRIER; $('#carrier_area').replaceWith(html); @@ -181,7 +182,7 @@ function updateCarrierSelectionAndGift() $('#opc_payment_methods-overlay').fadeOut('slow'); $('#opc_delivery_methods-overlay').fadeOut('slow'); } - }); + }); } function confirmFreeOrder() diff --git a/themes/default/order-address-multishipping-products.tpl b/themes/default/order-address-multishipping-products.tpl index 9826e2aed..fb28f4738 100644 --- a/themes/default/order-address-multishipping-products.tpl +++ b/themes/default/order-address-multishipping-products.tpl @@ -25,9 +25,9 @@ *}

{l s='Choose the delivery addresses:'}

diff --git a/themes/default/order-carrier.tpl b/themes/default/order-carrier.tpl index d5dd89f57..147e94143 100644 --- a/themes/default/order-carrier.tpl +++ b/themes/default/order-carrier.tpl @@ -34,6 +34,7 @@ var currencyBlank = '{$currencyBlank|intval}'; var txtProduct = "{l s='product'}"; var txtProducts = "{l s='products'}"; + var orderUrl = '{$link->getPageLink("order", true)}'; var msg = "{l s='You must agree to the terms of service before continuing.' js=1}"; {literal} @@ -117,7 +118,7 @@
{foreach $option_list as $key => $option}
- +
@@ -132,7 +133,6 @@ {/foreach}
- {if $option.unique_carrier} {foreach $option.carrier_list as $carrier} {$carrier.instance->name} @@ -167,18 +167,22 @@
- +
{foreach $option.carrier_list as $carrier} {if !$option.unique_carrier} - + {/if}
+ {if $carrier.logo} {$carrier.instance->name} {/if} {$carrier.instance->name} + {$carrier.instance->name} + + {if isset($carrier.instance->delay[$cookie->id_lang])} {$carrier.instance->delay[$cookie->id_lang]} {/if} @@ -190,6 +194,7 @@ {/foreach} +
{$HOOK_EXTRACARRIER_ADDR.$id_address}
{foreachelse}

{if $cart->isMultiAddressDelivery()}