/** * Custom form submit callback for tmgmt_cart_cart_form(). */ function submitRequestTranslation(array $form, FormStateInterface $form_state) { $target_languages = array_filter($form_state->getValue('target_language')); $enforced_source_language = NULL; if ($form_state->getValue('enforced_source_language')) { $enforced_source_language = $form_state->getValue('source_language'); } $skipped_count = 0; $job_items_by_source_language = array(); // Group the selected items by source language. foreach (JobItem::loadMultiple(array_filter($form_state->getValue('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->id()] = $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, $this->currentUser()->id()); $job_empty = TRUE; /** @var \Drupal\tmgmt\JobItemInterface $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->getPlugin(), $job_item->getItemType(), $job_item->getItemId()); $remove_job_item_ids[$job_item->id()] = $job_item->id(); $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_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) { drupal_set_message(t('You have enforced the job source language which most likely resulted in having a translation of your original content as the job source text. You should review the job translation received from the translator carefully to prevent the content quality loss.'), 'warning'); if ($skipped_count) { $languages = \Drupal::languageManager()->getLanguages(); drupal_set_message(\Drupal::translation()->formatPlural($skipped_count, 'One item skipped as for the language @language it was not possible to retrieve a translation.', '@count items skipped as for the language @language it was not possible to retrieve a translations.', array('@language' => $languages[$enforced_source_language]->getName()))); } } tmgmt_job_checkout_and_redirect($form_state, $jobs); } else { drupal_set_message(t('From the selection you made it was not possible to create any translation job.')); } }
/** * Test the cart functionality. */ function testCart() { $this->addLanguage('fr'); $job_items = array(); // Create a few job items and add them to the cart. for ($i = 1; $i < 6; $i++) { $job_item = tmgmt_job_item_create('test_source', 'test', $i); $job_item->save(); $job_items[$i] = $job_item; } $this->loginAsTranslator(); foreach ($job_items as $job_item) { $this->drupalGet('tmgmt-add-to-cart/' . $job_item->id()); } // Check if the items are displayed in the cart. $this->drupalGet('admin/tmgmt/cart'); foreach ($job_items as $job_item) { $this->assertText($job_item->label()); } // Test the remove items from cart functionality. $this->drupalPostForm(NULL, ['items[1]' => TRUE, 'items[2]' => FALSE, 'items[3]' => FALSE, 'items[4]' => TRUE, 'items[5]' => FALSE], t('Remove selected')); $this->assertText($job_items[2]->label()); $this->assertText($job_items[3]->label()); $this->assertText($job_items[5]->label()); $this->assertNoText($job_items[1]->label()); $this->assertNoText($job_items[4]->label()); $this->assertText(t('Job items were removed from the cart.')); // Test that removed job items from cart were deleted as well. $existing_items = JobItem::loadMultiple(); $this->assertTrue(!isset($existing_items[$job_items[1]->id()])); $this->assertTrue(!isset($existing_items[$job_items[4]->id()])); $this->drupalPostForm(NULL, array(), t('Empty cart')); $this->assertNoText($job_items[2]->label()); $this->assertNoText($job_items[3]->label()); $this->assertNoText($job_items[5]->label()); $this->assertText(t('All job items were removed from the cart.')); // No remaining job items. $existing_items = JobItem::loadMultiple(); $this->assertTrue(empty($existing_items)); $language_sequence = array('en', 'en', 'fr', 'fr', 'de', 'de'); for ($i = 1; $i < 7; $i++) { $job_item = tmgmt_job_item_create('test_source', 'test', $i); $job_item->save(); $job_items[$i] = $job_item; $languages[$job_items[$i]->id()] = $language_sequence[$i - 1]; } \Drupal::state()->set('tmgmt.test_source_languages', $languages); foreach ($job_items as $job_item) { $this->drupalGet('tmgmt-add-to-cart/' . $job_item->id()); } $this->drupalPostForm('admin/tmgmt/cart', array('items[' . $job_items[1]->id() . ']' => TRUE, 'items[' . $job_items[2]->id() . ']' => TRUE, 'items[' . $job_items[3]->id() . ']' => TRUE, 'items[' . $job_items[4]->id() . ']' => TRUE, 'items[' . $job_items[5]->id() . ']' => TRUE, 'items[' . $job_items[6]->id() . ']' => FALSE, 'target_language[]' => array('en', 'de')), t('Request translation')); $this->assertText(t('@count jobs need to be checked out.', array('@count' => 4))); // We should have four jobs with following language combinations: // [fr, fr] => [en] // [de] => [en] // [en, en] => [de] // [fr, fr] => [de] $jobs = entity_load_multiple_by_properties('tmgmt_job', array('source_language' => 'fr', 'target_language' => 'en')); $job = reset($jobs); $this->assertEqual(count($job->getItems()), 2); $jobs = entity_load_multiple_by_properties('tmgmt_job', array('source_language' => 'de', 'target_language' => 'en')); $job = reset($jobs); $this->assertEqual(count($job->getItems()), 1); $jobs = entity_load_multiple_by_properties('tmgmt_job', array('source_language' => 'en', 'target_language' => 'de')); $job = reset($jobs); $this->assertEqual(count($job->getItems()), 2); $jobs = entity_load_multiple_by_properties('tmgmt_job', array('source_language' => 'fr', 'target_language' => 'de')); $job = reset($jobs); $this->assertEqual(count($job->getItems()), 2); $this->drupalGet('admin/tmgmt/cart'); // Both fr and one de items must be gone. $this->assertNoText($job_items[1]->label()); $this->assertNoText($job_items[2]->label()); $this->assertNoText($job_items[3]->label()); $this->assertNoText($job_items[4]->label()); $this->assertNoText($job_items[5]->label()); // One de item is in the cart as it was not selected for checkout. $this->assertText($job_items[6]->label()); // Check to see if no items are selected and the error message pops up. $this->drupalPostForm('admin/tmgmt/cart', ['items[' . $job_items[6]->id() . ']' => FALSE], t('Request translation')); $this->assertUniqueText(t("You didn't select any source items.")); }