mirror of
https://gitlab.unicamp.br/infimecc_drupal11_modules/site_users.git
synced 2026-05-03 10:20:41 -03:00
Fotos LDAP:
- Ignora sync quando conta ainda não tem UID (evitava URI compartilhada)
- Filtra fotos abaixo do tamanho mínimo configurável (padrão 10 KB)
- Adiciona campo ldap_min_photo_size nas configurações e schema
- Update 10010: remove fotos placeholder já existentes
- Update 10011: remove mídias com URI ldap_photo_.{ext} sem UID
Bloco de cabeçalho do microsite:
- Exibe departamento abaixo do nome, sem label, com link para a entidade
- Exibe telefone de trabalho (work_phone) no lugar de phone (restrito)
Página de perfil:
- Título fixo "Perfil de @name" via callback profileTitle()
- Exclui rota profile da substituição de título pelo nó homepage
Subpáginas com URL amigável:
- Adiciona MicrositeSubpagePathProcessor (inbound + outbound)
- Inbound: /user/{username}/{subpage} → /user/{uid}/{subpage}
- Outbound: /user/{uid}/{subpage} → /user/{username}/{subpage}
- Busca alias em todos os idiomas para contornar limitação do AliasManager
Tema do microsite em rotas externas:
- MicrositeThemeNegotiator cobre rotas com parâmetro user sob /user/{user}/
- Cobre nós do structural_pages cujo alias começa com /user/{uid}/
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
155 lines
4.2 KiB
Plaintext
155 lines
4.2 KiB
Plaintext
<?php
|
|
|
|
/**
|
|
* @file
|
|
* Sub-módulo de micro-site pessoal de usuário.
|
|
*/
|
|
|
|
use Drupal\user\UserInterface;
|
|
|
|
/**
|
|
* Implements hook_theme().
|
|
*/
|
|
function site_users_microsite_theme(): array {
|
|
return [
|
|
'microsite_header_block' => [
|
|
'variables' => [
|
|
'photo_url' => NULL,
|
|
'photo_alt' => '',
|
|
'name' => NULL,
|
|
'bio' => NULL,
|
|
'email' => NULL,
|
|
'homepage' => NULL,
|
|
'lattes_id' => NULL,
|
|
'orcid_id' => NULL,
|
|
'mathscinet_id' => NULL,
|
|
'department' => NULL,
|
|
'department_url' => NULL,
|
|
'work_phone' => NULL,
|
|
],
|
|
],
|
|
];
|
|
}
|
|
|
|
/**
|
|
* Implements hook_preprocess_structural_pages_menu().
|
|
*
|
|
* Remove da árvore de navegação o nó configurado como homepage do microsite,
|
|
* já que esse conteúdo é exibido diretamente em /user/{id}.
|
|
*/
|
|
function site_users_microsite_preprocess_structural_pages_menu(array &$variables): void {
|
|
$user = site_users_get_microsite_user();
|
|
if ($user === NULL) {
|
|
return;
|
|
}
|
|
|
|
$homepage_nid = \Drupal::service('user.data')
|
|
->get('site_users_microsite', $user->id(), 'homepage_nid');
|
|
if (!$homepage_nid) {
|
|
return;
|
|
}
|
|
|
|
_site_users_microsite_remove_homepage_from_tree($variables['tree'], (int) $homepage_nid);
|
|
}
|
|
|
|
/**
|
|
* Remove recursivamente o nó homepage da árvore do structural_pages_menu.
|
|
*/
|
|
function _site_users_microsite_remove_homepage_from_tree(array &$items, int $homepage_nid): void {
|
|
foreach ($items as $key => $item) {
|
|
if ((int) ($item['id'] ?? 0) === $homepage_nid) {
|
|
unset($items[$key]);
|
|
continue;
|
|
}
|
|
if (!empty($item['children'])) {
|
|
_site_users_microsite_remove_homepage_from_tree($items[$key]['children'], $homepage_nid);
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Implements hook_preprocess_block().
|
|
*
|
|
* Substitui o título do bloco "Título da Página" pelo título do nó homepage
|
|
* quando o usuário tiver ativado essa opção nas configurações do microsite.
|
|
* Sem nó homepage configurado (ou no fallback), mantém o comportamento padrão.
|
|
*/
|
|
function site_users_microsite_preprocess_block(&$variables): void {
|
|
if ($variables['plugin_id'] !== 'page_title_block') {
|
|
return;
|
|
}
|
|
|
|
$route_match = \Drupal::routeMatch();
|
|
$route_name = $route_match->getRouteName() ?? '';
|
|
|
|
// Rotas com título próprio não devem ser sobrescritas.
|
|
$excluded = [
|
|
'site_users_microsite.profile',
|
|
'site_users_microsite.settings',
|
|
'site_users_microsite.user_config',
|
|
];
|
|
|
|
$is_microsite = $route_name === 'entity.user.canonical'
|
|
|| str_starts_with($route_name, 'site_users_microsite.');
|
|
|
|
if (!$is_microsite || in_array($route_name, $excluded)) {
|
|
return;
|
|
}
|
|
|
|
$user = $route_match->getParameter('user');
|
|
if (!($user instanceof UserInterface)) {
|
|
return;
|
|
}
|
|
|
|
$userData = \Drupal::service('user.data');
|
|
|
|
if (!$userData->get('site_users_microsite', $user->id(), 'use_homepage_title')) {
|
|
return;
|
|
}
|
|
|
|
$homepage_nid = $userData->get('site_users_microsite', $user->id(), 'homepage_nid');
|
|
if (!$homepage_nid) {
|
|
return;
|
|
}
|
|
|
|
$node = \Drupal::entityTypeManager()->getStorage('node')->load($homepage_nid);
|
|
if ($node && $node->isPublished() && $node->access('view')) {
|
|
$variables['content']['#title'] = $node->label();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Implements hook_preprocess_page().
|
|
*
|
|
* Disponibiliza variáveis do usuário do micro-site para o tema.
|
|
*/
|
|
function site_users_microsite_preprocess_page(array &$variables): void {
|
|
$route_match = \Drupal::routeMatch();
|
|
$route_name = $route_match->getRouteName();
|
|
|
|
$is_microsite = $route_name === 'entity.user.canonical'
|
|
|| str_starts_with($route_name, 'site_users_microsite.');
|
|
|
|
if (!$is_microsite) {
|
|
return;
|
|
}
|
|
|
|
$user = $route_match->getParameter('user');
|
|
if (!($user instanceof UserInterface)) {
|
|
return;
|
|
}
|
|
|
|
$variables['microsite_user'] = $user;
|
|
$variables['microsite_user_name'] = $user->getDisplayName();
|
|
$variables['microsite_user_roles'] = $user->getRoles(TRUE);
|
|
|
|
$photo = site_users_get_default_photo($user);
|
|
if ($photo) {
|
|
$render = \Drupal::entityTypeManager()
|
|
->getViewBuilder('media')
|
|
->view($photo, 'thumbnail');
|
|
$variables['microsite_user_photo'] = \Drupal::service('renderer')
|
|
->renderInIsolation($render);
|
|
}
|
|
}
|