diff --git a/commerce_coupon.install b/commerce_coupon.install index c4d538cddf2a765a3ebb8e3e4a26de9572f83444..a244701f2f5fd83931c5fd2e0e22940d5ef37b9f 100644 --- a/commerce_coupon.install +++ b/commerce_coupon.install @@ -130,6 +130,7 @@ function commerce_coupon_uninstall() { variable_del('commerce_coupon_default_code_size'); variable_del('commerce_coupon_checkout_pane_view'); variable_del('commerce_coupon_review_pane_view'); + variable_del('commerce_coupon_checkout_enable_add_button'); } /** diff --git a/includes/commerce_coupon.checkout_pane.inc b/includes/commerce_coupon.checkout_pane.inc index 6f8386c40deb70ed0cfcdbcec70846c86ab01147..b915639629fe278025b922635f9cfe99451fb6a4 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,20 @@ function commerce_coupon_pane_checkout_form($form, &$form_state, $checkout_pane, '#title' => t('Coupon Code'), '#description' => t('Enter here your coupon code.'), ); + + if (variable_get('commerce_coupon_checkout_enable_add_button', TRUE)) { + $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 +50,54 @@ 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)) { + global $_commerce_coupon_validation_error_message; + $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; + } + // Force shopping cart refresh to recalculate all prices there, + // which is not done automatically in case of percentage coupons. + commerce_cart_order_refresh($order); + $pane_form['redeemed_coupons']['#markup'] = commerce_embed_view($view_id, $display_id, array($order->order_id)); + } + else { + if (isset($_commerce_coupon_validation_error_message)) { + $message = $_commerce_coupon_validation_error_message; + } + else { + $message = t('Your coupon code is not valid.'); + } + form_set_error('commerce_coupon][coupon_code', $message); + } + } + } + } + + // 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 +138,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); } } @@ -79,7 +177,7 @@ function commerce_coupon_pane_checkout_form_submit($form, &$form_state, $checkou * Implements the callback for the checkout pane review form */ function commerce_coupon_pane_review($form, $form_state, $checkout_pane, $order) { - if(!empty($order->commerce_coupon_order_reference)) { + if (!empty($order->commerce_coupon_order_reference)) { // Extract the View and display keys from the cart contents pane setting. list($view_id, $display_id) = explode('|', variable_get('commerce_coupon_review_pane_view', 'commerce_coupon_review_pane|default')); @@ -122,5 +220,12 @@ function commerce_coupon_pane_settings_form($checkout_pane) { '#default_value' => variable_get('commerce_coupon_review_pane_view', 'commerce_coupon_review_pane|default'), ); + $form['commerce_coupon_checkout_enable_add_button'] = array( + '#type' => 'checkbox', + '#title' => t('Enable Add coupon button'), + '#description' => t('Enabling Add coupon button provides option to add multiple coupon codes from Coupons checkout pane.'), + '#default_value' => variable_get('commerce_coupon_checkout_enable_add_button', TRUE), + ); + return $form; }