Estende tema do microsite para todas as rotas /user/{id}/...

O negociador de tema passa a verificar o alias do caminho atual em vez
de checar nomes de rota específicos, cobrindo páginas de qualquer módulo
acessadas via alias /user/{id}/.... Adiciona site_users_get_microsite_user()
como helper reutilizável para obter o usuário do microsite a partir da rota
ou do alias, e atualiza MicrositeHeaderBlock e site_tools_share_links para
usá-lo.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-21 09:17:51 -03:00
parent c96268e09d
commit f4d6c49312
3 changed files with 42 additions and 4 deletions

View File

@@ -81,6 +81,10 @@ class MicrositeHeaderBlock extends BlockBase implements ContainerFactoryPluginIn
/**
* Retorna o usuário da rota atual.
*
* Primeiro tenta o parâmetro 'user' da rota (rotas próprias do microsite).
* Caso não exista (ex: rota entity.node.canonical acessada via alias
* /user/{id}/...), extrai o ID do alias do caminho atual.
*/
protected function getUser(): ?UserInterface {
$user = $this->routeMatch->getParameter('user');
@@ -90,6 +94,11 @@ class MicrositeHeaderBlock extends BlockBase implements ContainerFactoryPluginIn
if (is_numeric($user)) {
return $this->entityTypeManager->getStorage('user')->load($user);
}
if (function_exists('site_users_get_microsite_user')) {
return site_users_get_microsite_user();
}
return NULL;
}

View File

@@ -16,9 +16,14 @@ class MicrositeThemeNegotiator implements ThemeNegotiatorInterface {
public function applies(RouteMatchInterface $route_match): bool {
$route_name = $route_match->getRouteName();
$excluded = ['site_users_microsite.settings'];
return ($route_name === 'entity.user.canonical'
|| str_starts_with($route_name, 'site_users_microsite.'))
&& !in_array($route_name, $excluded);
if (in_array($route_name, $excluded)) {
return FALSE;
}
$current_path = \Drupal::service('path.current')->getPath();
$alias = \Drupal::service('path_alias.manager')->getAliasByPath($current_path);
return (bool) preg_match('#^/user/\d+(/|$)#', $alias);
}
/**

View File

@@ -530,11 +530,35 @@ function site_users_user_format_name_alter(&$name, $account) {
}
}
/**
* Retorna o usuário dono do microsite para a requisição atual.
*
* Tenta o parâmetro 'user' da rota (rotas próprias do microsite) e, se não
* encontrar, extrai o ID do alias do caminho atual (ex: /user/229/projetos).
*/
function site_users_get_microsite_user(): ?UserInterface {
$user = \Drupal::routeMatch()->getParameter('user');
if ($user instanceof UserInterface) {
return $user;
}
if (is_numeric($user)) {
return \Drupal::entityTypeManager()->getStorage('user')->load($user);
}
$alias = \Drupal::service('path_alias.manager')
->getAliasByPath(\Drupal::service('path.current')->getPath());
if (preg_match('#^/user/(\d+)(/|$)#', $alias, $matches)) {
return \Drupal::entityTypeManager()->getStorage('user')->load($matches[1]);
}
return NULL;
}
/**
* Implements hook_site_tools_share_links().
*/
function site_users_site_tools_share_links(): array {
$user = \Drupal::routeMatch()->getParameter('user');
$user = site_users_get_microsite_user();
if (!($user instanceof UserInterface)) {
return [];