3 namespace Drupal\content_moderation\Plugin\Derivative;
5 use Drupal\Component\Plugin\Derivative\DeriverBase;
6 use Drupal\content_moderation\ModerationInformationInterface;
7 use Drupal\Core\Entity\EntityTypeInterface;
8 use Drupal\Core\Entity\EntityTypeManagerInterface;
9 use Drupal\Core\Plugin\Discovery\ContainerDeriverInterface;
10 use Drupal\Core\StringTranslation\StringTranslationTrait;
11 use Drupal\Core\StringTranslation\TranslationInterface;
12 use Symfony\Component\DependencyInjection\ContainerInterface;
15 * Generates moderation-related local tasks.
17 class DynamicLocalTasks extends DeriverBase implements ContainerDeriverInterface {
19 use StringTranslationTrait;
26 protected $basePluginId;
29 * The entity type manager.
31 * @var \Drupal\Core\Entity\EntityTypeManagerInterface
33 protected $entityTypeManager;
36 * The moderation information service.
38 * @var \Drupal\content_moderation\ModerationInformationInterface
40 protected $moderationInfo;
43 * Creates an FieldUiLocalTask object.
45 * @param string $base_plugin_id
47 * @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager
48 * The entity type manager.
49 * @param \Drupal\Core\StringTranslation\TranslationInterface $string_translation
50 * The translation manager.
51 * @param \Drupal\content_moderation\ModerationInformationInterface $moderation_information
52 * The moderation information service.
54 public function __construct($base_plugin_id, EntityTypeManagerInterface $entity_type_manager, TranslationInterface $string_translation, ModerationInformationInterface $moderation_information) {
55 $this->entityTypeManager = $entity_type_manager;
56 $this->stringTranslation = $string_translation;
57 $this->basePluginId = $base_plugin_id;
58 $this->moderationInfo = $moderation_information;
64 public static function create(ContainerInterface $container, $base_plugin_id) {
67 $container->get('entity_type.manager'),
68 $container->get('string_translation'),
69 $container->get('content_moderation.moderation_information')
76 public function getDerivativeDefinitions($base_plugin_definition) {
77 $this->derivatives = [];
79 foreach ($this->entityTypeManager->getDefinitions() as $entity_type_id => $entity_type) {
80 if ($this->moderationInfo->canModerateEntitiesOfEntityType($entity_type)) {
81 $bundle_id = $entity_type->getBundleEntityType();
82 $this->derivatives["$bundle_id.moderation_tab"] = [
83 'route_name' => "entity.$bundle_id.moderation",
84 'title' => $this->t('Manage moderation'),
85 // @todo - are we sure they all have an edit_form?
86 'base_route' => "entity.$bundle_id.edit_form",
88 ] + $base_plugin_definition;
92 $latest_version_entities = array_filter($this->entityTypeManager->getDefinitions(), function (EntityTypeInterface $type) {
93 return $this->moderationInfo->canModerateEntitiesOfEntityType($type) && $type->hasLinkTemplate('latest-version');
96 foreach ($latest_version_entities as $entity_type_id => $entity_type) {
97 $this->derivatives["$entity_type_id.latest_version_tab"] = [
98 'route_name' => "entity.$entity_type_id.latest_version",
99 'title' => $this->t('Latest version'),
100 'base_route' => "entity.$entity_type_id.canonical",
102 ] + $base_plugin_definition;
105 return $this->derivatives;