You are here

function commerce_registration_line_item_registration_delete in Commerce Registration 7.2

Submit callback for line item registration remove checkboxes.

1 string reference to 'commerce_registration_line_item_registration_delete'
commerce_registration_form_commerce_order_ui_order_form_alter in ./commerce_registration.module
Implements hook_form_FORM_ID_alter().

File

./commerce_registration.module, line 1114
Commerce Registration module code.

Code

function commerce_registration_line_item_registration_delete($form, &$form_state) {
  if (isset($form['commerce_registration']['line_item_registrations'])) {
    $registrations_to_delete = array();
    $order = NULL;
    $update_order = FALSE;

    // Did we trigger this with an ajax callback?
    $triggered = FALSE;
    if (!empty($form_state['triggering_element'])) {
      $trigger_parents = array_reverse($form_state['triggering_element']['#array_parents']);
      $triggered = (bool) ($trigger_parents[0] === 'registration_remove');
    }

    // Loop through the registration enabled line items and submit any related
    // registration forms.
    foreach (element_children($form['commerce_registration']['line_item_registrations']) as $line_item_id) {
      if (isset($form['commerce_registration']['line_item_registrations'][$line_item_id]['registrations'])) {
        $line_item_registrations = $form['commerce_registration']['line_item_registrations'][$line_item_id]['registrations'];
        $prodkey = $line_item_registrations['#prodkey'];
        $deltas = array();

        // Loop through the registrations for this element/line item.
        foreach (element_children($line_item_registrations) as $registration_id) {

          // Mark the registrations that have been selected for deletion...
          if ($line_item_registrations[$registration_id]['registration_remove']['#value']) {

            // Load the order if we haven't already. No need to do it unless
            // we need to.
            if (!$order) {

              // If the user is editing an order, load a fresh copy.
              if ($form_state['commerce_order']->order_id) {

                // We need to load the order uncached since a cached version may
                // include unsaved field data that may be invalid and cause
                // issues upon saving.
                if ($loaded_orders = entity_load('commerce_order', array(
                  $form_state['commerce_order']->order_id,
                ), array(), TRUE)) {
                  $form_state['commerce_order'] = reset($loaded_orders);
                }
              }

              // Merge changes into the order object in the form state so it is
              // accessible by field handlers.
              $order = $form_state['commerce_order'];
            }
            $delta = $line_item_registrations[$registration_id]['delta']['#value'];
            if (isset($order->data['register_entities'][$prodkey][$delta]) && ($registration = $order->data['register_entities'][$prodkey][$delta])) {
              if ($registration_id == $registration->registration_id) {
                $registrations_to_delete[] = $registration_id;
                $deltas[] = $delta;
              }
            }
          }
        }
        if ($deltas) {

          // Update the registration information in $order->data.
          $order->data['register_entities'][$prodkey] = array_values(array_diff_key($order->data['register_entities'][$prodkey], array_flip($deltas)));
          $update_order = TRUE;

          // No need to rebuild unless we triggered removal via AJAX.
          if ($triggered) {
            $form_state['rebuild'] = TRUE;
          }
        }
      }
    }

    // Delete all the registrations at once.
    if ($registrations_to_delete) {
      registration_delete_multiple($registrations_to_delete);
    }

    // Update an existing order.
    if ($update_order && $order && $order->order_id) {
      try {
        commerce_order_save($order);
      } catch (Exception $e) {
        watchdog('commerce_registration', 'Error when trying to save an order (@order_id) after deleting registration(s).', array(
          '@order_id' => $order->order_id,
        ), WATCHDOG_ERROR);
      }
    }

    // We want to rebuild if this is an ajax submit.
    if ($update_order && $triggered) {
      $form_state['rebuild'] = TRUE;
    }
  }
}