localgov_microsites_group-4.1.0/localgov_microsites_group.module

localgov_microsites_group.module
<?php

/**
 * @file
 * Primary module hooks for LocalGov Microsites Group module.
 */

use Drupal\Component\Serialization\Yaml;
use Drupal\Core\Cache\Cache;
use Drupal\Core\Cache\RefinableCacheableDependencyInterface;
use Drupal\Core\Entity\Display\EntityViewDisplayInterface;
use Drupal\Core\Entity\EntityFormInterface;
use Drupal\Core\Entity\EntityInterface;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Render\Element;
use Drupal\Core\StringTranslation\TranslatableMarkup;
use Drupal\Core\Url;
use Drupal\group\Entity\GroupInterface;
use Drupal\group\Entity\GroupRelationshipInterface;
use Drupal\localgov_microsites_group\DomainSettingsHelper;
use Drupal\localgov_microsites_group\Entity\MicrositeGroup;
use Drupal\localgov_microsites_group\Entity\MicrositeGroupInterface;
use Drupal\localgov_microsites_group\Form\DomainGroupAdd;
use Drupal\localgov_microsites_group\Form\DomainGroupContentAdd;
use Drupal\localgov_microsites_group\Form\MicrositeDomainAdd;
use Drupal\localgov_microsites_group\GroupExtraFieldDisplay;
use Drupal\localgov_microsites_group\RolesHelper;
use Drupal\menu_link_content\MenuLinkContentInterface;
use Drupal\user\Entity\User;
use Drupal\views\Entity\View;
use Drupal\views\ViewExecutable;
use Symfony\Component\HttpFoundation\RedirectResponse;

/**
 * Implements hook_modules_installed().
 */
function localgov_microsites_group_modules_installed($modules, $is_syncing) {
  // Assume configuration is correct if the site is being config sync'd.
  if ($is_syncing) {
    return;
  }

  foreach ($modules as $module) {
    RolesHelper::assignModuleRoles($module);
  }
}

/**
 * Update default group views before initial creation.
 */
function localgov_microsites_group_view_presave(View $view) {
  if (!$view->isNew()) {
    return;
  }

  $module_path = \Drupal::service('extension.list.module')->getPath('localgov_microsites_group');
  if ($view->id() == 'group_nodes') {
    $group_node_view = Yaml::decode(file_get_contents($module_path . '/config/overrides/views.view.group_nodes.yml'));
    $displays = $view->get('display');
    $displays['default'] = $group_node_view['display']['default'];
    $displays['microsite_page'] = $group_node_view['display']['microsite_page'];
    $displays['microsite_dashboard_embed'] = $group_node_view['display']['microsite_dashboard_embed'];
    $view->set('display', $displays);
  }
  if ($view->id() == 'group_members') {
    $group_member_view = Yaml::decode(file_get_contents($module_path . '/config/overrides/views.view.group_members.yml'));
    $displays = $view->get('display');
    $displays['microsite_dashboard_embed'] = $group_member_view['display']['microsite_dashboard_embed'];
    $view->set('display', $displays);
  }
  if ($view->id() == 'my_invitations') {
    $my_invitations_view = Yaml::decode(file_get_contents($module_path . '/config/overrides/views.view.my_invitations.yml'));
    $displays = $view->get('display');
    $displays['default']['display_options']['arguments'] = $my_invitations_view['display']['default']['display_options']['arguments'];
    $displays['default']['display_options']['filters'] = $my_invitations_view['display']['default']['display_options']['filters'];
    $displays['default']['display_options']['query'] = $my_invitations_view['display']['default']['display_options']['query'];
    $view->set('display', $displays);
  }
  if ($view->id() == 'group_media') {
    $group_media_view = Yaml::decode(file_get_contents($module_path . '/config/overrides/views.view.group_media.yml'));
    $displays = $view->get('display');
    $displays['default'] = $group_media_view['display']['default'];
    $view->set('display', $displays);
  }
}

/**
 * Implements hook_entity_bundle_info_alter().
 */
