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