domain_entity-8.x-1.0-beta1/modules/domain_menu_access/domain_menu_access.module
modules/domain_menu_access/domain_menu_access.module
<?php
/**
* @file
* Domain-based access control for menu link.
*/
use Drupal\Core\Access\AccessResult;
use Drupal\Core\Field\FieldDefinitionInterface;
use Drupal\Core\Field\FieldItemListInterface;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Plugin\PluginBase;
use Drupal\Core\Session\AccountInterface;
use Drupal\domain_entity\DomainEntityMapper;
use Drupal\domain_menu_access\Plugin\Block\DomainMenuAccessMenuBlock;
use Drupal\field\Entity\FieldConfig;
use Drupal\menu_link_content\MenuLinkContentInterface;
use Drupal\system\Entity\Menu;
/**
* Implements hook_form_BASE_FORM_ID_alter() for \Drupal\menu_link_content\MenuLinkContentForm.
*
* Move Domain Access fields to an advanced tab like other node settings.
*/
function domain_menu_access_form_menu_link_content_form_alter(&$form, FormStateInterface $form_state, $form_id) {
/** @var \Drupal\menu_link_content\Form\MenuLinkContentForm $form_object */
$form_object = $form_state->getFormObject();
/** @var \Drupal\menu_link_content\Entity\MenuLinkContent $entity */
$entity = $form_object->getEntity();
/** @var \Drupal\system\MenuInterface $menu */
$form['domain'] = [
'#type' => 'details',
'#title' => t('Domain'),
'#open' => TRUE,
'#weight' => 25,
];
$form['domain']['#access'] = FALSE;
$form[DomainEntityMapper::FIELD_NAME]['#group'] = 'domain';
$menu = Menu::load($entity->getMenuName());
if ($menu->getThirdPartySetting('domain_menu_access', 'access_enabled')) {
$form['domain']['#access'] = TRUE;
}
}
/**
* Implements hook_block_alter().
*/
function domain_menu_access_block_alter(&$definitions) {
// Check field storage and field definitions.
$field = FieldConfig::loadByName('menu_link_content', 'menu_link_content', DomainEntityMapper::FIELD_NAME);
if ($field) {
foreach ($definitions as $id => $definition) {
if (strpos($id, 'system_menu_block:') === 0) {
$derivative_id = NULL;
if (strpos($id, PluginBase::DERIVATIVE_SEPARATOR)) {
[, $derivative_id] = explode(PluginBase::DERIVATIVE_SEPARATOR, $id, 2);
}
if ($derivative_id) {
/** @var \Drupal\system\MenuInterface $menu */
$menu = Menu::load($derivative_id);
if ($menu->getThirdPartySetting('domain_menu_access', 'access_enabled')) {
$definitions[$id]['id'] = 'domain_access_menu_block';
$definitions[$id]['class'] = DomainMenuAccessMenuBlock::class;
$definitions[$id]['provider'] = 'domain_menu_access';
}
}
}
}
}
}
/**
* Implements hook_entity_field_access().
*/
function domain_menu_access_entity_field_access($operation, FieldDefinitionInterface $field_definition, AccountInterface $account, FieldItemListInterface $items = NULL) {
if (isset($items)) {
// The entity the field is attached to.
$entity = $items->getEntity();
}
else {
return AccessResult::neutral();
}
// Hide the domain access fields from the entity add/edit forms
// when the user cannot access them.
if ($operation != 'edit' || !($entity instanceof MenuLinkContentInterface)) {
return AccessResult::neutral();
}
if ($field_definition->getName() == DOMAIN_ACCESS_FIELD) {
$access = AccessResult::allowedIfHasPermissions($account, [
'publish to any domain',
'publish to any assigned domain',
], 'OR');
}
// Check permissions on the All Affiliates field.
elseif ($field_definition->getName() == DOMAIN_ACCESS_ALL_FIELD) {
// Treat any other entity as content.
$access = AccessResult::allowedIfHasPermission($account,
'publish to any domain'
);
}
else {
return AccessResult::neutral();
}
if ($access->isAllowed()) {
return $access;
}
return AccessResult::forbidden();
}
