From 998c0c9fa447a7f077b88349d6bebb79dcffa45c Mon Sep 17 00:00:00 2001 From: Maciej Zgadzaj Date: Fri, 14 Sep 2012 05:40:05 -0400 Subject: [PATCH] Issue #1329600: Provide ajax support to reload form after coupon has been added --- includes/commerce_coupon.checkout_pane.inc | 88 +++++++++++++++++++++++++++- 1 files changed, 87 insertions(+), 1 deletions(-) diff --git a/includes/commerce_coupon.checkout_pane.inc b/includes/commerce_coupon.checkout_pane.inc index 088b2a3..fd493f6 100644 --- a/includes/commerce_coupon.checkout_pane.inc +++ b/includes/commerce_coupon.checkout_pane.inc @@ -12,7 +12,11 @@ * Payment pane: form callback. */ function commerce_coupon_pane_checkout_form($form, &$form_state, $checkout_pane, $order) { - $pane_form = array(); + // Allow to replace pane content with ajax calls. + $pane_form = array( + '#prefix' => '
', + '#suffix' => '
', + ); // Store the payment methods in the form for validation purposes. $pane_form['coupon_code'] = array( @@ -20,6 +24,18 @@ function commerce_coupon_pane_checkout_form($form, &$form_state, $checkout_pane, '#title' => t('Coupon Code'), '#description' => t('Enter here your coupon code.'), ); + + $pane_form['coupon_add'] = array( + '#type' => 'button', + '#value' => t('Add coupon'), + '#name' => 'coupon_add', + '#limit_validation_errors' => array(), + '#ajax' => array( + 'callback' => 'commerce_coupon_add_coupon_callback', + 'wrapper' => 'commerce-checkout-coupon-ajax-wrapper', + ), + ); + // Extract the View and display keys from the cart contents pane setting. $pane_view = variable_get('commerce_coupon_checkout_pane_view', 'commerce_coupon_review_pane|default'); if ($pane_view <> 'none') { @@ -32,6 +48,44 @@ function commerce_coupon_pane_checkout_form($form, &$form_state, $checkout_pane, } } + if (isset($form_state['triggering_element']) && $form_state['triggering_element']['#name'] == 'coupon_add') { + if (!empty($form_state['values']['commerce_coupon']['coupon_add'])) { + list($view_id, $display_id) = explode('|', variable_get('commerce_coupon_review_pane_view', 'commerce_coupon_review_pane|default')); + if (!empty($view_id) && !empty($display_id)) { + $code = $form_state['input']['commerce_coupon']['coupon_code']; + if (!empty($code) && commerce_coupon_code_is_valid($code, $order)) { + $coupon = commerce_coupon_load_by_code($code); + commerce_coupon_redeem_coupon($coupon, $order); + + // Clear the field value so that the coupon code does not get resubmitted + // causing an error when user uses main "Continue to next step" submit. + $pane_form['coupon_code']['#value'] = ''; + + if (isset($order->order_id) && is_numeric($order->order_id)) { + // This is to get the summary of the form rerendered. + $alter_coupon_commands = &drupal_static('alter_coupon_commands'); + $coupon_current_order = &drupal_static('coupon_current_order'); + $alter_coupon_commands = TRUE; + $coupon_current_order = $order->order_id; + } + $pane_form['redeemed_coupons']['#markup'] = commerce_embed_view($view_id, $display_id, array($order->order_id)); + } + else { + form_set_error('commerce_coupon][coupon_code', t('Your coupon code is not valid.')); + } + } + } + } + + // Display any new status messages added by this pane within the pane's area. + if (drupal_get_messages(NULL, FALSE)) { + $pane_form['status_messages'] = array( + '#type' => 'markup', + '#markup' => theme('status_messages'), + '#weight' => -1, + ); + } + return $pane_form; } @@ -72,6 +126,38 @@ function commerce_coupon_pane_checkout_form_submit($form, &$form_state, $checkou if (!form_get_errors() && $code = $form_state['values']['commerce_coupon']['coupon_code']) { $commerce_coupon = commerce_coupon_load_by_code($code); commerce_coupon_redeem_coupon($commerce_coupon, $order); + // Rebuild the form only if "Add coupon" ajax submit was used + // and we're still staying on the same page. + if (isset($form_state['triggering_element']) && $form_state['triggering_element']['#name'] == 'coupon_add') { + $form_state['rebuild'] = TRUE; + } + } +} + +/** + * Callback for the ajax button coupon_add. + */ +function commerce_coupon_add_coupon_callback($form, &$form_state) { + return $form['commerce_coupon']; +} + +/** + * Implements hook_ajax_render_alter(). + * + * This is to get the summary of the cart to rerender on the add coupon button. + */ +function commerce_coupon_ajax_render_alter(&$commands) { + $alter_coupon_commands = &drupal_static('alter_coupon_commands'); + $coupon_current_order = &drupal_static('coupon_current_order'); + + if ($alter_coupon_commands) { + list($view_id, $display_id) = explode('|', variable_get('commerce_cart_contents_pane_view', 'commerce_cart_summary|default')); + $contents = array(); + $contents['cart_contents_view'] = array( + '#markup' => commerce_embed_view($view_id, $display_id, array($coupon_current_order)), + ); + $contents = drupal_render($contents); + $commands[] = ajax_command_replace('.view-commerce-cart-summary', $contents); } } -- 1.7.2.5