View source
<?php
namespace Drupal\lingotek\Form;
use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\Core\Form\FormBase;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Messenger\MessengerInterface;
use Drupal\Core\Session\AccountInterface;
use Drupal\Core\TempStore\PrivateTempStoreFactory;
use Drupal\Core\Url;
use Drupal\lingotek\Exception\LingotekApiException;
use Drupal\lingotek\Exception\LingotekDocumentArchivedException;
use Drupal\lingotek\Exception\LingotekDocumentLockedException;
use Drupal\lingotek\Exception\LingotekDocumentNotFoundException;
use Drupal\lingotek\Exception\LingotekPaymentRequiredException;
use Drupal\lingotek\LingotekContentTranslationServiceInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
class LingotekJobAssignToMultipleEntitiesForm extends FormBase {
protected $currentUser;
protected $entityTypeManager;
protected $tempStore;
protected $messenger;
protected $translationService;
protected $selection = [];
public function __construct(AccountInterface $current_user, EntityTypeManagerInterface $entity_type_manager, PrivateTempStoreFactory $temp_store_factory, MessengerInterface $messenger, LingotekContentTranslationServiceInterface $translation_service) {
$this->currentUser = $current_user;
$this->entityTypeManager = $entity_type_manager;
$this->tempStore = $temp_store_factory
->get('lingotek_assign_job_entity_multiple_confirm');
$this->messenger = $messenger;
$this->translationService = $translation_service;
}
public static function create(ContainerInterface $container) {
return new static($container
->get('current_user'), $container
->get('entity_type.manager'), $container
->get('tempstore.private'), $container
->get('messenger'), $container
->get('lingotek.content_translation'));
}
public function getFormId() {
return 'lingotek.assign_job_entity_multiple_form';
}
public function buildForm(array $form, FormStateInterface $form_state) {
$this->selection = $this->tempStore
->get($this->currentUser
->id());
if (empty($this->selection)) {
$form_state
->setRedirectUrl(Url::fromUserInput('/' . $form_state
->getValue('destination')));
}
$entities = $this
->getSelectedEntities($this->selection);
$items = array_map(function ($entity) {
return $entity
->label();
}, $entities);
$form['job_id'] = [
'#type' => 'lingotek_job_id',
'#title' => $this
->t('Job ID'),
'#description' => $this
->t('Assign a job id that you can filter on later on the TMS or in this page.'),
];
$form['update_tms'] = [
'#type' => 'checkbox',
'#title' => $this
->t('Notify the Lingotek TMS'),
'#description' => $this
->t('Notify the Lingotek TMS (when applicable)'),
];
$form['entities'] = [
'#theme' => 'item_list',
'#title' => $this
->t('Affected content'),
'#items' => $items,
];
$form['actions']['submit'] = [
'#type' => 'submit',
'#value' => $this
->t('Assign Job ID'),
'#submit' => [
'::submitForm',
],
'#button_type' => 'primary',
];
$form['actions']['cancel'] = [
'#type' => 'submit',
'#value' => $this
->t('Cancel'),
'#submit' => [
'::cancelForm',
],
'#attributes' => [
'class' => [
'button',
],
],
];
return $form;
}
public function cancelForm(array &$form, FormStateInterface $form_state) {
$form_state
->setRedirectUrl(Url::fromUserInput('/' . $form_state
->getValue('destination')));
$this->tempStore
->delete($this->currentUser
->id());
}
public function submitForm(array &$form, FormStateInterface $form_state) {
$job_id = $form_state
->getValue('job_id');
$updateTMS = $form_state
->getValue('update_tms');
$entities = $this
->getSelectedEntities($this->selection);
$errors = FALSE;
foreach ($entities as $entity) {
try {
$this->translationService
->setJobId($entity, $job_id, $updateTMS);
} catch (LingotekDocumentNotFoundException $exception) {
$errors = TRUE;
$this->messenger
->addError(t('Document @entity_type %title was not found. Please upload again.', [
'@entity_type' => $entity
->getEntityTypeId(),
'%title' => $entity
->label(),
]));
} catch (LingotekPaymentRequiredException $exception) {
$errors = TRUE;
$this
->messenger()
->addError(t('Community has been disabled. Please contact support@lingotek.com to re-enable your community.'));
} catch (LingotekDocumentArchivedException $exception) {
$errors = TRUE;
$this
->messenger()
->addError(t('Document @entity_type %title has been archived. Please upload again.', [
'@entity_type' => $entity
->getEntityTypeId(),
'%title' => $entity
->label(),
]));
} catch (LingotekDocumentLockedException $exception) {
$errors = TRUE;
$this
->messenger()
->addError(t('Document @entity_type %title has a new version. The document id has been updated for all future interactions. Please try again.', [
'@entity_type' => $entity
->getEntityTypeId(),
'%title' => $entity
->label(),
]));
} catch (LingotekApiException $exception) {
$errors = TRUE;
$this
->messenger()
->addError(t('The Job ID change submission for @entity_type %title failed. Please try again.', [
'@entity_type' => $entity
->getEntityTypeId(),
'%title' => $entity
->label(),
]));
}
}
$form_state
->setRedirectUrl(Url::fromUserInput('/' . $form_state
->getValue('destination')));
if (!$errors) {
$this
->postStatusMessage();
}
else {
$this->messenger
->addWarning($this
->t('Job ID for some content failed to sync to the TMS.'));
}
$this->tempStore
->delete($this->currentUser
->id());
}
protected function postStatusMessage() {
$this->messenger
->addStatus($this
->t('Job ID was assigned successfully.'));
}
protected function getSelectedEntities($selection) {
$entities = [];
foreach ($selection as $entity_type_id => $ids) {
$list = $this->entityTypeManager
->getStorage($entity_type_id)
->loadMultiple(array_keys($ids));
foreach ($list as $id => $entity) {
$key = $entity_type_id . ':' . $id;
$entities[$key] = $entity;
}
}
return $entities;
}
}