function localgov_microsites_group_entity_bundle_info_alter(array &$bundles): void {
  if (isset($bundles['group'])) {
    // @todo loop over and check if is a domain group.
    $bundles['group']['microsite']['class'] = MicrositeGroup::class;
    $bundles['group']['microsite']['label'] = 'Microsite';
  }
}

/**
 * Implements hook_theme().
 */
function localgov_microsites_group_theme($existing, $type, $theme, $path) {
  return [
    'microsites_task_block' => [
      'variables' => [
        'links' => NULL,
      ],
    ],
  ];
}

/**
 * Implements hook_entity_type_build().
 */
function localgov_microsites_group_entity_type_build(array &$entity_types) {
  /** @var \Drupal\Core\Entity\EntityTypeInterface[] $entity_types */
  $entity_types['group']->setFormClass('new_domain', DomainGroupAdd::class);
  $entity_types['group_relationship']->setFormClass('new_domain', DomainGroupContentAdd::class);
  $entity_types['domain']->setFormClass('new_microsite', MicrositeDomainAdd::class);
}

/**
 * Implements hook_menu_local_actions_alter().
 */
function localgov_microsites_group_menu_local_actions_alter(array &$local_actions) {
  if (!empty($local_actions['group_relationship.group_node_create_page']) &&
    !in_array('view.group_nodes.microsite_page', $local_actions['group_relationship.group_node_create_page']['appears_on'])
  ) {
    $local_actions['group_relationship.group_node_create_page']['appears_on'][] = 'view.group_nodes.microsite_page';
  }
  if (!empty($local_actions['group_relationship.group_node_add_page']) &&
    !in_array('view.group_nodes.microsite_page', $local_actions['group_relationship.group_node_add_page']['appears_on'])
  ) {
    $local_actions['group_relationship.group_node_add_page']['appears_on'][] = 'view.group_nodes.microsite_page';
  }
}

/**
 * Implements hook_entity_extra_field_info().
 */
function localgov_microsites_group_entity_extra_field_info() {
  return \Drupal::service('class_resolver')
    ->getInstanceFromDefinition(GroupExtraFieldDisplay::class)
    ->entityExtraFieldInfo();
}

/**
 * Implements hook_ENTITY_TYPE_presave() for menu_link_content entities.
 */
function localgov_microsites_group_menu_link_content_presave(MenuLinkContentInterface $entity) {

  // Find active group.
  $group = localgov_microsites_group_get_by_context();
  if (is_null($group)) {
    $group = \Drupal::request()->attributes->get('group');
  }

  // Clear group cache so menu links are visible.
  if ($group) {
    Cache::invalidateTags(['group:' . $group->id()]);
  }
}

/**
 * Implements hook_ENTITY_TYPE_view().
 */
function localgov_microsites_group_view(array &$build, GroupInterface $group, EntityViewDisplayInterface $display, $view_mode) {
  return \Drupal::service('class_resolver')
    ->getInstanceFromDefinition(GroupExtraFieldDisplay::class)
    ->groupView($build, $group, $display, $view_mode);
}

/**
 * Implements hook_ENTITY_TYPE_insert() for group entities.
 */
function localgov_microsites_group_group_insert(GroupInterface $group) {
  if ($group->hasField('lgms_favicon')) {
    \Drupal::classResolver(DomainSettingsHelper::class)->faviconField($group, $group->lgms_favicon);
  }
}

/**
 * Implements hook_ENTITY_TYPE_update() for group entities.
 */
function localgov_microsites_group_group_update(GroupInterface $group) {
  if ($group->hasField('lgms_favicon')) {
    \Drupal::classResolver(DomainSettingsHelper::class)->faviconField($group, $group->lgms_favicon);
  }
}

/**
 * Implements hook_ENTITY_TYPE_insert() for group_relationship entities.
 */
function localgov_microsites_group_group_relationship_insert(GroupRelationshipInterface $entity) {

  // Add the Trusted Editor Role to group members.
  $type = $entity->get('type')->getValue();
  if (isset($type[0]['target_id']) && $type[0]['target_id'] == 'microsite-group_membership') {

    /** @var \Drupal\user\Entity\User $member */
    $member = $entity->getEntity();
    $member->addRole('microsites_trusted_editor');
    $member->save();
  }
}

/**
 * Implements hook_ENTITY_TYPE_delete() for group_relationship entities.
 */
function localgov_microsites_group_group_relationship_delete(GroupRelationshipInterface $entity) {

  // Remove the Trusted Editor Role when a user is no longer a member of groups.
  $type = $entity->get('type')->getValue();
  if (isset($type[0]['target_id']) && $type[0]['target_id'] == 'microsite-group_membership') {

    /** @var \Drupal\user\Entity\User $member */
    $member = $entity->getEntity();
    $groups = \Drupal::service('group.membership_loader')->loadByUser($member);
    if (empty($groups)) {
      $member->removeRole('microsites_trusted_editor');
      $member->save();
    }
  }
}

/**
 * Implements hook_form_FORM_ID_alter().
 */
function localgov_microsites_group_form_user_login_form_alter(&$form, FormStateInterface $form_state, $form_id) {
  $form['#submit'][] = 'localgov_microsites_group_user_login_form_submit';
}

/**
 * Implements hook_form_alter().
 */
function localgov_microsites_group_form_alter(&$form, FormStateInterface $form_state, $form_id) {

  if (isset($form['domain_path'])) {
    $domain_ids = Element::children($form['domain_path']);
    $active_domain = \Drupal::service('domain.negotiator')->getActiveDomain();
    $domain_access = [];
    foreach ($domain_ids as $id) {

      // Hide path auto settings for all but the active domain.
      if ($id !== $active_domain->id()) {
        $form['domain_path'][$id]['#access'] = FALSE;
      }
      else {
        $domain_access[] = ['target_id' => $id];
      }

      // Set domain path pathauto as on by default for new nodes.
      if (
        $form_state->getFormObject() instanceof EntityFormInterface &&
        $form_state->getFormObject()->getEntity()->isNew()
      ) {
        $form['domain_path'][$id]['pathauto']['#default_value'] = TRUE;
      }
    }

    // The Domain Path module does a lot of checks for domain access
    // configuration, but we use the Group module for access checks. Adding the
    // domain access field to the form ensures the Domain Path checks pass, but
    // is a bit of a hack as it would be better to fix whatever is going wrong
    // in the Domain Path module.
    if (!isset($form['field_domain_access'])) {
      $form['field_domain_access'] = [
        '#type' => 'value',
        '#value' => $domain_access,
      ];
    }
  }
}

/**
 * Implements hook_form_FORM_ID_alter().
 */
function localgov_microsites_group_form_media_library_add_form_upload_alter(&$form, FormStateInterface $form_state) {
  $form['#submit'][] = 'localgov_microsites_group_media_library_add_form_submit';
}

/**
 * Implements hook_form_FORM_ID_alter().
 */
function localgov_microsites_group_form_media_library_add_form_oembed_alter(&$form, FormStateInterface $form_state) {
  $form['#submit'][] = 'localgov_microsites_group_media_library_add_form_submit';
}

/**
 * Implements hook_form_FORM_ID_alter() for group-microsite-edit-form form.
 */
function localgov_microsites_group_form_group_microsite_edit_form_alter(&$form, FormStateInterface $form_state) {
  $form['actions']['submit']['#submit'][] = 'localgov_microsites_group_form_group_microsite_edit_form_submit';
}

/**
 * Redirect for user login form.
 */
function localgov_microsites_group_user_login_form_submit($form, FormStateInterface $form_state) {
  // Don't redirect if a different redirect has been set, by something other
  // than the user.module standard.
  if ($redirect = $form_state->getRedirect()) {
    if ($redirect instanceof Url && $redirect->getRouteName() != 'entity.user.canonical') {
      return;
    }
  }

  $domain_negotiator = \Drupal::service('domain.negotiator');
  $active = $domain_negotiator->getActiveDomain();
  if (empty($active)) {
    return;
  }
  // If active is default, control, domain. Redirect to admin.
  if ($active->isDefault()) {
    $form_state->setRedirect('system.admin');
  }
  // Login to a domain group.
  $group = localgov_microsites_group_get_by_context();
  if ($group) {
    $form_state->setRedirect('entity.group.canonical', ['group' => $group->id()]);
  }
}

