config_entity_revisions.module in Config Entity Revisions 8.2
Config entity revisions procedural hooks.
File
config_entity_revisions.moduleView source
<?php
/**
* @file
* Config entity revisions procedural hooks.
*/
use Drupal\config_entity_revisions\ConfigEntityRevisionsConfigEntityInterface;
use Drupal\Core\Entity\EntityInterface;
use Drupal\Core\Session\AccountInterface;
use Drupal\Core\Access\AccessResult;
use Drupal\Core\Entity\EntityPublishedInterface;
use Drupal\config_entity_revisions\Entity\Handler\ConfigEntityRevisionsRevisionStorageHandler;
/**
* Implements hook_entity_access().
*
* Overrides content_moderation_entity_access, providing a version that handles
* configuration entities with revisions as well.
*
* Entities should be viewable if unpublished and the user has the appropriate
* permission. This permission is therefore effectively mandatory for any user
* that wants to moderate things.
*/
function config_entity_revisions_entity_access(EntityInterface $entity, $operation, AccountInterface $account) {
/** @var \Drupal\content_moderation\ModerationInformationInterface $moderation_info */
$moderation_info = Drupal::service('content_moderation.moderation_information');
$access_result = NULL;
if ($operation === 'view') {
$access_result = $entity instanceof EntityPublishedInterface && !$entity
->isPublished() ? AccessResult::allowedIfHasPermission($account, 'view any unpublished content') : AccessResult::neutral();
$access_result
->addCacheableDependency($entity);
}
elseif ($operation === 'update' && $moderation_info
->isModeratedEntity($entity) && $entity->moderation_state) {
/** @var \Drupal\content_moderation\StateTransitionValidation $transition_validation */
$transition_validation = \Drupal::service('content_moderation.state_transition_validation');
if ($entity instanceof ConfigEntityRevisionsConfigEntityInterface) {
$entity = $entity
->getContentEntity();
}
$valid_transition_targets = $transition_validation
->getValidTransitions($entity, $account);
$access_result = $valid_transition_targets ? AccessResult::neutral() : AccessResult::forbidden('No valid transitions exist for given account.');
$access_result
->addCacheableDependency($entity);
$access_result
->addCacheableDependency($account);
$workflow = $moderation_info
->getWorkflowForEntity($entity);
$access_result
->addCacheableDependency($workflow);
foreach ($valid_transition_targets as $valid_transition_target) {
$access_result
->addCacheableDependency($valid_transition_target);
}
}
return $access_result;
}
/**
* Implements hook_module_implements_alter().
*
* Remove the content moderation hook, which will choke on a config entity. We
* implement a more generic version above.
*/
function config_entity_revisions_module_implements_alter(&$implementations, $hook) {
if ($hook !== 'entity_access') {
return;
}
unset($implementations['content_moderation']);
}
/**
* Implements hook_entity_delete().
*/
function config_entity_revisions_entity_delete(EntityInterface $entity) {
if (!$entity instanceof ConfigEntityRevisionsConfigEntityInterface) {
return;
}
$controller = ConfigEntityRevisionsRevisionStorageHandler::createInstance(\Drupal::getContainer(), $entity
->getContentEntity()
->getEntityType());
$controller
->deleteRevisions($entity);
}
Functions
Name | Description |
---|---|
config_entity_revisions_entity_access | Implements hook_entity_access(). |
config_entity_revisions_entity_delete | Implements hook_entity_delete(). |
config_entity_revisions_module_implements_alter | Implements hook_module_implements_alter(). |