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();
}

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc