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;
}