content_moderation_permissions-1.0.0/content_moderation_permissions.module
content_moderation_permissions.module
<?php
/**
* @file
* Primary module hooks for Content moderation permissions module.
*/
use Drupal\Core\Entity\EntityTypeInterface;
use Drupal\Core\Entity\EntityInterface;
use Drupal\Core\Session\AccountInterface;
use Drupal\Core\Access\AccessResult;
use Drupal\Core\Routing\RouteMatchInterface;
/**
* Implements hook_help().
*/
function content_moderation_permissions_help($route_name, RouteMatchInterface $route_match) {
switch ($route_name) {
case 'help.page.content_moderation_permissions':
$text = file_get_contents(dirname(__FILE__) . "/README.md");
if (!\Drupal::moduleHandler()->moduleExists('markdown')) {
return '<pre>' . $text . '</pre>';
}
else {
// Use the Markdown filter to render the README.
$filter_manager = \Drupal::service('plugin.manager.filter');
$settings = \Drupal::configFactory()
->get('markdown.settings')
->getRawData();
$config = ['settings' => $settings];
$filter = $filter_manager->createInstance('markdown', $config);
return $filter->process($text, 'en');
}
}
return NULL;
}
/**
* Implements hook_entity_access().
*
* 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 content_moderation_permissions_entity_access(EntityInterface $entity, $operation, AccountInterface $account) {
$access_result = NULL;
if ($operation === 'update') {
/** @var \Drupal\content_moderation\ModerationInformationInterface $moderation_info */
$moderation_info = Drupal::service('content_moderation.moderation_information');
if ($moderation_info->isModeratedEntity($entity) && $entity->moderation_state) {
/** @var \Drupal\content_moderation_permissions\StateTransitionValidation $transition_validation */
$transition_validation = \Drupal::service('content_moderation_permissions.state_transition_validation');
$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);
$workflow = $moderation_info->getWorkflowForEntity($entity);
$access_result->addCacheableDependency($workflow);
// The state transition validation service returns a list of transitions
// based on the user's permission to use them.
$access_result->cachePerPermissions();
}
}
return $access_result;
}
/**
* Implements hook_entity_bundle_field_info_alter().
*/
function content_moderation_permissions_entity_bundle_field_info_alter(&$fields, EntityTypeInterface $entity_type, $bundle) {
if (isset($fields['moderation_state'])) {
$fields['moderation_state']->setConstraints(['ModerationStatePermissions' => []]);
}
}
