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