class WorkspacesHooks
Hook implementations for workspaces.
Hierarchy
- class \Drupal\workspaces\Hook\WorkspacesHooks uses \Drupal\Core\StringTranslation\StringTranslationTrait
Expanded class hierarchy of WorkspacesHooks
2 files declare their use of WorkspacesHooks
- Workspace.php in core/
modules/ workspaces/ src/ Entity/ Workspace.php - WorkspaceManager.php in core/
modules/ workspaces/ src/ WorkspaceManager.php
File
-
core/
modules/ workspaces/ src/ Hook/ WorkspacesHooks.php, line 24
Namespace
Drupal\workspaces\HookView source
class WorkspacesHooks {
use StringTranslationTrait;
public function __construct(protected WorkspaceManagerInterface $workspaceManager, protected WorkspaceTrackerInterface $workspaceTracker, protected WorkspaceInformationInterface $workspaceInfo, protected EntityTypeManagerInterface $entityTypeManager, protected StateInterface $state, protected EntityDefinitionUpdateManagerInterface $entityDefinitionUpdateManager, protected CacheTagsInvalidatorInterface $cacheTagsInvalidator) {
}
/**
* Implements hook_help().
*/
public function help(string $route_name, RouteMatchInterface $route_match) : string {
$output = '';
switch ($route_name) {
// Main module help for the Workspaces module.
case 'help.page.workspaces':
$output = '';
$output .= '<h2>' . $this->t('About') . '</h2>';
$output .= '<p>' . $this->t('The Workspaces module allows workspaces to be defined and switched between. Content is then assigned to the active workspace when created. For more information, see the <a href=":workspaces">online documentation for the Workspaces module</a>.', [
':workspaces' => 'https://www.drupal.org/docs/8/core/modules/workspace/overview',
]) . '</p>';
break;
}
return $output;
}
/**
* Implements hook_module_preinstall().
*/
public function modulePreinstall(string $module) : void {
if ($module !== 'workspaces') {
return;
}
foreach ($this->entityDefinitionUpdateManager
->getEntityTypes() as $entity_type) {
if ($this->workspaceInfo
->isEntityTypeSupported($entity_type)) {
$entity_type->setRevisionMetadataKey('workspace', 'workspace');
$this->entityDefinitionUpdateManager
->updateEntityType($entity_type);
}
}
}
/**
* Implements hook_ENTITY_TYPE_update() for 'menu_link_content' entities.
*/
public function menuLinkContentUpdate(EntityInterface $entity) : void {
/** @var \Drupal\menu_link_content\MenuLinkContentInterface $entity */
if ($entity->getLoadedRevisionId() != $entity->getRevisionId()) {
// We are not updating the menu tree definitions when a custom menu link
// entity is saved as a pending revision (because the parent can not be
// changed), so we need to clear the system menu cache manually. However,
// inserting or deleting a custom menu link updates the menu tree
// definitions, so we don't have to do anything in those cases.
$cache_tags = Cache::buildTags('config:system.menu', [
$entity->getMenuName(),
], '.');
$this->cacheTagsInvalidator
->invalidateTags($cache_tags);
}
}
/**
* Implements hook_cron().
*
* @internal
*/
public function cron() : void {
$this->workspaceManager
->executeOutsideWorkspace(function () {
$deleted_workspace_ids = $this->state
->get('workspace.deleted', []);
// Bail out early if there are no workspaces to purge.
if (empty($deleted_workspace_ids)) {
return;
}
$batch_size = Settings::get('entity_update_batch_size', 50);
// Get the first deleted workspace from the list and delete the revisions
// associated with it, along with the workspace association records.
$workspace_id = reset($deleted_workspace_ids);
$all_associated_revisions = [];
foreach (array_keys($this->workspaceInfo
->getSupportedEntityTypes()) as $entity_type_id) {
$all_associated_revisions[$entity_type_id] = $this->workspaceTracker
->getAllTrackedRevisions($workspace_id, $entity_type_id);
}
$all_associated_revisions = array_filter($all_associated_revisions);
$count = 1;
foreach ($all_associated_revisions as $entity_type_id => $associated_revisions) {
/** @var \Drupal\Core\Entity\RevisionableStorageInterface $associated_entity_storage */
$associated_entity_storage = $this->entityTypeManager
->getStorage($entity_type_id);
// Sort the associated revisions in reverse ID order, so we can delete
// the most recent revisions first.
krsort($associated_revisions);
// Get a list of default revisions tracked by the given workspace,
// because they need to be handled differently than pending revisions.
$initial_revision_ids = $this->workspaceTracker
->getTrackedInitialRevisions($workspace_id, $entity_type_id);
foreach (array_keys($associated_revisions) as $revision_id) {
if ($count > $batch_size) {
continue 2;
}
// If the workspace is tracking the entity's default revision (i.e.
// the entity was created inside that workspace), we need to delete
// the whole entity after all of its pending revisions are gone.
if (isset($initial_revision_ids[$revision_id])) {
$associated_entity_storage->delete([
$associated_entity_storage->load($initial_revision_ids[$revision_id]),
]);
}
else {
// Delete the associated entity revision.
$associated_entity_storage->deleteRevision($revision_id);
}
$count++;
}
}
// The purging operation above might have taken a long time, so we need to
// request a fresh list of tracked entities. If it is empty, we can go
// ahead and remove the deleted workspace ID entry from state.
$has_associated_revisions = FALSE;
foreach (array_keys($this->workspaceInfo
->getSupportedEntityTypes()) as $entity_type_id) {
if (!empty($this->workspaceTracker
->getAllTrackedRevisions($workspace_id, $entity_type_id))) {
$has_associated_revisions = TRUE;
break;
}
}
if (!$has_associated_revisions) {
unset($deleted_workspace_ids[$workspace_id]);
$this->state
->set('workspace.deleted', $deleted_workspace_ids);
// Delete any possible leftover association entries.
$this->workspaceTracker
->deleteTrackedEntities($workspace_id);
}
});
}
}
Members
| Title Sort descending | Modifiers | Object type | Summary | Overrides |
|---|---|---|---|---|
| StringTranslationTrait::$stringTranslation | protected | property | The string translation service. | 3 |
| StringTranslationTrait::formatPlural | protected | function | Formats a string containing a count of items. | |
| StringTranslationTrait::getNumberOfPlurals | protected | function | Returns the number of plurals supported by a given language. | |
| StringTranslationTrait::getStringTranslation | protected | function | Gets the string translation service. | |
| StringTranslationTrait::setStringTranslation | public | function | Sets the string translation service to use. | 2 |
| StringTranslationTrait::t | protected | function | Translates a string to the current language or to a given language. | 1 |
| WorkspacesHooks::cron | public | function | Implements hook_cron(). | |
| WorkspacesHooks::help | public | function | Implements hook_help(). | |
| WorkspacesHooks::menuLinkContentUpdate | public | function | Implements hook_ENTITY_TYPE_update() for 'menu_link_content' entities. | |
| WorkspacesHooks::modulePreinstall | public | function | Implements hook_module_preinstall(). | |
| WorkspacesHooks::__construct | public | function |
Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.