Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //Стояла задача сделать динамический расчет стоимости доставки на странице
- //checkout в зависимости от того какая страна была выбрана пользователем в поле
- //сгенерированим модулем addressfield
- //Сделал так:
- /**
- * hook_addressfield_standard_widget_refresh_alter.
- */
- function MODULENAME_addressfield_standard_widget_refresh_alter(&$commands, $form, $form_state){
- //если ето нужная форма
- if($form['#form_id'] == 'commerce_checkout_form_checkout'){
- //получаем страну
- $country = $form_state['input']['customer_profile_billing']['commerce_customer_address'][LANGUAGE_NONE][0]['country'];
- //получаем ордер
- $order = $form_state['order'];
- //Самое интересное, запихаем в ордер страну, потому что
- // hook_commerce_order_presave().
- // принимает только order, а нам очень нужна для расчетов страна
- $order->country = $country;
- // здесь можно узнать что ето
- // <a href="http://xandeadx.ru/blog/drupal/549" target="_blank">xandeadx.ru/blog/drupal/549</a>
- $order_wrapper = entity_metadata_wrapper('commerce_order', $order);
- //Тоже интересний момент, как написано выше
- //commerce_cart_order_refresh($order), функция запустит hook_commerce_order_presave
- //но ето не всегда так.
- //Для начала нужно понять где визивается етот хук. После нескольких часов поисков нашел его в файле /sites/all/modules/commerce/includes/commerce.controller.inc
- //кому интересно посмотрят, но суть в том что визивается етот хук во время сохранения материала тоесть во время визова функции
- //commerce_order_save($order_wrapper->value())
- //которая визивается как можно увидить у функции
- //commerce_cart_order_refresh($order)
- //только после изменения ордера
- //А мне то как раз нужно визвать его чтоб изменить ордер, замкнутий круг разорвал прямим визовом commerce_order_save.
- commerce_order_save($order_wrapper->value());
- //ajax меняет форму
- $checkout_pages = commerce_checkout_pages();
- // If no checkout page is specified, default to the first one.
- if (empty($checkout_page)) {
- $checkout_page = reset($checkout_pages);
- }
- $form = drupal_get_form('commerce_checkout_form_checkout', $order, $checkout_page);
- $commands[] = ajax_command_replace('.cart_contents',render($form['cart_contents']));
- }
- }
- /**
- * Implements hook_commerce_order_presave().
- */
- function checkout_creative_commerce_order_presave($order) {
- $country = isset($order->country) ? $order->country : 'US';
- $order_wrapper = entity_metadata_wrapper('commerce_order', $order);
- if ($country == 'US') {
- $discount_decimal = 30000;
- $discount_currency_code = 'USD';
- $order_total = $order_wrapper->commerce_order_total->value();
- $discount_amount = commerce_currency_decimal_to_amount($discount_decimal, $discount_currency_code);
- $discount_amount = commerce_currency_convert($discount_amount, $discount_currency_code, $order_total['currency_code']);
- $components = $order_wrapper->commerce_order_total->value();
- $components = $components['data']['components'];
- foreach ($components as $value) {
- if($value['name'] == 'shipping'){
- $old_shipping_price = $value['price']['amount'];
- }
- }
- $order_wrapper->commerce_order_total->amount = $order_total['amount'] - $old_shipping_price;
- $order_wrapper->commerce_order_total->data = commerce_price_component_delete($order_total, 'shipping');
- $order_wrapper->commerce_order_total->amount = $order_total['amount'] + $discount_amount;
- $order_wrapper->commerce_order_total->data = commerce_price_component_add($order_total, 'shipping', array(
- 'amount' => $discount_amount,
- 'currency_code' => $order_total['currency_code'],
- 'data' => array(),
- ), TRUE);
- }
- }
- </php>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement