예제 #1
0
 /**
  * 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.'));
     }
 }
예제 #2
0
 /**
  * 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."));
 }