mirror of
https://gitlab.unicamp.br/infimecc_drupal11_modules/site_users.git
synced 2026-05-03 18:00:40 -03:00
Sub-módulo site_users_blog:
- Tipo de conteúdo blog_post (título, corpo, imagem, assuntos)
- Vocabulário blog_tags para categorias
- Listagem em /user/{uid}/blog via Views com filtro contextual por autor
- Padrão Pathauto: user/[node:author:uid]/blog/[node:title]
- hook_node_presave: preenche field_site_section com o autor
- hook_node_access: restringe criação às roles configuradas
- hook_preprocess_structural_pages_menu: injeta item "Blog" quando
usuário tem posts publicados
- Plugin BlogUserHandler: resolve usuário ancestral para rotas de blog
(post individual e listagem Views)
- Link "Post de blog" no menu "Adicionar" da conta
- Página de configuração de roles permitidas
- Update 10001: adiciona field_site_section a posts existentes
MicrositeThemeNegotiator:
- Injeta path.current para cobrir rotas sem parâmetro 'user' (ex.: Views)
- Qualquer path /user/{uid}/... recebe o tema do microsite
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
89 lines
2.5 KiB
PHP
89 lines
2.5 KiB
PHP
<?php
|
|
|
|
namespace Drupal\site_users_microsite\Theme;
|
|
|
|
use Drupal\Core\Path\CurrentPathStack;
|
|
use Drupal\Core\Routing\RouteMatchInterface;
|
|
use Drupal\Core\Theme\ThemeNegotiatorInterface;
|
|
use Drupal\path_alias\AliasManagerInterface;
|
|
use Drupal\user\UserInterface;
|
|
|
|
/**
|
|
* Aplica o tema microsite nas rotas de perfil de usuário e do micro-site.
|
|
*/
|
|
class MicrositeThemeNegotiator implements ThemeNegotiatorInterface {
|
|
|
|
public function __construct(
|
|
private AliasManagerInterface $aliasManager,
|
|
private CurrentPathStack $currentPath,
|
|
) {}
|
|
|
|
/**
|
|
* {@inheritdoc}
|
|
*/
|
|
public function applies(RouteMatchInterface $route_match): bool {
|
|
$route_name = $route_match->getRouteName() ?? '';
|
|
|
|
// Rotas administrativas e de edição nunca recebem o tema do microsite.
|
|
$excluded = [
|
|
'site_users_microsite.settings',
|
|
'site_users_microsite.user_config',
|
|
'site_users_microsite.my_config',
|
|
];
|
|
if (in_array($route_name, $excluded, TRUE)) {
|
|
return FALSE;
|
|
}
|
|
foreach (['entity.user.edit_', 'entity.user.cancel', 'user.admin'] as $prefix) {
|
|
if (str_starts_with($route_name, $prefix)) {
|
|
return FALSE;
|
|
}
|
|
}
|
|
|
|
// Rota canônica e rotas próprias do microsite.
|
|
if ($route_name === 'entity.user.canonical') {
|
|
return TRUE;
|
|
}
|
|
if (str_starts_with($route_name, 'site_users_microsite.')) {
|
|
return TRUE;
|
|
}
|
|
|
|
// Qualquer rota com parâmetro 'user' (entidade) sob /user/{user}/.
|
|
$user = $route_match->getParameter('user');
|
|
if ($user instanceof UserInterface) {
|
|
$route = $route_match->getRouteObject();
|
|
$path = $route ? $route->getPath() : '';
|
|
if (str_starts_with($path, '/user/{user}/')) {
|
|
return TRUE;
|
|
}
|
|
}
|
|
|
|
// Nós cujo alias começa com /user/{uid}/ (ex.: structural_pages, blog).
|
|
if ($route_name === 'entity.node.canonical') {
|
|
$node = $route_match->getParameter('node');
|
|
if ($node) {
|
|
$nid = is_object($node) ? $node->id() : $node;
|
|
$alias = $this->aliasManager->getAliasByPath('/node/' . $nid);
|
|
if (preg_match('#^/user/\d+/#', $alias)) {
|
|
return TRUE;
|
|
}
|
|
}
|
|
}
|
|
|
|
// Qualquer rota cujo path atual (já processado) seja /user/{uid}/...
|
|
// Cobre Views e outras rotas que não expõem parâmetro 'user' na rota.
|
|
if (preg_match('#^/user/\d+/#', $this->currentPath->getPath())) {
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
/**
|
|
* {@inheritdoc}
|
|
*/
|
|
public function determineActiveTheme(RouteMatchInterface $route_match): ?string {
|
|
return 'site_users_microsite_theme';
|
|
}
|
|
|
|
}
|