Adiciona sub-módulo site_users_blog e melhora negociador de tema

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>
This commit is contained in:
2026-03-24 07:32:10 -03:00
parent 39de6a7493
commit d72f41de97
24 changed files with 931 additions and 2 deletions

View File

@@ -8,7 +8,7 @@ services:
site_users_microsite.theme_negotiator:
class: Drupal\site_users_microsite\Theme\MicrositeThemeNegotiator
arguments: ['@path_alias.manager']
arguments: ['@path_alias.manager', '@path.current']
tags:
- { name: theme_negotiator, priority: 100 }

View File

@@ -2,6 +2,7 @@
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;
@@ -14,6 +15,7 @@ class MicrositeThemeNegotiator implements ThemeNegotiatorInterface {
public function __construct(
private AliasManagerInterface $aliasManager,
private CurrentPathStack $currentPath,
) {}
/**
@@ -55,7 +57,7 @@ class MicrositeThemeNegotiator implements ThemeNegotiatorInterface {
}
}
// Nós cujo alias começa com /user/{uid}/ (ex.: structural_pages).
// 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) {
@@ -67,6 +69,12 @@ class MicrositeThemeNegotiator implements ThemeNegotiatorInterface {
}
}
// 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;
}