View source
<?php
namespace Drupal\lingotek\Moderation;
use Drupal\content_moderation\ContentModerationState;
use Drupal\Core\Entity\EntityTypeBundleInfoInterface;
use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\Core\Extension\ModuleHandlerInterface;
use Drupal\Core\Routing\UrlGeneratorInterface;
use Drupal\Core\StringTranslation\StringTranslationTrait;
use Drupal\workflows\WorkflowInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
class LingotekContentModerationSettingsForm implements LingotekModerationSettingsFormInterface {
use StringTranslationTrait;
use LingotekContentModerationCheckTrait;
protected $entityTypeManager;
protected $moderationConfiguration;
protected $moderationInfo;
protected $entityTypeBundleInfo;
protected $urlGenerator;
public function __construct(ModuleHandlerInterface $module_handler, EntityTypeManagerInterface $entity_type_manager, LingotekModerationConfigurationServiceInterface $moderation_configuration, EntityTypeBundleInfoInterface $entity_type_bundle_info, ContainerInterface $container, UrlGeneratorInterface $url_generator) {
$this
->setModuleHandler($module_handler);
$this->entityTypeManager = $entity_type_manager;
$this->moderationConfiguration = $moderation_configuration;
$this->entityTypeBundleInfo = $entity_type_bundle_info;
if ($container
->has('content_moderation.moderation_information')) {
$this->moderationInfo = $container
->get('content_moderation.moderation_information');
}
$this->urlGenerator = $url_generator;
}
public function getColumnHeader() {
return $this
->t('Content moderation');
}
public function needsColumn($entity_type_id) {
$entity_type_definition = $this->entityTypeManager
->getDefinition($entity_type_id);
return $this->moduleHandler
->moduleExists('content_moderation') && ($this->moderationInfo !== NULL && $this->moderationInfo
->canModerateEntitiesOfEntityType($entity_type_definition));
}
protected function getWorkflow($entity_type_id, $bundle) {
$bundles = $this->entityTypeBundleInfo
->getBundleInfo($entity_type_id);
$workflow = NULL;
if (isset($bundles[$bundle]['workflow'])) {
$workflow = $this->entityTypeManager
->getStorage('workflow')
->load($bundles[$bundle]['workflow']);
}
return $workflow;
}
public function getModerationUploadStatuses($entity_type_id, $bundle) {
$workflow = $this
->getWorkflow($entity_type_id, $bundle);
$values = [];
if ($workflow) {
$states = $workflow
->getTypePlugin()
->getStates();
foreach ($states as $state_id => $state) {
$values[$state_id] = $state
->label();
}
}
return $values;
}
protected function getWorkflowStates(WorkflowInterface $workflow) {
return $workflow
->getTypePlugin()
->getStates();
}
protected function getWorkflowTransitions(WorkflowInterface $workflow) {
return $workflow
->getTypePlugin()
->getTransitions();
}
protected function getWorkflowTransitionsForState(WorkflowInterface $workflow, $state) {
return $workflow
->getTypePlugin()
->getTransitionsForState($state);
}
public function getDefaultModerationUploadStatus($entity_type_id, $bundle) {
$status = $this->moderationConfiguration
->getUploadStatus($entity_type_id, $bundle);
if (!$status) {
$workflow = $this
->getWorkflow($entity_type_id, $bundle);
$states = $workflow
->getTypePlugin()
->getStates();
$published_statuses = array_filter($states, function (ContentModerationState $state) {
return $state
->isPublishedState();
});
if (count($published_statuses) > 0) {
$status = reset($published_statuses)
->id();
}
}
return $status;
}
public function getModerationDownloadTransitions($entity_type_id, $bundle) {
$workflow = $this
->getWorkflow($entity_type_id, $bundle);
$transitions = $workflow
->getTypePlugin()
->getTransitions();
$values = [];
foreach ($transitions as $transition_id => $transition) {
$values[$transition_id] = $transition
->label();
}
return $values;
}
public function getDefaultModerationDownloadTransition($entity_type_id, $bundle) {
$transition = $this->moderationConfiguration
->getDownloadTransition($entity_type_id, $bundle);
if (!$transition) {
$workflow = $this
->getWorkflow($entity_type_id, $bundle);
$transitions = $workflow
->getTypePlugin()
->getTransitionsForState($this
->getDefaultModerationUploadStatus($entity_type_id, $bundle));
if (count($transitions) > 0) {
foreach ($transitions as $transition_id => $potential_transition) {
$toState = $potential_transition
->to();
if ($toState
->isPublishedState()) {
$transition = $transition_id;
break;
}
}
}
}
return $transition;
}
public function form($entity_type_id, $bundle) {
$entity_type_definition = $this->entityTypeManager
->getDefinition($entity_type_id);
$form = [];
if ($this->moderationInfo
->shouldModerateEntitiesOfBundle($entity_type_definition, $bundle)) {
$statuses = $this
->getModerationUploadStatuses($entity_type_id, $bundle);
$default_status = $this
->getDefaultModerationUploadStatus($entity_type_id, $bundle);
$transitions = $this
->getModerationDownloadTransitions($entity_type_id, $bundle);
$default_transition = $this
->getDefaultModerationDownloadTransition($entity_type_id, $bundle);
$form['upload_status'] = [
'#type' => 'select',
'#options' => $statuses,
'#default_value' => $default_status,
'#title' => $this
->t('In which status needs to be uploaded?'),
];
$form['download_transition'] = [
'#type' => 'select',
'#options' => $transitions,
'#default_value' => $default_transition,
'#title' => $this
->t('Which transition should be executed after download?'),
];
}
elseif ($this->moderationInfo
->canModerateEntitiesOfEntityType($entity_type_definition)) {
$form = [
'#markup' => $this
->t('This entity bundle is not enabled for moderation with content_moderation. You can change its settings <a href=":moderation">here</a>.', [
':moderation' => $this->urlGenerator
->generateFromRoute("entity.workflow.collection"),
]),
];
}
return $form;
}
public function submitHandler($entity_type_id, $bundle, array $form_values) {
if (isset($form_values['moderation'])) {
$upload_status = $form_values['moderation']['upload_status'];
$download_transition = $form_values['moderation']['download_transition'];
$this->moderationConfiguration
->setUploadStatus($entity_type_id, $bundle, $upload_status);
$this->moderationConfiguration
->setDownloadTransition($entity_type_id, $bundle, $download_transition);
}
}
protected function getContentModerationConfigurationLink($bundle, $bundle_type_id) {
return $this->urlGenerator
->generateFromRoute("entity.workflow.collection");
}
}