Adiciona menu 'Adicionar' configurável no menu da conta do usuário

Item pai 'Adicionar' no menu account com subitens derivados dinamicamente
a partir de site_users.settings:add_content_links. O pai fica oculto quando
o usuário não tem acesso a nenhum dos routes configurados.

- Rota site_users.add_content com _custom_access via AddContentAccessCheck
- hook_menu_links_discovered_alter() gera os subitens com IDs estáveis
- Formulário de settings com tabela editável (label, rota, parâmetro, peso)
- CSS do microsite atualizado com dropdown ao hover/focus-within

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-19 14:28:21 -03:00
parent 0ce327026d
commit c96268e09d
12 changed files with 383 additions and 0 deletions

View File

@@ -11,6 +11,7 @@ use Drupal\Core\Entity\Display\EntityViewDisplayInterface;
use Drupal\Core\Field\FieldDefinitionInterface;
use Drupal\Core\Field\FieldItemListInterface;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Menu\MenuLinkDefault;
use Drupal\Core\Session\AccountInterface;
use Drupal\Core\Url;
use Drupal\field\FieldConfigInterface;
@@ -604,3 +605,44 @@ function site_users_get_default_photo(UserInterface $user): ?MediaInterface {
return NULL;
}
/**
* Implements hook_menu_links_discovered_alter().
*
* Adiciona dinamicamente os subitens do menu "Adicionar" configurados em
* site_users.settings:add_content_links.
*/
function site_users_menu_links_discovered_alter(array &$links): void {
$items = \Drupal::config('site_users.settings')->get('add_content_links') ?? [];
foreach ($items as $item) {
if (empty($item['route_name']) || empty($item['label'])) {
continue;
}
// ID estável derivado da rota e dos parâmetros.
$parts = [preg_replace('/[^a-z0-9]/', '_', strtolower($item['route_name']))];
foreach ($item['route_parameters'] ?? [] as $value) {
$parts[] = preg_replace('/[^a-z0-9]/', '_', strtolower((string) $value));
}
$id = 'site_users.add_content_child.' . implode('_', $parts);
$links[$id] = [
'id' => $id,
'title' => $item['label'],
'route_name' => $item['route_name'],
'route_parameters' => $item['route_parameters'] ?? [],
'menu_name' => 'account',
'parent' => 'site_users.add_content',
'weight' => (int) ($item['weight'] ?? 0),
'provider' => 'site_users',
'class' => MenuLinkDefault::class,
'form_class' => 'Drupal\Core\Menu\Form\MenuLinkDefaultForm',
'metadata' => [],
'options' => [],
'expanded' => FALSE,
'enabled' => TRUE,
'discovered' => TRUE,
];
}
}