diff --git a/modules/entity_workflow_content/src/Plugin/WorkflowType/EntityWorkflowContent.php b/modules/entity_workflow_content/src/Plugin/WorkflowType/EntityWorkflowContent.php index 40cba9e62cfc00f2b9af6732da53dc98feeb561c..69af408cbdf365e23bc7e65cae8d5041991e6c78 100644 --- a/modules/entity_workflow_content/src/Plugin/WorkflowType/EntityWorkflowContent.php +++ b/modules/entity_workflow_content/src/Plugin/WorkflowType/EntityWorkflowContent.php @@ -4,12 +4,15 @@ namespace Drupal\entity_workflow_content\Plugin\WorkflowType; use Drupal\Core\Cache\Cache; use Drupal\Core\Entity\ContentEntityInterface; +use Drupal\Core\Entity\EntityInterface; use Drupal\Core\Entity\EntityTypeInterface; use Drupal\entity_workflow\WorkflowType\EntityWorkflowTypeBase; use Drupal\menu_link_content\Entity\MenuLinkContent; use Drupal\path_alias\Entity\PathAlias; use Drupal\workflows\TransitionInterface; use Drupal\workflows\WorkflowInterface; +use Drupal\workspaces\WorkspaceAssociationInterface; +use Symfony\Component\DependencyInjection\ContainerInterface; /** * @WorkflowType( @@ -28,6 +31,20 @@ use Drupal\workflows\WorkflowInterface; */ class EntityWorkflowContent extends EntityWorkflowTypeBase { + /** + * The workspace association. + */ + protected WorkspaceAssociationInterface $workspaceAssociation; + + /** + * {@inheritdoc} + */ + public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) { + $instance = parent::create($container, $configuration, $plugin_id, $plugin_definition); + $instance->workspaceAssociation = $container->get('workspaces.association'); + return $instance; + } + /** * {@inheritdoc} */ @@ -152,19 +169,33 @@ class EntityWorkflowContent extends EntityWorkflowTypeBase { // for nodes, etc. $related_entities = []; - // Add the entity's path alias. - foreach ($entity->getFieldDefinitions() as $field => $field_definition) { - if ($field_definition->getType() === 'path' && ($path_alias_id = $entity->get($field)->get(0)->pid)) { - $related_entities[] = PathAlias::load($path_alias_id); - } + // Add the entity's path aliases. + if ($entity->hasLinkTemplate('canonical') && $this->entityTypeManager->hasDefinition('path_alias')) { + $path = $entity->toUrl('canonical', ['path_processing' => FALSE])->toString(); + $aliases = $this->entityTypeManager + ->getStorage('path_alias') + ->loadByProperties(['path' => $path]); + + $related_entities = array_merge($related_entities, $aliases); + } + + // Add the menu links for nodes. + if ($entity->getEntityTypeId() === 'node' && $this->entityTypeManager->hasDefinition('menu_link_content')) { + $menu_links = $this->entityTypeManager + ->getStorage('menu_link_content') + ->loadByProperties(['link.uri' => 'entity:node/' . $entity->id()]); + + $related_entities = array_merge($related_entities, $menu_links); } - // Add the menu link for nodes. - if ($entity->getEntityTypeId() === 'node') { - $menu_defaults = menu_ui_get_menu_link_defaults($entity); - if ($menu_link_id = $menu_defaults['entity_id']) { - $related_entities[] = MenuLinkContent::load($menu_link_id); - } + // Ensure that we only auto-transition related entities that are already + // tracked by the current workspace. + if ($workspace = $this->workspaceManager->getActiveWorkspace()) { + $tracked_entities = $this->workspaceAssociation->getTrackedEntities($workspace->id()); + $related_entities = array_filter($related_entities, function(EntityInterface $entity) use ($tracked_entities) { + return isset($tracked_entities[$entity->getEntityTypeId()]) + && in_array($entity->id(), $tracked_entities[$entity->getEntityTypeId()]); + }); } foreach ($related_entities as $entity) {