feat: Descoberta dinâmica de campos de usuário editáveis

hook_entity_field_access() passa a cobrir todos os FieldConfigInterface
do usuário, sem lista hardcoded. Campos de referência a mídia usam
lógica de fotos; demais usam lógica de perfil.

SiteUsersSettingsForm descobre campos dinamicamente via
entity_field.manager, listando todos os campos configuráveis do usuário
independente do módulo que os define.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-02-24 07:43:41 -03:00
parent 06e5bae039
commit 120d7b1858
3 changed files with 72 additions and 32 deletions

View File

@@ -12,6 +12,7 @@ use Drupal\Core\Field\FieldDefinitionInterface;
use Drupal\Core\Field\FieldItemListInterface;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Session\AccountInterface;
use Drupal\field\FieldConfigInterface;
use Drupal\media\MediaInterface;
use Drupal\user\UserInterface;
@@ -51,31 +52,20 @@ function site_users_entity_field_access($operation, FieldDefinitionInterface $fi
return AccessResult::neutral();
}
// Lista de campos controlados pelo módulo.
$profile_fields = [
'field_user_name',
'field_user_phone',
'field_user_social_links',
'field_user_bio',
];
$photo_fields = [
'field_user_photos',
'field_user_default_photo',
];
$field_name = $field_definition->getName();
// Verificar se é um campo de perfil.
if (in_array($field_name, $profile_fields)) {
return site_users_check_profile_field_access($operation, $account, $items, $field_name);
// Apenas campos configuráveis (não campos base como name, mail, status).
if (!($field_definition instanceof FieldConfigInterface)) {
return AccessResult::neutral();
}
// Verificar se é um campo de fotos.
if (in_array($field_name, $photo_fields)) {
$field_name = $field_definition->getName();
// Campos de referência a mídia usam lógica de fotos.
if ($field_definition->getType() === 'entity_reference'
&& $field_definition->getSetting('target_type') === 'media') {
return site_users_check_photo_field_access($operation, $account, $items, $field_name);
}
return AccessResult::neutral();
return site_users_check_profile_field_access($operation, $account, $items, $field_name);
}
/**