/**
 * Additional submit handler to associate media with group when in domain group.
 */
function localgov_microsites_group_media_library_add_form_submit($form, FormStateInterface $form_state) {
  if (($group = localgov_microsites_group_get_by_context()) &&
    ($added_media = $form_state->get('media'))
  ) {
    \Drupal::service('groupmedia.attach_group')->assignMediaToGroups($added_media, [$group]);
  }
}

/**
 * Add submit handler for group edit form.
 */
function localgov_microsites_group_form_group_microsite_edit_form_submit($form, FormStateInterface $form_state) {
  $group = $form_state->getformObject()->getEntity();
  $form_state->setRedirect('entity.group.edit_form', ['group' => $group->id()]);
}

/**
 * Implements hook_menu_locol_tasks_alter().
 */
function localgov_microsites_group_menu_local_tasks_alter(&$data, $route_name, RefinableCacheableDependencyInterface &$cacheability) {
  if (($group = \Drupal::routeMatch()->getParameter('group')) &&
    $group instanceof MicrositeGroupInterface &&
    !empty($data['tabs'][0])
  ) {
    foreach ($data['tabs'][0] as $task_id => $link) {
      if ($custom_title = localgov_microsites_group_local_task_title($task_id)) {
        $data['tabs'][0][$task_id]['#link']['title'] = $custom_title;
        // Really just needs to be the bundle.
        // But should alreday be per group for user perms.
        $cacheability->addCacheableDependency($group);
      }

      if (localgov_microsites_group_local_task_hidden($task_id)) {
        $data['tabs'][0][$task_id]['#access'] = FALSE;
        $cacheability->addCacheableDependency($group);
      }
    }
  }
}

/**
 * Group local tasks to hide.
 */
function localgov_microsites_group_local_task_hidden($task_id) {
  return in_array($task_id,
    [
      'group.delete_form',
      'group.content',
      'group.version_history',
      'views_view:view.group_nodes.page_1',
    ]);
}

/**
 * Group local task titles to change.
 */
function localgov_microsites_group_local_task_title($task_id) {
  switch ($task_id) {

    case 'group.view':
      return t('Dashboard');

    case 'domain_group.group_domain_settings':
      return t('Site settings');

    case 'group.edit_form':
      return t('Site design');

    case 'entity.group_content_menu.collection':
      return t('Menus');
  }
}

/**
 * Group local task titles to change.
 */
function localgov_microsites_group_local_tasks_alter(&$local_tasks) {
  $local_tasks['group.view']['weight'] = -3;
  $local_tasks['views_view:view.group_nodes.page_1']['weight'] = 0;
  $local_tasks['views_view:view.group_invitations.page_1']['weight'] = 80;
  $local_tasks['views_view:view.group_members.page_1']['weight'] = 75;
  $local_tasks['group.edit_form']['weight'] = 170;
  $local_tasks['domain_group.group_domain_settings']['weight'] = 150;
}

/**
 * Implements hook_preprocess_page_title().
 */
function localgov_microsites_group_preprocess_page_title(&$variables) {

  // Change page title.
  if ($variables['title'] instanceof TranslatableMarkup && $variables['title']->__toString() == 'Group content menus') {
    $variables['title'] = t('Menus');
  }
}

/**
 * Controller callback that redirects group content canonical to content.
 *
 * @see Drupal\localgov_microsites_group\Routing\RouteSubscriber::alterRoutes
 */
function localgov_microsites_group_redirect_group_relationship(GroupRelationshipInterface $group_relationship) {
  $entity = $group_relationship->getEntity();
  return new RedirectResponse($entity->toUrl()->toString());
}

/**
 * Implements hook_preprocess_menu().
 */
function localgov_microsites_group_preprocess_menu(&$variables) {

  // Hide Microsite administration link if Drupal user 1.
  if (
    \Drupal::currentUser()->id() == 1 &&
    isset($variables['menu_name']) &&
    $variables['menu_name'] == 'admin' &&
    isset($variables['items']['localgov_microsites_group.microsite_admin'])
  ) {
    unset($variables['items']['localgov_microsites_group.microsite_admin']);
  }
}

/**
 * Implements hook_views_query_substitutions().
 */
function localgov_microsites_group_views_query_substitutions(ViewExecutable $view) {
  if ($view->id() == 'my_invitations') {
    return [
      '***GINVITE_USER_EMAIL***' => User::load($view->argument['entity_id']->getValue())->getEmail(),
    ];
  }
}

/**
 * Implements hook_entity_insert().
 */
function localgov_microsites_group_entity_insert(EntityInterface $entity) {
  // We can safely skip any route that is creating a group_relationship.
  $route = \Drupal::routeMatch();
  if (strpos($route->getRouteName(), 'entity.group_relationship') !== FALSE) {
    return;
  }
  if (in_array($route->getRouteName(), ['localgov_microsites_group_term_ui.taxononmy.add'])) {
    return;
  }

  // Working on one plugin per content type. If there is more than one
  // exceptions will have to be added.
  $plugin_id = '';
  if ($group = localgov_microsites_group_get_by_context()) {
    foreach ($group->getGroupType()->getInstalledPlugins() as $plugin) {
      if ($plugin->getRelationType()->getEntityTypeId() == $entity->getEntityTypeId() &&
        $plugin->getRelationType()->getEntityBundle() == $entity->bundle()) {
        $plugin_id = $plugin->getRelationTypeId();
        break;
      }
    }
  }

  // If it's in on a domain in a group, and not on a group_relationship path
  // add it to the group.
  if ($plugin_id !== '') {
    $group->addRelationship($entity, $plugin_id);
  }
}

/**
 * Implements hook_toolbar().
 *
 * - Adds a Control site indicator to the toolbar.
 */
function localgov_microsites_group_toolbar() {

  if (!Drupal::hasService('domain.negotiator')) {
    return;
  }

  $active_domain = Drupal::service('domain.negotiator')->getActiveDomain();
  if (empty($active_domain) || !$active_domain->get('is_default')) {
    return;
  }

  return [
    'localgov-microsites-group-toolbar-override' => [
      '#attached' => [
        'library' => 'localgov_microsites_group/control_site_toolbar_override',
      ],
    ],
    'localgov-microsites-group-control-site-indicator' => [
      '#type' => 'toolbar_item',
      '#weight' => 101,
      'tab'   => [
        '#type' => 'html_tag',
        '#tag'  => 'div',
        '#value' => t("Control site: Don't edit content"),
        '#attributes' => ['class' => ['toolbar-icon', 'toolbar-icon-warning']],
        '#attached' => [
          'library' => 'localgov_microsites_group/toolbar_icons',
        ],
      ],
    ],
  ];
}

/**
 * Implements hook_toolbar_alter().
 */
function localgov_microsites_group_toolbar_alter(&$items) {
  // The control site access provider gives admin mode there.
  // Decide to also hide from microsites, so the control site is the admin site
  // with our custom permissions.
  unset($items['group_sites']);
}

/**
 * Implements hook_localgov_microsites_roles_default().
 */
function localgov_microsites_group_localgov_microsites_roles_default() {
  return [
    'global' => [
      RolesHelper::MICROSITES_CONTROLLER_ROLE => [
        'assign microsites_controller role',
        'assign microsites_trusted_editor role',
      ],
    ],
  ];
}

/**
 * Get current group from the domain context.
 *
 * @see https://www.drupal.org/project/group_sites/issues/3437912
 *
 * @return \Drupal\group\Entity\GroupInterface|null
 *   The group from group_site context if there is one.
 */
function localgov_microsites_group_get_by_context(): ?GroupInterface {

  $context_id = \Drupal::service('config.factory')->get('group_sites.settings')->get('context_provider');
  if ($context_id === NULL) {
    return NULL;
  }

  $contexts = \Drupal::service('context.repository')->getRuntimeContexts([$context_id]);

  $context = count($contexts) ? reset($contexts) : NULL;

  if ($group = $context?->getContextValue()) {
    if (!$group instanceof GroupInterface) {
      throw new \InvalidArgumentException('Context value is not a Group entity.');
    }
    return $group;
  }

  return NULL;
}

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

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