You are here

function commerce_coupon_form_attach_coupons in Commerce Coupon 7.2

Form submit callback: save a coupon from the discount UI.

1 string reference to 'commerce_coupon_form_attach_coupons'
commerce_coupon_form_commerce_discount_form_alter in ./commerce_coupon.module
Implements hook_form_FORM_ID_alter().

File

./commerce_coupon.module, line 1659
Provides coupon functionality for Drupal Commerce.

Code

function commerce_coupon_form_attach_coupons(&$form, &$form_state) {

  // By default don't rebuild rules config.
  $rebuild_rules = FALSE;
  if (!empty($form_state['coupons']) && !empty($form_state['commerce_discount']->discount_id)) {

    // Save coupons.
    foreach ($form_state['coupons'] as $coupon) {
      if ($coupon->coupon_id || !commerce_coupon_load_by_code($coupon->code)) {

        // Add a reference to this discount if it is not referenced already.
        $coupon_wrapper = entity_metadata_wrapper('commerce_coupon', $coupon);
        if (!commerce_coupon_coupon_has_discount($coupon_wrapper, $form_state['commerce_discount']->name)) {
          $delta = !$coupon_wrapper->commerce_discount_reference
            ->value() ? 0 : $coupon_wrapper->commerce_discount_reference
            ->count();
          $language = field_language('commerce_coupon', $coupon, 'commerce_discount_reference');
          $coupon->commerce_discount_reference[$language][$delta]['target_id'] = $form_state['commerce_discount']->discount_id;
        }

        // Save coupon.
        commerce_coupon_save($coupon);

        // Force rules rebuild.
        $rebuild_rules = TRUE;
      }
    }
  }

  // Remove coupons.
  if (!empty($form_state['original_coupons'])) {
    foreach ($form_state['original_coupons'] as $original_coupon) {
      if (!commerce_coupon_coupon_list_has_code($original_coupon->code, $form_state['coupons'])) {

        // If the coupon code is no longer attached to this discount and it is
        // attached to no other discounts, delete it completely.
        $remove_coupon = commerce_coupon_load_by_code($original_coupon->code);
        $wrapper = entity_metadata_wrapper('commerce_coupon', $remove_coupon);
        if (!empty($form_state['commerce_discount']->discount_id)) {
          foreach ($wrapper->commerce_discount_reference
            ->value() as $delta => $discount) {
            if ($discount->discount_id == $form_state['commerce_discount']->discount_id) {

              // Break the reference from this coupon to the discount currently
              // being edited in the form. @TODO: why is the wrapper not working
              // here?
              $language = field_language('commerce_coupon', $remove_coupon, 'commerce_discount_reference');
              unset($remove_coupon->commerce_discount_reference[$language][$delta]);
            }
          }
        }

        // If no discounts remain, delete the coupon.
        if (empty($remove_coupon->commerce_discount_reference[$language])) {
          commerce_coupon_delete($original_coupon->coupon_id);
        }
        else {

          // If we are not deleting, save the coupon since we eliminated one or
          // more of its discount references.
          $wrapper
            ->save();
        }

        // Force rules rebuild.
        $rebuild_rules = TRUE;
      }
    }
  }

  // Rebuild the rules again if coupon added or deleted.
  if ($rebuild_rules && !empty($form_state['commerce_discount']->discount_id)) {
    if ($discount = entity_load_single('commerce_discount', $form_state['commerce_discount']->discount_id)) {
      _commerce_discount_rebuild_rules_config(array(
        $discount,
      ));
    }
  }
}