sites_group_overrides-1.x-dev/modules/sites_group_masquerade/src/FormDecorator/SitesGroupSitesFormDecorator.php

modules/sites_group_masquerade/src/FormDecorator/SitesGroupSitesFormDecorator.php
<?php

declare(strict_types=1);

namespace Drupal\sites_group_masquerade\FormDecorator;

use Drupal\Core\Url;
use Drupal\Core\Form\FormStateInterface;
use Drupal\form_decorator\FormDecoratorBase;
use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\sites_group\SitesGroupServiceInterface;
use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;

/**
 * @FormDecorator(hook="form_sites_group_sites_alter")
 */
class SitesGroupSitesFormDecorator extends FormDecoratorBase implements ContainerFactoryPluginInterface {

  /**
   * {@inheritdoc}
   */
  public static function create(ContainerInterface $container, $configuration, $plugin_id, $plugin_definition) {
    return new self($configuration, $plugin_id, $plugin_definition,
      $container->get('sites_group.service'),
      $container->get('entity_type.manager'),
    );
  }

  /**
   * {@inheritdoc}
   */
  public function __construct(
    array $configuration,
    $plugin_id,
    $plugin_definition,
    protected SitesGroupServiceInterface $sitesGroupService,
    protected EntityTypeManagerInterface $entityTypeManager,
  ) {
    parent::__construct($configuration, $plugin_id, $plugin_definition);
  }

  /**
   * {@inheritdoc}
   */
  public function buildForm(array $form, FormStateInterface $form_state, ...$args) {
    // Masquerade for site before editing site content.
    $form = $this->inner->buildForm($form, $form_state, ...$args);
    $entity = $this->getEntity();

    foreach ($this->sitesGroupService->getAvailableGroupSiteTypesByEntity($entity) as $group_type_id => $group_type) {
      if (!isset($form[$group_type_id]['groups']['#options'])) {
        continue;
      }
      foreach ($form[$group_type_id]['groups']['#options'] as $group_id  => &$option) {
        $group = $this->entityTypeManager->getStorage('group')->load($group_id);
        $site = $this->sitesGroupService->getSiteForGroup($group);
        if (!isset($option['operations']['data']['#links'])) {
          continue;
        }
        foreach ($option['operations']['data']['#links'] as &$link) {
          $prefix = '/';
          if ($language = $link['url']->getOption('language')) {
            $prefix .= $language->getId() . '/';
          }

          $link['url'] = Url::fromRoute(
            'sites_masquerade.switch',
            ['site_id' => $site->getPluginId()],
            ['query' => ['destination' => $prefix . $link['url']->getInternalPath()]]
          );
          $link['title'] = $this->t('@title on @site', ['@title' => $link['title'], '@site' => $site->label()]);
        }
      }
    }


    return $form;
  }

}

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

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