Advertisement
Cobbler_Veriga

Commerce Shipping price

Dec 3rd, 2016
246
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 4.38 KB | None | 0 0
  1. //Стояла задача сделать динамический расчет стоимости доставки на странице
  2. //checkout  в зависимости от того какая страна была выбрана пользователем в поле
  3. //сгенерированим модулем  addressfield
  4. //Сделал так:
  5. /**
  6.  * hook_addressfield_standard_widget_refresh_alter.
  7.  */
  8. function MODULENAME_addressfield_standard_widget_refresh_alter(&$commands, $form, $form_state){
  9.     //если ето нужная форма
  10.     if($form['#form_id'] == 'commerce_checkout_form_checkout'){
  11.     //получаем страну
  12.    $country = $form_state['input']['customer_profile_billing']['commerce_customer_address'][LANGUAGE_NONE][0]['country'];
  13.    //получаем ордер
  14.    $order = $form_state['order'];
  15.    //Самое интересное, запихаем в ордер страну, потому что
  16.    // hook_commerce_order_presave().
  17.    // принимает только order, а нам очень нужна для расчетов страна
  18.   $order->country = $country;
  19.   // здесь можно узнать что ето
  20.   // <a href="http://xandeadx.ru/blog/drupal/549" target="_blank">xandeadx.ru/blog/drupal/549</a>
  21.   $order_wrapper = entity_metadata_wrapper('commerce_order', $order);
  22.  //Тоже интересний момент,  как написано выше
  23.  //commerce_cart_order_refresh($order), функция запустит hook_commerce_order_presave
  24.  //но ето не всегда так.
  25. //Для начала нужно понять где визивается етот хук. После нескольких часов поисков нашел его в файле /sites/all/modules/commerce/includes/commerce.controller.inc
  26. //кому интересно посмотрят, но суть в том что визивается етот хук во время сохранения материала тоесть во время визова функции
  27. //commerce_order_save($order_wrapper->value())
  28. //которая визивается как можно увидить у функции
  29. //commerce_cart_order_refresh($order)
  30. //только после изменения ордера
  31. //А мне то как раз нужно визвать его чтоб изменить ордер, замкнутий круг разорвал прямим визовом    commerce_order_save.
  32.  
  33.   commerce_order_save($order_wrapper->value());
  34.   //ajax меняет форму   
  35.   $checkout_pages = commerce_checkout_pages();
  36.   // If no checkout page is specified, default to the first one.
  37.   if (empty($checkout_page)) {
  38.     $checkout_page = reset($checkout_pages);
  39.   }
  40.   $form = drupal_get_form('commerce_checkout_form_checkout', $order, $checkout_page);
  41.   $commands[] = ajax_command_replace('.cart_contents',render($form['cart_contents']));
  42.     }
  43. }
  44.  
  45. /**
  46.  * Implements hook_commerce_order_presave().
  47.  */
  48. function checkout_creative_commerce_order_presave($order) {
  49.   $country = isset($order->country) ? $order->country : 'US';
  50.   $order_wrapper = entity_metadata_wrapper('commerce_order', $order);
  51.  
  52.   if ($country == 'US') {
  53.     $discount_decimal = 30000;
  54.     $discount_currency_code = 'USD';
  55.     $order_total = $order_wrapper->commerce_order_total->value();
  56.     $discount_amount = commerce_currency_decimal_to_amount($discount_decimal, $discount_currency_code);
  57.     $discount_amount = commerce_currency_convert($discount_amount,   $discount_currency_code, $order_total['currency_code']);
  58.    
  59.     $components = $order_wrapper->commerce_order_total->value();
  60.     $components =  $components['data']['components'];
  61.     foreach ($components as $value) {
  62.         if($value['name'] == 'shipping'){
  63.             $old_shipping_price = $value['price']['amount'];
  64.         }
  65.     }
  66.  
  67.     $order_wrapper->commerce_order_total->amount = $order_total['amount'] - $old_shipping_price;
  68.     $order_wrapper->commerce_order_total->data = commerce_price_component_delete($order_total, 'shipping');
  69.  
  70.     $order_wrapper->commerce_order_total->amount = $order_total['amount'] + $discount_amount;
  71.     $order_wrapper->commerce_order_total->data =   commerce_price_component_add($order_total, 'shipping', array(
  72.           'amount' => $discount_amount,
  73.           'currency_code' => $order_total['currency_code'],
  74.           'data' => array(),
  75.         ), TRUE);
  76.   }
  77. }
  78.  
  79. </php>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement