You are here

function commerce_registration_line_item_control_save in Commerce Registration 7.2

Submit callback for an embedded registration form within the order ui.

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

File

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

Code

function commerce_registration_line_item_control_save($form, &$form_state) {
  if (isset($form['commerce_registration']['line_item_registrations'])) {
    $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']);
      if ($triggered = (bool) ($trigger_parents[0] === 'registration_control_submit')) {
        $triggering_line_item_id = $trigger_parents[4];
      }
    }

    // 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 (!$triggered || $triggering_line_item_id == $line_item_id) {
        if (isset($form['commerce_registration']['line_item_registrations'][$line_item_id]['registration_control']['form']) && isset($form_state['line_item_registration_add'][$line_item_id])) {

          // 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
            // kept up-to-date.
            $order = $form_state['commerce_order'];
          }

          // Back up the any existing redirection found in $form_state.
          $redirect = FALSE;
          if (isset($form_state['redirect'])) {
            $redirect = $form_state['redirect'];
          }
          $registration = $form_state['line_item_registration_add'][$line_item_id];

          // If the order id is known, set the order_id on the registraton.
          if ($order->order_id) {
            $registration->order_id = $order->order_id;
          }

          // The registration module expects only one registration form so we
          // fake it.
          $form_state['registration'] = $registration;
          registration_form_submit($form['commerce_registration']['line_item_registrations'][$line_item_id]['registration_control']['form'], $form_state);
          unset($form_state['registration']);

          // Don't redirect to the usual places registration wants to.
          if ($redirect) {
            $form_state['redirect'] = $redirect;
          }
          else {
            unset($form_state['redirect']);
          }

          // Now add data to the order so we can track this registration.
          $prodkey = $form['commerce_registration']['line_item_registrations'][$line_item_id]['registrations']['#prodkey'];
          $order->data['register_entities'][$prodkey][] = $registration;

          // Save the order.
          $update_order = TRUE;
        }
      }
    }

    // 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 adding new 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;
    }

    // Ensure the attached registrations are associated with the order if they
    // do not have an order_id set yet. This may seem redundant, but in the case
    // a new order is being submitted and we have added registrations via AJAX
    // then they will not have their order_id set yet.
    if (!$order) {
      $order = $form_state['commerce_order'];
    }
    if ($order->order_id && isset($order->data['register_entities'])) {
      foreach ($order->data['register_entities'] as $registrations) {
        foreach ($registrations as $registration) {
          if (!isset($registration->order_id) || !$registration->order_id) {
            $registration->order_id = $order->order_id;
            registration_save($registration);
          }
        }
      }
    }
  }
}