You are here

function tmgmt_ui_cart_request_translation_form_submit in Translation Management Tool 7

Custom form submit callback for tmgmt_ui_cart_cart_form().

Related topics

1 string reference to 'tmgmt_ui_cart_request_translation_form_submit'
tmgmt_ui_cart_content in ui/includes/tmgmt_ui.pages.inc
Form constructor for cart form.

File

ui/includes/tmgmt_ui.pages.inc, line 962
Provides page callbacks and form functions for the Translation Management Tool User Interface module.

Code

function tmgmt_ui_cart_request_translation_form_submit($form, &$form_state) {
  global $user;
  $target_languages = array_filter($form_state['values']['target_language']);
  $enforced_source_language = NULL;
  if ($form_state['values']['enforced_source_language']) {
    $enforced_source_language = $form_state['values']['source_language'];
  }
  $skipped_count = 0;
  $job_items_by_source_language = array();

  // Group the selected items by source language.
  foreach (tmgmt_job_item_load_multiple(array_filter($form_state['values']['items'])) as $job_item) {
    $source_language = $enforced_source_language ? $enforced_source_language : $job_item
      ->getSourceLangCode();
    if (in_array($source_language, $job_item
      ->getExistingLangCodes())) {
      $job_items_by_source_language[$source_language][$job_item->tjiid] = $job_item;
    }
    else {
      $skipped_count++;
    }
  }
  $jobs = array();
  $remove_job_item_ids = array();

  // Loop over all target languages, create a job for each source and target
  // language combination add add the relevant job items to it.
  foreach ($target_languages as $target_language) {
    foreach ($job_items_by_source_language as $source_language => $job_items) {

      // Skip in case the source language is the same as the target language.
      if ($source_language == $target_language) {
        continue;
      }
      $job = tmgmt_job_create($source_language, $target_language, $user->uid);
      $job_empty = TRUE;

      /** @var TMGMTJobItem $job_item */
      foreach ($job_items as $id => $job_item) {
        try {

          // As the same item might be added to multiple jobs, we need to
          // re-create them and delete the old ones, after removing them from
          // the cart.
          $job
            ->addItem($job_item->plugin, $job_item->item_type, $job_item->item_id);
          $remove_job_item_ids[$job_item->tjiid] = $job_item->tjiid;
          $job_empty = FALSE;
        } catch (Exception $e) {

          // If an item fails for one target language, then it is also going
          // to fail for others, so remove it from the array.
          unset($job_items_by_source_language[$source_language][$id]);
          drupal_set_message($e
            ->getMessage(), 'error');
        }
      }
      if (!$job_empty) {
        $jobs[] = $job;
      }
    }
  }

  // Remove job items from the cart.
  if ($remove_job_item_ids) {
    tmgmt_ui_cart_get()
      ->removeJobItems($remove_job_item_ids);
    entity_delete_multiple('tmgmt_job_item', $remove_job_item_ids);
  }

  // Start the checkout process if any jobs were created.
  if ($jobs) {
    if ($enforced_source_language) {
      if ($skipped_count) {
        $languages = language_list();
        drupal_set_message(format_plural($skipped_count, 'One item skipped. @language translation unavailable.', '@count items skipped. @language translation unavailable.', array(
          '@language' => $languages[$enforced_source_language]->name,
        )), 'warning');
      }
    }
    tmgmt_ui_job_checkout_and_redirect($form_state, $jobs);
  }
  else {
    drupal_set_message(t('It is not possible to create a translation job from the selection you made.'), 'error');
  }
}