feat: Perfis públicos de usuário via view mode 'public'

- Adiciona hook_entity_view_mode_alter() para redirecionar visitantes
  não-proprietários e não-admins para o view mode 'public' ao acessar
  /user/{uid}, exibindo apenas foto padrão, bio e redes sociais
- Simplifica hook_entity_field_access(): operação 'view' retorna neutral
  para não-proprietários (visibilidade controlada pelo view mode)
- Cria update_10005() que provisiona o view mode 'public', seu display
  e concede a permissão 'access user profiles' ao papel anonymous
- Replica a concessão de permissão em hook_install() para novas instalações
- Corrige TypeError em hook_entity_view_mode_alter(): $context aceita null
- Amplia hook_media_access() para permitir visualização de mídia publicada
  também para usuários anônimos

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-02-25 16:29:41 -03:00
parent 6266b42e0e
commit f58c8f90f4
2 changed files with 89 additions and 7 deletions

View File

@@ -164,6 +164,13 @@ function site_users_install() {
$view_display->save();
}
// Conceder permissão "access user profiles" ao papel anonymous.
$anonymous_role = \Drupal\user\Entity\Role::load('anonymous');
if ($anonymous_role && !$anonymous_role->hasPermission('access user profiles')) {
$anonymous_role->grantPermission('access user profiles');
$anonymous_role->save();
}
}
/**
@@ -288,6 +295,70 @@ function site_users_update_10002() {
return t('Social links field created successfully.');
}
/**
* Cria o view mode 'public' e seu display para perfis de usuário.
*/
function site_users_update_10005() {
// Criar o view mode 'public' se não existir.
$view_mode_storage = \Drupal::entityTypeManager()->getStorage('entity_view_mode');
if (!$view_mode_storage->load('user.public')) {
\Drupal\Core\Entity\Entity\EntityViewMode::create([
'id' => 'user.public',
'label' => 'Public',
'targetEntityType' => 'user',
])->save();
}
// Criar o view display 'public' se não existir.
$display_storage = \Drupal::entityTypeManager()->getStorage('entity_view_display');
if (!$display_storage->load('user.user.public')) {
$display = \Drupal\Core\Entity\Entity\EntityViewDisplay::create([
'targetEntityType' => 'user',
'bundle' => 'user',
'mode' => 'public',
'status' => TRUE,
]);
$display->setComponent('field_user_default_photo', [
'type' => 'entity_reference_entity_view',
'weight' => 5,
'label' => 'hidden',
'settings' => [
'view_mode' => 'default',
'link' => FALSE,
],
'region' => 'content',
]);
$display->setComponent('field_user_bio', [
'type' => 'text_default',
'weight' => 10,
'label' => 'hidden',
'settings' => [],
'region' => 'content',
]);
$display->setComponent('field_user_social_links', [
'type' => 'social_link_formatter',
'weight' => 15,
'label' => 'hidden',
'settings' => [],
'region' => 'content',
]);
$display->save();
}
// Conceder permissão "access user profiles" ao papel anonymous.
$anonymous_role = \Drupal\user\Entity\Role::load('anonymous');
if ($anonymous_role && !$anonymous_role->hasPermission('access user profiles')) {
$anonymous_role->grantPermission('access user profiles');
$anonymous_role->save();
}
return t("View mode 'public' para usuário criado com foto padrão, bio e redes sociais.");
}
/**
* Corrige mapeamentos LDAP com prov_events nulo na config ativa.
*/